自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

飞翔de刺猬

专注于嵌入式linux软件开发--智能硬件方向

  • 博客(259)
  • 资源 (10)
  • 收藏
  • 关注

原创 我的Linux名片

面试官: “你好,先自我介绍一下吧。”程序猿:“你好,我是一名嵌入式Linux软件工程师,具有丰富的inux、嵌入式系统、Android相关的开发经验,擅长C/C++,熟练使用GNU/GCC、GDB、VIM等开发工具,这是我的名片!”面试官:“哇,我还是第一次见到这样别致的名片,酷!,把电路板做成名片,不错。它能跑起来吗?”程序猿:“别小看它,它不仅能跑,而且还是Linux系统,最新版本的内核哦,里面还集成了”...

2021-10-10 20:24:01 12826 10

原创 我的创作纪念日

1.虽然我的内容产量不高,但每次Blog都是来源自切身感受,与自己当前所做的事情密切相关的。未来,我会继续在Linux这篇热土深耕,记录成长中的点滴,与CSDN共同成长。2. 对于如何平衡工作和写作,我认为,时间就像海绵里的水,挤挤总是有的。1.最有成就感的代码是一行bash脚本,功能是删掉压缩包解压后的文件。3.最精彩的一篇blog,我认为是。2.阅读量最高的一篇blog是。,总的阅读量接近10w。

2023-11-12 17:05:25 283

原创 Ubuntu22.04下安装Ros2-Humble

ROS2的Humble版本为TLS版本,维护日期截止到2027年(可以参考可以看到,其支持Linux/MacOS/Windows等多个系统,针对于Linux系统,对应的系统版本是(Ubuntu 22.04,Jammy),本文章记录ROS2 Humble Debian Packages安装包在Ubuntu 22.04下的安装过程,本文参考了,记录了过程中出现的问题。

2023-07-18 11:41:11 1969

原创 Ubuntu20.04升级到Ubuntu 22.04

升级完成后,重启系统reboot重启成功之后,查看系统的当前版本最新版本应该是20.04.6,如下图所示。

2023-07-17 17:11:02 6376 2

原创 Flash技术概述

Flash全称flash memory,也就是平时说的“闪存”。经常被用在嵌入式领域,比如手机、平台、电脑主板等等。绝大部分的U盘、SDCard、MMC卡、TF卡等移动存储设备也都是使用 Flash 作为存储介质Flash Memory主要可以分为NOR Flash、NAND Flash、eMMC、UFS几种类型。NOR flash支持片上执行,可以在上面直接运行代码,软件驱动比NAND简单,一般小容量的用NOR型,因为小容量NOR读取速度快。

2023-03-23 17:52:40 578 1

原创 搭建ESP32-Arduino开发环境(离线一键安装超级好用)

首先需要声明的是,如果按照来搭建开发环境的话,你可能会经历“ESP32-Arduino从搭建环境到到放弃”,因为这套开发环境的源码都是在Github上的,下载速度巨慢,可能需要几天,最后还不一定成功,所以,对于国内的朋友(能FanQiang的不在内:)),为了节省时间,最好还是选择离线安装比较好。,它提供的ESP32-Arduino离线安装包,按照教程可以实现ESP32-Arduino的一键安装,节省了很多的时间,超级好用。另外该网站提供了很多其他的工具的下载,值得推荐!!

2023-03-21 10:45:49 4065

原创 记录一次linux应用内存调试过程(续)

本文所描述的内存调试过程,主要是记录最近项目里面遇到的一个内存使用问题。过程大概是,测试软件稳定性时,发现系统内存随着时间的变化,会不断的增长,并且不会恢复。由于怀疑是,应用程序出现了内存泄漏,所以开启了针对于内存泄漏的分析、调试,过程中使用了程序功能模块隔离法、valgrind工具、编写单独程序测试(怀疑是mosquitto存在问题)等方法,最后发现没有内存泄漏的地方。

2023-03-09 16:15:13 2186

原创 Asan基本原理及试用

Asan是Google专门为C/C++开发的内存错误探测工具,作为标配集成到了GCC 4.8及之后的版本,可以探测大多数内存问题,作为C/C++程序猿深入内存管理各种问题的迫害,人生苦短,快用Asan

2023-03-09 13:59:59 4955 2

原创 记录一次linux应用内存调试过程

记录一次不成功的linux应用内存泄漏调试过程,虽然最终没有找到问题的根源,但是,文中提到的调试过程,还是很有借鉴意义的

2023-03-02 17:29:15 467

原创 同一网卡如何配置多个IP地址

而且,两种用途对IP地址的要求不同:当做调试口时,IP地址是固定的;当做业务传通信口时,IP地址是动态分配的。配置,就是给同一个网卡设置不同名字,比如,对于eth0,我们可以设置别名:eth0:0、eth0:1、eth0:2等。平时在做嵌入式linux设备开发时,不知道你是否遇到过这种需求:设备本身只有一个以太网口,但需求是,interfaces文件里,配置eth1为dhcp方式获取IP,eth1:0为静态IP。ifconfig可以配置任何网卡的ip地址,比如以太网、wifi、4G modem等。

2023-01-09 17:11:38 6434

原创 基于阿里云的SSH反向代理环境搭建

本篇文章介绍基于阿里云实现SSH反向代理功能

2022-12-08 10:02:41 1056

原创 记一次坎坷的调试|Mosquitto通过TLS连接EMQ时阻塞的问题

最近两天在调试一个关于嵌入式Linux系统环境时,在系统开机之后,Mosquitto通过tls连接MQTT服务器(EMQ)时,创建MQTT连接总是阻塞的问题,现记录一下调试过程及解决问题的步骤。先说下开发调试环境:linux系统开机之后,出现shell登录提示符之后,调用mosquitto_connect和EMQ建立基于TLS的连接,mosquitto_connect调用之后阻塞,大约90秒,该函数调用才会返回,并且报错。之后,mosquitto会触发重连机制,再次连接EMQ服务器,连接成功。这时,如果重新

2022-08-01 21:48:55 2257 15

原创 C语言基础|你真的了解snprintf吗?

作为一名C语言开发者,肯定用过snprintf函数,但是,你真的了解snprintf吗?

2022-06-13 22:17:59 2998 1

原创 嵌入式Linux开发|pinctrl子系统

众所周知,每颗SoC都会有很多的pin,除了具有特殊作用的,比如电源、地等pin,其他的pin一般都会**“身兼数职”**,比如,一个pin既可以当做GPIO来使用,也可以用作UART的TX,又或者是SPI的MOSI;而且,这些pin往往具有不同的能力,比如,上拉、下拉、不同的驱动能力等等。pinctrl子系统就是用来完成上述功能而设计的,pinctrl对下管理SoC所有的pin,对上提供配置SoC所有pin的接口。通常,再将linux系统移植到一款新SoC上时,其中一项工作,就是将所有pin注册到pinc

2022-06-08 22:41:13 1576

原创 面向C语言编程|数据类型“多态”

多态是面向对象编程中的一个概念,表示一个对象,比如一个接口,在不同的情况下,有不同的表现形式。比如,对于人这个对象,其都会有吃饭,这个接口。但是对于不同的”人,其吃饭所用的工具可能不尽相同,比如,中国人通常用筷子吃,外国人通常用的是刀叉,当然,对于中国小孩,也可能用的是勺子,😃 。C语言中基本数据类型,含义十分的明确,32bit系统来说,char就是一个字节,short就是两个字节,int和long也有类似的定义。那么,如何用C语言实现,同一个数据类型表达多个含义呢?我们其实可以使用union来实现,一定

2022-05-26 22:26:29 325

原创 嵌入式Linux开发|点亮那颗LED灯

做嵌入式开发离不开LED,小小的LED可以作为系统状态指示,为调试带来方便。下面是典型的LED控制电路:可以看到,通过控制AA27和AF12这两个引脚达到控制LED1和LED2这两个LED。如果是单片机开发,控制一颗LED的步骤比较的简单、直接,直接配置GPIO功能,输出高、底电平就可以控制LED了。相对来说,在Linux系统下,想要控制一颗LED,就比较费周折了,有下面几种方式:通过gpiolib子系统控制IO来驱动LED。通过sys子系统控制IO来驱动LED,即通过/sys/class/g

2022-05-15 16:50:26 2595

原创 USB的那点事 |一、 自我介绍

前世今生USB,全称Universal Serial Bus,即,通用串行总线,出生于1974年,双十一 >:,那个年代,PC时代降临,互联网时代还未到来,个人计算机江湖风起云涌,各种设备如雨后春笋般涌现,各种接口也是千奇百怪,各式各样的串口、并口盛行,为了能够统一PC接口,简化产品设计,USB诞生了。凭借其无可挑剔的设计和优异的性能,其迅速占领了PC接口市场,成为了PC使用最为广泛的接口。性格观其名,就可知USB的性格特点,那就是:开放(Universal)、单纯(Serial)、大度(Bus

2022-04-12 22:53:05 831

原创 关于USB的那点糗事

最近,在做一款产品,里面用到了一个USB3.0接口,在做产品功能设计的时候,由于对USB的认识存在误区,导致了设计出现了误会,现记录一下,防止以后再发生类似的笑话 ):误区一:认为USB3.0/2.0是两个独立的接口我们使用的是一款5G模组,下面是产品手册上关于USB接口的描述:注意,红框标注的部分。起初,我只注意到了,该USB接口符合USB2.0和USB3.0规范,就天真的认为,其为两个独立的接口,一个是USB2.0,另一个是USB3.0,所以,设计了如下的USB设备架构:可以看到,USB2

2022-04-10 23:00:06 1169

原创 CMake之Option使用简介

CMake中的option用于控制编译流程,相当于C语言中的宏条件编译。基本格式options基本格式如下:option(<variable> "<help_text>" [value])variable:定义选项名称help_text:说明选项的含义value:定义选项默认状态,一般是OFF或者ON,除去ON之外,其他所有值都为认为是OFF。示例示例项目结构如下:build:工程编译目录CMakeList.txt:cmake主编译脚本sub:子工程目

2022-03-17 17:25:22 30753 8

原创 保姆级教程|VMware安装Ubuntu20.04(系统安装+网络配置+open-vm-tools安装+国内软件源更新)

当前工作使用的Ubuntu版本是16.06 TLS,官方对这个版本已经在2021年停止维护,这对于更新或者安装软件造成很大的阻碍,所以,决定搭建一台Ubuntu 20.04TLS虚拟机,下面奉上整个安装过程。获取Ubuntu 20.04这里可以下载Ubuntu 20.04 TLS Desktop镜像。VMware这里使用的VMware版本为VMware® Workstation 15 Pro,VMware版本不太重要,只要不是太古老的就可以啦。安装Ubuntu 20.04创建虚拟机这里选择

2022-03-10 21:17:25 24822 11

原创 Linux命令之美|linux使用tar误解压之后,如何删除解压后的文件

可否有这样的经历,在工作环境下,解压了一个超大、文件超多的压缩包,比如,big-bag.tar.gz,解压的一瞬间,你猛然发现,忘记新建一个文件夹了,解压后的文件和原有的文件、文件夹混在一起了:(,是不是很崩溃!可以,不要忘记,没有Linux命令接解决不了的问题,一个不行,用两个。先说解决命令:$ tar -jxvf big-bag.tar.gz #这是手残解压的命令$ tar -tf big-bag.tar.gz | xargs rm -rf #这是删除解压后的新文件的命令没错,就是简单!

2022-03-09 17:02:19 6155 2

原创 ARM平台交叉编译|MQTT-mosquitto

mosquitto编译方式分为两种:cmake和make。windows、Mac平台使用cmake编译方式,其他平台,包括linux平台,直接使用make进行编译。windows7下编译mosquitto详细介绍了windows7环境下编译mosquitto的步骤。本文所介绍的内容是关使用于某种ARM平台下的mosquitto的编译步骤。编译环境宿主机:Ubuntu 16.04Host: ARM,Cortex-A55交叉编译器:aarch64-linux-gnu-gcc, 7.2.1 20171

2022-03-08 10:13:32 3089

原创 ARM平台交叉编译|OpenSSL

编译步骤准备编译平台OS:Ubunti16.04交叉编译器Compiler:aarch64-linux-gnu-gccOpenssl:openssl-3.0.1编译配置./Configure --prefix=/dir/to/install --cross-compile-prefix=aarch64-linux-gnu- -no-asm sharedprefix:openssl安装目录–cross-compile-prefix:交叉编译器前缀no-asm:不使用汇编代码。由于是

2022-03-07 17:13:17 3750 1

原创 极简系列|日志模块-clog

日志作为应用程序调试和维护的基本手段被广泛使用,像是谷歌的glog,java领域的log4j,它们都是功能强大的大型日志中间件。可是,在特殊的领域,比如是嵌入式开发领域,由于资源的限制,可能不能直接应用这些“庞大大物”,这里要介绍的clog,十分适合资源受限的嵌入式系统,其由C语言开发,整个代码不到400行,但它的功能可以满足基本的开发需求。clog基本属性:支持日志级别设置(DEBUG|INFO|ERROR|FATAL)支持多线程,是线程安全的。日志输出路径可配置。单个日志文件输出,并且日志是

2022-02-07 15:09:53 1133

原创 极简系列|Makefile工程框架(可执行程序、静态库、动态库)

作为一名Linux系统下的开发人员,平时工作中会经常用Makefile来构建应用开发框架。如果是特别简单的应用,几行makefile代码就可以搞定。但对于稍微上点规模的应用,其可能会包含若干个模块,复杂点的还会链接其他的动态库,这时的makefile可能就不是几行代码就能搞定的了。这时就需要用到一些比较复杂的makefile语法来构建整个应用工程。如果每次都要从头编写makefile,可能会由于某个语法忘记了,耽误开发的效率。本文要介绍的MakeExp,就是一种用于构建中等规模的Linux应用程序时,ma

2022-02-06 22:09:34 1711

原创 windows7下编译mosquitto

准备工作mosquittomosquitto源码下载地址,目前使用的是最新版本2.0.14。windowwindows系统为win7 sp1版本,其他版本应该也也可以。Visual StudioVS版本为2010,其他版本类似。cmake用于为mosquitto配成、生成vs下的工程,cmake的下载地址,这里使用的是3.22.1版本。cmake的安装比较简单,安装提示安装即可。pthreads-ws32mosquitto用到了POSIX下的pthreads线程库,windows原生是

2022-01-19 15:48:22 1950

原创 windows系统-串口设备导致鼠标乱跳的问题

最近在windows7 SP1系统上,开发了一款modbus数据监听、处理的应用程序。主要功能就是监听485线上modbus通信数据,处理数据,并上报到中心平台,485数据通过USB转485信号转换模块获取。 在调试的过程中发现,...

2022-01-17 17:02:26 11532 1

原创 记一次C栈溢出

今天与大家分享的一次堆栈溢出的调试过程,废话少说直接看代码。1 #include <stdio.h>2 #include <string.h>3 void stack_damage(char *buffer, int *len)4 {5 char *str = "stack damaged!";6 int slen = strlen(str);7 strncpy(buffer, str, slen);8 *len = slen;9 }1

2021-05-31 23:01:49 242

原创 2022内容输出小目标

公众号1.继续做奔跑的码仔公众号2.把平时遇到的问题,想法及时的记录下来,供以后复盘3.关注人数,突破5004.坚持一周两篇的输出频率博客1.输出自己平时工作,学习中遇到的问题,问题涉及到的点,解决的方案2.每周两篇输出3.粉丝数突破500注:0.以上方法来于使用德鲁克的回馈分析法1.每个季度复盘目前的状态2.年底验证目标是否达到预期...

2021-05-22 12:28:07 208 2

原创 程序员的日常,过于真实

2021-05-12 20:20:02 203

原创 Linux shell脚本IO重定向

shell IOshell脚本或者Linux终端上,常用的IO文件描述符有三个:0 标准输入(stdin)1 标准输出 (stdout)2 标准错误 (stderr)标准输入一般为键盘,标准输出和标准错误一般都是显示器。可以在shell脚本的后面添加 >filename,将标准输出重定向到文件中。重定向一般情况下,shell脚本的标准输出和标准错误都是输出到显示器上的,我们可以通过IO重定向,将标准输出和标准错误重定向其他文件或设备。IO重定向的一般形式如下: $ echo "

2021-04-08 16:43:46 462

原创 Linux系统下的时区配置管理

时区Linux系统关于时区的配置有两种方式:通过配置/etc/localtime和/etc/timezone文件。通过配置TZ环境变量。两种方式都可以达到配置时区的目的,下面分别说明一下这两种方式的使用方式。系统时区/etc/localtime用于配置系统时区,即,系统中其他任何需要时区参数的应用都可以通过localtime来获取时区信息,localtime一般为/usr/share/timezone/下某一时区配置文件的软链接,/usr/share/timezone为时区数据库,里面包含世

2021-04-07 18:58:09 3974

原创 史上最简单的Git入门教程

Git基本教程目录Git基本教程 11. 版本控制系统简介 11.1 何为版本控制 11.2 分布式VS集中式 32. Git初体验 62.1 Git诞生记 62.2 安装Git 72.3 创建Git版本库 83. Git本地管理 103.1 提交修改 103.2 版本回退 133.3 工作区和暂存区 183.4 管理修改 233.5 撤销修改 253.6 删除文件 284. 远程仓库 304.1 GitHub初体验 30

2021-03-20 23:53:41 3993 2

原创 史上最小的Http服务器

概述TinyHttp基于CSAPP(深入理解计算机系统第11章网络编成)实现。TinyHttp足够小,只有不到300行的代码,却可以完整的展示一个Web服务器的基本原理和功能。TinyHttp实现了HTTP的GET、POST、HEAD方法处理过程。TinyHttp可以动态的扩展静态文件类型。TinyHttp可以动态的扩展cgi-bin下的可执行程序,完成各种不同功能的动态内容的生成。TinyHttp是健壮的,实现对于常见异常的处理过程,比如,SIGPIPE信号等。项目代码:https://

2021-01-28 19:07:25 1760 1

原创 Web基础之HTTP

概述HTTP(Hypertext transfer Protocol)超文本传输协议,用于Web应用开发时,客户端和服务器之间的通信协议。HTTP是一个纯文本的通信协议,HTTP最新的版本是HTTP1.1,兼容HTTP1.0版本的协议,RFC2616描述了HTTP1.1相关的内容,可以这里获取到最新的HTTP RFC文档。基本结构与其他的通信协议类似,HTTP协议也是由消息头和消息体组成的。下面是HTTP通信时的几点约定:以行作为基本的传输单元,每行以回车 换行(C语言里是“\r\n”)结尾。

2021-01-27 21:18:25 507

原创 EOF到底是什么意思?

概述我们在使用C标准I/O时,经常会看到EOF这个概念。起初,我认为EOF就是字面意思即,到达了文件的结尾(End of File)。可是,最近在看K&R时,发现函数返回时EOF表示的是当前函数调用出现了错误,这些错误包括:文件达到了末尾;文件读写出现了错误,比如,磁盘没有空间。下面是man中,关于fgetc的解释:fgetc() reads the next character from stream and returns it as an unsigned char cast t

2021-01-25 19:29:25 25864 1

原创 你真的懂C的格式化I/O吗?(下)

系列文章目录[C语言]之基本输入输出(格式化I/O)文章目录系列文章目录回顾格式化输入回顾上一篇文章主要是总结了C语言下格式化输出相关的内容,这一节来总结一些格式化输入相关的内容。格式化输入下面是ANSI C定义的标准的输入函数族:#include <stdio.h>int scanf(const char *format, ...);int sscanf(const char *string, char *format, ...);int fscanf(FILE *str

2021-01-24 12:29:59 282

原创 你真的懂C的格式化I/O吗?(上)

前言说起C语言I/O操作,学过C的人第一反应想到的肯定是printf/scanf之类的函数,那可是C语言的基础,程序调试的必备技能 ????。不错,作为一名C程序猿,printf确实是使用最为高频的函数了。但是如果我要问,如何格式化输入/输出我们想要的内容,大家可能就有点心虚了。为了修补上这个bug,今天我就和大家一起学习一下C的格式化I/O。格式化输出下面是ANSI C定义的标准的输出函数族:#include <stdio.h>printf(char *format, ...);

2021-01-23 13:25:24 473

原创 [计算机系统]之虚拟内存-第一部分(基本原理续)

系列文章目录[计算机系统]之虚拟内存-第一部分(基本原理)文章目录系列文章目录虚拟内存作用(续)简化内存管理保护内存地址翻译基本原理利用高速缓存利用TLB多级页表具体实例虚拟内存具体案例虚拟内存作用(续)简化内存管理进程、虚拟内存、物理内存之间的关系简化程序的连接、简化程序的加载、简化数据之间的共享(共享库)、简化内存分配虚拟内存机制为进程使用内存提供了极大的方便,它为进程提供了一致的、独立的地址空间。对于32bit系统来说,每个进程都是独享4GB的虚拟内存空间,即使物理内存只有几百兆的情况

2021-01-15 23:39:46 631 1

原创 [计算机系统]之虚拟内存-第一部分(基本原理)

概述虚拟内存是什么?解决了什么问题?根据冯•诺依曼计算机体系结构的定义,CPU和内存是最为核心的系统构件,CPU用于程序指令的执行,而内存作为磁盘数据的缓存,用于为CPU提供指令和数据保存的环境。内存作为一种稀缺资源,如果管理不当或导致内存耗尽,程就无法执行,或内存被破坏导致进程、系统崩溃。所以,需要设计一套机制来有效的管理和使用内存,这种机制就是“虚拟内存”。软件设计领域流传着这样一句至理名言:“软件领域的任何问题,都可以通过增加一个间接的中间层来解决”,这一句话同样适用于虚拟内存。虚拟内存就是处

2021-01-13 23:29:37 1516 1

深度学习智能时代的核心驱动力量人工智能大牛作者文科生都能读懂的人工智能

深度学习智能时代的核心驱动力量人工智能大牛作者文科生都能读懂的人工智能 Kindle MOBI格式

2019-04-06

TensorFlow实战Google深度学习框架(第2版)+源码

TensorFlow实战Google深度学习框架(第2版),该文档为高清版本,压缩包内含文档和配套的相关源代码,非常适合对深度学习感兴趣的读者阅读。

2019-03-18

GPIO驱动示例程序

与本站中04-Linux设备树系列-GPIO驱动实践相关的配套的实例。

2018-09-17

Android boot.img解包/打包工具集

Android boot.img解包/打包工具集,具体的使用方式可以参考README。

2018-09-07

A Linux Environment Zero Overhead

对于tilrea的zol机制进行了十分详细的介绍

2014-03-30

SNMP++/Agent++ 开发手册

如利用SNMP++/Agent+完成设备控制模块和设备代理模块的开发手册

2013-07-13

P2P网络技术原理及C++实现案例

全面详实介绍P2P的网络技术原理理论,在此基础上对基于C++实现的几个P2P案例进行了详尽的分析!

2013-03-30

Thinking in C++ 随书附带的源代码

Thinking in C++ 、源代码

2012-11-18

iptables使用手册

详细介绍linux下的iptables的使用

2012-09-09

linux 0.11 源代码,代码注释

详细介绍linux早期版本0.11的实现机制,是学习linux系统上好的资料!

2012-09-08

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除