
Linux
文章平均质量分 76
猪哥-嵌入式
这个作者很懒,什么都没留下…
展开
-
hashmap哈希map是什么?什么时候需要使用hashmap?C实现hashmap示例
对于C程序员,尤其是嵌入式C程序员,hashmap使用的相对较少,所以会略显陌生,hashmap其实涉及到2个概念,分别是哈希(hash)、map。哈希hash:是把任意长度输入通过蓝列算法变换成固定长度的输出,这种转换是一种压缩映射,一般不可逆。这是专业的解释,我们常说的crc16、crc32、lrc、md5、sha256等,本质上都是哈希hash,只不过散列算法不同而已。原创 2022-12-25 22:04:21 · 1962 阅读 · 0 评论 -
>/dev/null 2>&1分析
这里写自定义目录标题背景知识Linux中与输入输出相关的文件描述符Linux shell 输出重定向的目的Linux Bash支持的输出重定向语法背景知识Linux的重定向指的是[改变输入/输出的方向],一般情况下,我们都是从键盘读取用户输入的数据,然后再把数据拿到程序中使用,这就是标准的输入方向,反过来,程序也会产生数据,这些数据都是呈现在显示器上,这就是标准输出方向。简单的说:输入方向就是数据从哪里流向程序,数据默认从键盘流向程序,如果改变它的方向,数据就从其他地方流入,这就是输入重定向。原创 2021-08-16 22:46:24 · 436 阅读 · 0 评论 -
一种通过MQTT Broker实现远程调试、创建网络隧道的解决方案
前言先说一下场景需求:1、远程ssh访问设备,但是设备端不具备公网访问能力。2、物联网采集网关,通过4G连接外网,网关部署在项目现场,我们不知道网关的IP,就算知道,网络链路也不通。对于网关的远程调试和运维都无法进行。目前的解决方案:1、通过SD-WAN技术,设备与设备之间打通隧道。2、通过VPN,本地部署VPN服务器,实现VPN专网。3、采用阿里云/华为云边缘计算解决方案,设备连接到阿里云/华为云边缘平台,实现远程运维、调试。现有方案优缺点1、SD-WAN技术,需要配备SD-WAN软件或原创 2021-06-02 22:19:44 · 1555 阅读 · 7 评论 -
一种程序防盗加密思路
需求场景采用的是开源硬件,linux平台,程序拷贝到硬件上,应用程序功能是多种多样,比较复杂的,还会涉及到后期进行OTA升级,所以如果直接采用程序绑定硬件唯一ID是不方便的,基于这些原因,我们可以参考软件行业里的加密狗思路,给我们的程序增加一个软加密狗,这个软加密狗是与硬件唯一绑定的,可以认为一机一密。思路1、软加密狗程序尽可能的简单,只做2件事儿:1、检查当前硬件唯一ID是否合法。2、提供查询接口(信号、共享内存、消息队列)等,当应用程序查询当前硬件是否合法时,返回OK或ERROR。当然,这原创 2021-04-26 18:34:51 · 525 阅读 · 0 评论 -
Linux进程启动过程分析
前言在上一篇文章《深入分析linux下 动态库的显性调用(dlopen)和隐性调用区别》 我们分析了动态库的显性和隐性调用区别,里面提到了进程运行加载的一些知识点,本文做一个简单的总结。进程启动过程1、搜索器所依赖的动态库(隐形调用动态库)。2、加载隐性调用的动态库到内存。3、初始化隐性调用的动态库。4、初始化进程。5、将程序的控制权移交给main函数,也就是从main入口。6、如果程序运行到 dlopen , 将动态库加载到内存,然后初始化,再使用dlsym 调用。...原创 2021-04-08 18:36:57 · 708 阅读 · 0 评论 -
深入分析linux下 动态库的显性调用(dlopen)和隐性调用区别
前言在linux环境下编程,我们如果想要使用第三方的库,基本上有以下几种方式:1、将第三方库的源码合并到我们的工程项目代码中,一起编译。2、将第三方库编译成静态库(xxx.a),我们在使用时,在Makefile中引用该静态库。3、将第三方库编译成动态库(xxx.so), 我们在使用时,隐性调用该动态库,具体表现为需要 在程序中包含动态库的 头文件,同时需要在/usr/lib路径下,存放动态库文件,以便程序调用。4、将第三方库编译成动态库(xxx.so), 我们在使用时,显性调用该动态库,在程序原创 2021-04-08 11:37:13 · 6308 阅读 · 0 评论 -
Linux I/O底层原理揭秘
本文转载腾讯游戏工程师:Linux I/O底层原理全面揭秘这里向作者致敬,写的非常棒,从技术背景到原理,通俗易懂。摘要从虚拟内存、I/O 缓冲区,用户态&内核态以及 I/O 模式等等知识点全面而又详尽地剖析 Linux 系统的 I/O 底层原理,分析了 Linux 传统的 I/O 模式的弊端,进而引入 Linux Zero-copy 零拷贝技术的介绍和原理解析,将零拷贝技术和传统的 I/O 模式进行区分和对比,帮助读者理解 Linux 内核对 I/O 模块的优化改进思路。前言如今的网络应用转载 2021-03-10 22:10:01 · 1318 阅读 · 0 评论 -
systemctl 启动/关闭/启用/禁用服务 总结
启动服务systemctl start vsftpd.service关闭服务systemctl stop vsftpd.service重启服务systemctl restart test.service显示服务的状态systemctl status test.service在开机时启用服务systemctl enable test.service在开机时禁用服务systemctl disable test.service查看服务是否开机启动sys原创 2020-12-14 13:53:00 · 7227 阅读 · 0 评论 -
gettimeofday() 和 clock_gettime()函数 分析小结
在上一篇文章《struct timeval 和 struct timespec 应用小结》我们分析了与linux系统时间相关的结构体定义,在linux系统C编程中,获取系统时间的api函数有两个,分别为:int gettimeofday(struct timeval *tv, struct timezone *tz)int clock_gettime(clockid_t, struct timespec *)我们逐个分析:1、gettimeofday() 该函数把当前时...原创 2020-10-29 22:40:06 · 8883 阅读 · 0 评论 -
struct timeval 和 struct timespec 应用小结
在基于linux的C编程中,经常会看到 struct timeval和struct timespec 这两个跟时间有关的结构体,有时候会容易混淆,先看下这两个结构体的定义,以linux-2.6.35为例,在time.h下struct timeval { __kernel_time_t tv_sec; /* seconds */ __kernel_suseconds_t tv_usec; /* microseconds */};struct timespec { __kernel原创 2020-10-29 22:13:06 · 1833 阅读 · 0 评论 -
undefined reference to symbol ‘pow@@GLIBC_2.2.5 编译错误解决方法
解决方案:gcc编译时增加 -lm选项,这样程序就能引用libm.so(libmath)库了。 该错误的含义并不是glibc库的错误,而是pow符号未定义, pow是数学中的求幂函数,也就是说,如果我们在C文件中引用了math.h ,那么在使用gcc编译时,必须添加 -lm选项,因为书序函数是位于libm.so库文件中的,-lm选项告诉编译器书序函数要到这个库文件中查找。...原创 2020-10-15 15:24:19 · 12059 阅读 · 0 评论 -
libxx.so is not an ELF file 解决方法
嵌入式Linux下进行共享库移植时,在PC上交叉编译生成共享库后,需要将共享库和软连接拷贝到设备/lib下,正常情况下是可以使用的,但是在程序调用动态库的时候,出现了题目中的错误,如下图所示:问题分析:linux下的拷贝不完全,或者说对于 共享库的 软连接 不能拷贝完全。解决办法:先将原来的软连接删除,然后使用 ln -s 命令手动创建软连接。其中 -s 是可选参数,创建 符号链接。实例:给libmodbus.so.5.1.0 创建 软连接 libmodbus.so.5ln ...原创 2020-09-14 22:50:07 · 8024 阅读 · 0 评论 -
libev交叉编译移植到ARM
交叉编译过程与之前的文章《libmodbus协议栈1——Linux下详细移植步骤(配置、生成)》中的流程是类似的。下面简单的做记录1、下载libev源码git clone https://github.com/enki/libev.git2、安装automake,autoconf,libtoolsudo apt-get insatll automake autoconf libtool3、这里不用执行./autogen.sh了,因为下载的源码中已经拥有了configure执行文件。4、创建原创 2020-09-02 22:20:41 · 1422 阅读 · 0 评论 -
epoll 分析、应用场景及与select对比
在Unix/linux 中有 I/O 操作,I/O操作针对的是 文件,而linux下,“文件”概念是比较庞大的,不管是 普通文件还是硬件设备,还是socket连接、管道等等,都是文件,文件 最常用的3中操作就是 “读”、“写”、“异常”,我们经常使用的就是“读”操作,比如读取串口接收数据,读取socket 接收数据等等,文件的“读” 一般分2种,“阻塞”和“非阻塞”,对于这两种概念,我们举...原创 2020-04-25 22:27:27 · 2267 阅读 · 1 评论 -
buildroot的作用简单分析
buildroot 是linux平台下的一种构建嵌入式Linux系统的框架,这个工具在刚开始接触的时候,觉得有点懵? 这玩意儿能够构建系统内核、u-boot、根文件系统?太夸张了吧,后来经过使用发现,这个工具还真 可以,只不过实现的方式比较意外。Buildroot是由Makefile脚本和Kconfig配置文件构成的,对于构建内核、u-boot,它是 需要 写好脚本,从芯片厂家提供的下载链...原创 2020-03-30 22:24:47 · 3996 阅读 · 1 评论 -
阿里云IOT C-SDK 源码分析系列(8): IOT_Linkkit_Report 分析
从函数名称上就可以知道,这个函数的主要功能是向云端发送消息,但是它的功能不仅仅如此,特别需要注意的就是,他还包含子设备登录/子设备退出功能。函数 原型如下:IOT_Linkkit_Report 原型int IOT_Linkkit_Report(int devid, iotx_linkkit_msg_type_t msg...原创 2020-02-08 21:09:49 · 1729 阅读 · 0 评论 -
阿里云IOT C-SDK 源码分析系列(7): IOT_Linkkit_Close 源码分析
该函数的功能是 关闭网络连接,并且释放Linkkit 的所有的占用资源。原型如下:IOT_Linkkit_Close原型int IOT_Linkkit_Close(int devid);接口说明若设备ID为主设备, 则关闭网络连接并释放Linkkit所有占用资源参数说明参数 数据类型 方向 说明devid int 输入 设备ID返回值说明值 说...原创 2020-02-08 20:48:51 · 796 阅读 · 0 评论 -
阿里云IOT C-SDK 源码分析系列(6):IOT_Linkkit_Yield 用户 事件调度函数源码分析
在上一篇文章中,着重分析了 SDK的 核心调度线程yield,本文再简单的分析下用户 事件调度 API 接口函数,该函数 原型如下:IOT_Linkkit_Yield原型void IOT_Linkkit_Yield(int timeout_ms);接口说明若SDK占有独立线程, 该函数只将接收到的网络报文分发到用户的回调函数中, 否则表示将CPU交给SDK让其接收网络报文并将消息...原创 2020-02-08 19:28:45 · 1372 阅读 · 0 评论 -
阿里云IOT C-SDK 源码分析系列(5):重点理解SDK的核心调度线程 _iotx_cm_yield_thread_func
本文是 本系列的 最重要的 一篇,因为本文尝试着去揭示SDK本身的 工作内容,为什么要理解 SDK 的工作内容呢?因为SDK提供给开发者的是API接口函数,我们只是会简单的使用 这些API接口, 但是这些API接口的相关资料只有寥寥几句话, 相关的技术文档也非常少,作者的出发点可能是开发者快速的进行应用开发,不需要了解SDK本身的任何 实现机制,但是个人觉得,如果完全不了解 SDK的...原创 2020-02-08 17:18:08 · 954 阅读 · 0 评论 -
阿里云IOT C-SDK 源码分析系列(4):IOT_MQTT_Construct 源码分析
IOT_MQTT_Construct 函数没有开放给 用户使用,它不是一个 API接口,但是对于移植者而言,尤其是关注 底层原理的,这个函数还是非常重要的,不管我们是采用 SDK自带的编译系统进行移植,还是采用“ 代码抽取”的方式进行移植,编写wrapper.c 中的HAL_xxx函数都是必不可少的, 尤其是TCP 连接、断开、读、写的HAL 接口函数,这些 都是具体的硬件层面的 接...原创 2020-02-08 16:35:04 · 1867 阅读 · 0 评论 -
阿里云IOT C-SDK 源码分析系列(3):IOT_Linkkit_Connect 接口源码分析
从字面意思也能看出 该函数是 设备 向 云服务器 发起连接的功能函数,但是“连接”功能知识它的主要功能,它还实现了一些其他的参数初始化,比如特别重要的 底层 HAL 接口函数的绑定。该函数 原型如下:IOT_Linkkit_Connect原型int IOT_Linkkit_Connect(int devid);接口说明对于主设备来说, 将会建立设备与云端的通信. 对于子设备...原创 2020-02-07 22:55:58 · 1900 阅读 · 0 评论 -
阿里云IOT C-SDK 源码分析系列(2):IOT_Linkkit_Open 接口源码分析
该函数是使用 IOT的SDK的 需要调用的 第一个 接口函数,该函数原型如下:IOT_Linkkit_Open原型int IOT_Linkkit_Open(iotx_linkkit_dev_type_t dev_type, iotx_linkkit_dev_meta_info_t *meta_info);接口说明初始化设备资源, 在对设备进行操作之前, 必须先调用此接口. 该接口...原创 2020-02-07 22:20:00 · 1598 阅读 · 0 评论 -
阿里云IOT C-SDK 源码分析系列(1):应用框架概述
在前面的文章:《阿里云IOT-C-SDK系列(1)概述:移植流程、程序框架、代码目录》《阿里云IOT-C-SDK系列(2)快速体验:移植+示例C代码》《阿里云IOT-C-SDK系列(2)快速体验:移植+示例C代码》《阿里云IOT-C-SDK系列(4)SDK配置选项理解》《阿里云IOT-C-SDK系列(5):进一步理解SDK的移植使用方式》 我们是从 移植、应用的角...原创 2020-02-07 20:39:43 · 2362 阅读 · 0 评论 -
freemodbus 从机 原理分析小结
在之前的文章《Freemodbus原理分析》,结合代码对 freemodbus 进行了分析,这里对 freemodbus机制做一下分析小结。freemodbus 的应用场景 主要是在 非linux下的 单片机系统,当然了,freemodbus 1.6 版本也开始支持了 linux,不过在linux下,如果不是一定要移植源码的话,个人觉得 libmodbus 相比 freemodus 还是...原创 2020-01-27 21:39:25 · 5882 阅读 · 1 评论 -
libmodbus源码分析(3)从机(服务端)功能源码分析
在上一篇文章《libmodbus源码分析(2)主机(客户端)功能源码分析》 从 主机的角度 分析了 源码,本文以 从机(服务器)的角度分析一下源码。同样的,我们以 modbus rtu 协议的 4x区保持寄存器功能进行举例说明。 我们简单的写一下 modbus rtu 下 响应客户端(主机)读4x 区保持寄存器的伪代码流程:int main(void){ modbu...原创 2020-01-27 14:23:00 · 5616 阅读 · 3 评论 -
libmodbus源码分析(2)主机(客户端)功能源码分析
在上一篇文章《libmodbus 源码分析(1)基本框架、关键数据结构、接口》中,分析了libmodbus的源码基本框架和关键的数据结构、接口,本文就分析一下 libmodbus 作为 主机(客户端)的功能源码实现,这里我们以 modbus rtu 协议 的读 4x 区保持寄存器功能 进行举例说明,我们简单的写一下 modbus rtu 下读 4x 区保持寄存器的 伪代码 流程:in...原创 2020-01-26 18:25:50 · 4177 阅读 · 3 评论 -
libmodbus 源码分析(1)基本框架、关键数据结构、接口
在之前的文章:《 libmodbus协议栈1——Linux下详细移植步骤(配置、生成) 》《 libmodbus协议栈2—— Linux下 modbus RTU master 开发案例 》《 libmodbus协议栈3—— Linux下 modbus RTU 从机 开发案例 》《 libmodbus协议栈4—— 总结 》 我们是从 应用的角度了解到了 libmodbus 的使...原创 2020-01-26 17:41:33 · 10640 阅读 · 9 评论 -
单向链表删除并清空操作 注意
在之前的文章《深入理解Linux内核之链表 list.h 功能实现原理、接口说明及示例代码》中详细的分析了链表的各种操作,我们经常使用的操作是“初始化”、“ 添加节点”、“遍历”、“删除”,对于链表节点的删除,使用的相对少,而且由于 删除操作的 宏函数 定义的复杂,容易混淆,本文基于此,对 链表的删除清空做下备忘录。以单向链表结构 为例,用到的宏函数有2个,分别为:/* * I...原创 2019-12-27 18:23:34 · 2286 阅读 · 0 评论 -
libev 笔记(三):libev的使用模型
上一篇《libev 笔记(二):事件驱动模型 在 稳定的网络服务器 程序中的应用》我们介绍了 事件驱动模型的作用,以及在网络服务器中应用,本文简单的说一下 libev 的 使用关键点。 libev 是一种高性能事件循环 / 事件驱动库。作为 libevent 的替代作品,由于其支持linux,而且其作者声称其相比libevent速度更快,代码更少,所以我们在嵌入式linux中采用...原创 2019-12-10 22:25:42 · 1109 阅读 · 1 评论 -
libev 笔记(二):事件驱动模型 在 稳定的网络服务器 程序中的应用
在前面的文章《libev 笔记(一):“事件驱动模型” 的 理解》 简单的介绍了 事件驱动模型的概念,但是文字概念毕竟理解起来稍微有点抽象,接下来从具体案例来一步步的分析,事件驱动模型 能解决什么问题,也就是怎么用。 本文 参考了顾锋磊 老师的 文章 《使用事件驱动模型实现高效稳定的网络服务器程序》,在此向作者致敬,写的确实不错。 libev 目前 最典型的应用场景可能就...原创 2019-12-10 22:08:32 · 779 阅读 · 0 评论 -
libev 笔记(一):“事件驱动模型” 的 理解
libev 是 一种 “事件驱动”的编程框架,所谓“事件驱动”,简单地说就是就是 有什么动作(点按钮、中断),程序就执行什么操作(中断服务函数、回调函数),当然事件不仅限于用于的操作,只要是定义好的,各种突发、预设的各种将要发生的事情,都是事件。这里,我对CPU相对熟悉一些,可以把“事件驱动”理解为 自定义软件中断。这里我们举几个案例来分析:案例1: 状态机FSM 状态机是一...原创 2019-12-10 21:04:57 · 920 阅读 · 0 评论 -
ID 值自动 “申请”和“释放” 算法及C代码 (2)
在上一篇文章《ID值自动申请和释放》中,简单的介绍下应用背景和C代码,不过上一篇中的代码 至适用于 “释放”一次,不支持多次释放,也就是说必须要释放1次后,下一次操作必须是重新申请,因为代码中没有 使用 “队列”操作,所以本文为了实现多次释放的功能,进一步改善了代码,引入了队列的思想,关于“队列”的概念,可以参考之前的文章《深入理解数据结构(一):队列 及 C代码框架》。下面就是具体的代码:#...原创 2019-11-03 19:51:54 · 457 阅读 · 0 评论 -
ID 值自动 “申请”和“释放” 小算法及C代码
简单的说下题目中涉及到的 应用场景,在 开发 网关或一些组态软件的时候,我们一般是需要创建变量或者设备表的,还有就是对于数据库表中的 ID值,我们在对表中记录进行“增”、“删”操作时,也涉及到 ID值的 管理,这个具体体现为:(1)当我们新创建一个变量或一条记录时,希望ID值为最新的,而且是唯一的、递增的。(2)如果只有“增”操作,没有“减”操作,那就比较简单了,对id值进行 id...原创 2019-11-02 18:52:53 · 616 阅读 · 0 评论 -
Ubuntu14.04安装openssh-server
在使用SecureCRT或者cuteftp远程登录Ubuntu时,需要在Ubuntu上先安装openssh-server,但是在Ubuntu14.04上安装时,sudoapt-getinstallopenssh-server 会出现错误,提示安装包损坏。 E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。原创 2015-06-17 15:34:47 · 3408 阅读 · 0 评论 -
使用CuteFtp软件访问虚拟机下的Ubuntu
使用使用CuteFtp软件访问虚拟机下的Ubuntu首先要在Ubuntu下启动FTP,SSH和NFS服务。 1.$ sudo apt-get update2.$ sudo apt-get install vsftpd3.$ sudo gedit /etc/vsftpd.conf 打开后,将 #local_enable = YES #write_enable =原创 2015-06-17 15:41:27 · 673 阅读 · 0 评论 -
Linux之文件系统和根文件系统
在学习Linux的过程中,会遇到“文件系统”和“根文件系统”两个概念,这两个概念容易混淆,总觉得为什么Linux需要这么多的文件系统,这两种系统的各自作用是什么,有什么区别呢? “尽管内核是Linux的核心,但文件却是用户与操作系统交互所采用的主要工具”,这就阐述了“文件系统”的作用,如果只有Linux,没有文件系统,那么整个系统是没有意义的。 在Linux中,有“VFS”的原创 2015-06-30 13:56:08 · 3416 阅读 · 0 评论 -
各种Qt的区别——Qt,Qt/Embeded,Qtopia,Qt Designer,Qt Creator
在学习Qt开发之前,需要区分一些概念,这些概念由于名字太过相似,功能也太难懂,所以容易混淆。Qt是一个完整的C++应用程序开发框架(库或架构),它的API在所有的平台上(Linux,Windows等)是相同的,这就表示Qt工具在所有平台上的使用方式是一致的,因而Qt的应用程序开发和平台是无关的。Qt:泛指Qt的所有版本的图形界面库,注意重点是“库”,由于Qt最早是在Linux中随着KDE流原创 2015-06-30 17:27:50 · 3756 阅读 · 0 评论 -
嵌入式Linux开发流程
在开始学习嵌入式Linux的时,由于Linux是一种全新的操作系统,跟我们曾经熟悉的Windows的学习思路完全不同,所以在学习的过程中看不到目的,不知道从何开始,不知道为什么学,不知道学什么,所以总结一下嵌入式Linux开发流程,举例,现在手上有一块开发板,那么我们应该怎么进行嵌入式Linux开发呢,流程如下:1.移植bootloader,如u-boot,vivi等。2.裁剪Linux。原创 2015-06-30 17:35:50 · 1167 阅读 · 0 评论 -
基于uboot及TFTP通信向开发板烧写程序的详细分析
最近接触了Tiny6410及TQ2440开发板,这里吐槽一下,这两种开发板算是小有名气了,尤其是TQ,太过垃圾了,裸机程序都没有,开发板,最值钱的恰恰就是教程,教程越详细越好。Tiny6410开发板略微好一些,但是仍然不够详细,Tiny6410的烧写程序工具是Minitool软件,不过这个软件不太稳定,可能是我的系统是win7的缘故吧,反正就是shi活无法连接成功(USB驱动已装),只能使用ubo转载 2015-07-01 18:29:58 · 2648 阅读 · 0 评论 -
Vmware Workstation中配置Fedora的bridge上网
在虚拟机中安装了Fedora9后,遇到了不能上网的问题,需要进行配置,现将配置过程总结如下:1.在vmware workstation中设定fedora上网方式为“bridge”。2.查看win7电脑中的IP地址、子网掩码、网关、DNS,并记录。3.进入Fedora9桌面中,选择“System->Network”,弹出下图1:图1:Fedora之Netowork双击原创 2015-07-06 10:06:19 · 1209 阅读 · 0 评论