
嵌入式
文章平均质量分 72
猪哥-嵌入式
这个作者很懒,什么都没留下…
展开
-
LwIP系列(6):TCP client 连接服务器3次握手代码流程简单分析
在上一篇文章中,我们详细描述了TCP 3次握手、4次挥手、状态机转换,本文从lwip的代码维度,分析下tcp client的发起连接的流程,之所以单独分析tcp client,是因为嵌入式设备,client使用场景较多。原创 2023-08-15 22:34:38 · 731 阅读 · 0 评论 -
gdb系列1:gdb基本原理概述、quickStart快速体验
嵌入式开发,debug不可或缺,每个人有每个人的debug思路,概况来说,基本上有两种,分别为使用debug工具,或基于debug log日志调试。其中debug工具,如果我们使用IDE开发程序,一些强大的IDE工具可以帮助我们便捷的debug程序,但是在Linux平台下的嵌入式开发,是没有特别好用的IDE的,所以gdb就出现了,gdb实现的功能类似我们RTOS开发环境中的keil、IAR提供的调试工具,只不过gdb是完全独立的工具。原创 2022-11-01 22:41:39 · 605 阅读 · 0 评论 -
RTOS系列(13):汇编LDR指令、LDR伪指令、[Rn]寄存器间接引用 详细解析
汇编LDR指令在RTOS中使用的比较频繁,尤其是在PendSV中进行上下文切换的时候,LDR指令是不可缺少的,我们在看uC/OS、FreeRTOS、RT-Thread的源码时,都能够看到LDR的身影。由于LDR指令有2个名字LDR指令、LDR伪指令,这就给我们理解LDR带来了困难,很容易混淆。本文就详细分析一下汇编LDR、[Rn]间接引用的原理。......原创 2022-07-24 12:17:28 · 3890 阅读 · 0 评论 -
RTOS系列(12):使用SVC或PendSV启动OS流程详细分析
RTOS系列(1):基础知识——中断嵌套RTOS系列文章(2):PendSV功能,为什么需要PendSVRTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低RTOS系列文章(4): MDK软件仿真 + Debug-(printf)-Viewer使用方法RTOS系列文章(5):C语言程序运行原理分析:汇编、栈、栈帧、进栈、出栈、保存现场、恢复现场、返回RTOS系列文章(6):Cortex-M3/4之SP,MSP,PSP,Thread模式、Handler模式、内核态、用户态原创 2022-07-10 22:33:16 · 3318 阅读 · 3 评论 -
RTOS系列文章(11):RTOS启动方式——直接设置CONTROL寄存器、SVC启动、PendSV启动
RTOS系列(1):基础知识——中断嵌套RTOS系列文章(2):PendSV功能,为什么需要PendSVRTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低RTOS系列文章(4): MDK软件仿真 + Debug-(printf)-Viewer使用方法RTOS系列文章(5):C语言程序运行原理分析:汇编、栈、栈帧、进栈、出栈、保存现场、恢复现场、返回RTOS系列文章(6):Cortex-M3/4之SP,MSP,PSP,Thread模式、Handler模式、内核态、用户态原创 2022-07-10 10:06:59 · 2172 阅读 · 3 评论 -
RTOS系列文章(10):简单OS示例分析
RTOS系列(1):基础知识——中断嵌套RTOS系列文章(2):PendSV功能,为什么需要PendSVRTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低RTOS系列文章(4): MDK软件仿真 + Debug-(printf)-Viewer使用方法RTOS系列文章(5):C语言程序运行原理分析:汇编、栈、栈帧、进栈、出栈、保存现场、恢复现场、返回RTOS系列文章(6):Cortex-M3/4之SP,MSP,PSP,Thread模式、Handler模式、内核态、用户态原创 2022-07-05 22:55:34 · 1777 阅读 · 5 评论 -
RTOS系列文章(9):再次分析栈帧、函数调用与中断调用的区别
在前面的系列文章中,尤其是CM3/4之LR寄存器、EXC_RETURN深入分析 中我们简单的分析了一些函数调用与中断调用的流程,那篇文章也基本上能说明函数调用和中断调用的一些区别,本文将基于栈帧的概念,再次分析一下两者之间的相同点和不通点。栈帧是一个非常专业的概念,很惭愧的说,在没有深入分析RTOS之前,我也不曾了解栈帧这一概念,之前只是大概了解到函数调用需要堆栈存放局部、临时变量,但是栈帧这个概念确实时从未关注过。我们先引入《The Definitive guide to ARM Cortex M3/4》原创 2022-06-06 22:03:24 · 1761 阅读 · 2 评论 -
RTOS系列文章(8):深入分析中断处理过程
在上一篇文章中,我们深入分析了函数调用返回、中断调用返回使用的LR和EXC_TURN,也简单说明了函数调用流程、中断调用流程。在FreeRTOS中,任务的调度是通过SysTick + PendSV 中断来实现的,尤其在PenSV中断中进行任务上下文切换原理,是理解FreeRTOS任务调度原理的重中之重。而SysTick和PendSV都是中断,所以我们有必要深入分析一下在ARM CM3/4中中断的完整处理流程。整体流程如下:接下来我们直接引用《The definitive guide to ARM Corte原创 2022-06-04 22:54:10 · 4440 阅读 · 3 评论 -
RTOS系列文章(6):Cortex-M3/4之SP,MSP,PSP,Thread模式、Handler模式、内核态、用户态
FreeRTOS系列(1):基础知识——中断嵌套FreeRTOS系列文章(2):PendSV功能,为什么需要PendSVFreeRTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低FreeRTOS系列文章(4): MDK软件仿真 + Debug-(printf)-Viewer使用方法FreeRTOS系列文章(5):C语言程序运行原理分析:汇编、栈、栈帧、进栈、出栈、保存现场、恢复现场、返回在深入分析RTOS调度之前,我们还需要了解一下Cortex-M3/4的工作模式以及双原创 2022-06-03 18:50:15 · 10275 阅读 · 13 评论 -
RTOS系列文章(4): MDK软件仿真 + Debug-(printf)-Viewer使用方法
背景MDK具有强大的软件仿真能力,这里的仿真不是仿真虚拟的CPU,而是仿真我们工程中使用的CPU,简单的说,我们在MDK中的工程文件,只要CPU型号是MDK本地支持的,都可以使用仿真器直接仿真,而不依赖真实的硬件。仿真器除了常规的寄存器、堆栈信息,还可以使用自带的print打印窗口。但是如果使用printf功能,需要重定向fput函数。在后续的文章中,我们会使用软件仿真来学习分析FreeRTOS具体步骤1. 勾选[User MircroLIB]2. 仿真Debug设置3. fput 重原创 2022-05-21 18:02:17 · 2250 阅读 · 0 评论 -
RTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低
FreeRTOS系列(1):基础知识——中断嵌套FreeRTOS系列文章(2):PendSV功能,为什么需要PendSV前言在上一篇文章中,我们详细分析了PendSV的功能,也分析了SysTick和PendSV结合,实现OS任务调度,简单的分析了SysTick的优先级。我觉得有必要针对SysTick的优先级,单独写一篇文章分析。结论概述嵌入式实时OS的【实时】不仅仅是OS对任务调度及时,更重要的是要求嵌入式OS具有【可剥夺/抢占】的特性,既允许高优先级任务抢占低优先级任务,又要允许外部中断能够抢占原创 2022-05-17 21:43:12 · 6393 阅读 · 12 评论 -
RTOS系列文章(2):PendSV功能,为什么需要PendSV
背景大多数嵌入式RTOS在Cortex-M3/M4上的移植都需要PendSV,比如uCOS、RT-Thread、FreeRTOS等,本文就对PendSV的功能作用,以及为什么需要PendSV进行详细的分析。PendSV是什么?我们先引用《Cortex-M3权威指南》对PendSV的介绍:PendSV(可悬起的系统调用),它是一种CPU系统级别的异常,它可以像普通外设中断一样被悬起,而不会像SVC服务那样,因为没有及时响应处理,而触发Fault。个人理解PendSV的英文全称应该是:Pend S原创 2022-05-17 20:55:58 · 17901 阅读 · 18 评论 -
RTOS系列(1):基础知识——中断嵌套
背景我们在单片机编程,嵌入式RTOS编程,甚至其他OS下的系统编程时,可能会忽略“中断嵌套”背景知识,在之前的工作和编码过程中,我也没有深入的了解或者注意过“中断嵌套”,直到当我想要深入了解嵌入式RTOS的运行原理时,才发现,原来“中断嵌套”的概念是如此的重要,以至于各种RTOS的基础配置,以及设计,都是围绕着“中断嵌套”的机制来设计和配置的。什么是中断嵌套中断嵌套的书面解释如下:中断嵌套指中断系统正在执行一个中断服务L时,有另一个优先级更高的中断H触发,这时中断系统会暂时中止当前正在执行低优先级原创 2022-05-15 22:00:13 · 13873 阅读 · 5 评论 -
Modbus协议中文pdf免费下载地址
本着开源的精神,给大家分享 资源。Modbus中文版免费下载地址原创 2021-04-14 22:15:41 · 5675 阅读 · 5 评论 -
DLT645-97、07协议pdf免费下载地址
前言网上各种资源都要各种积分,这里我把自己积累的一些协议分享给大家。DLT645协议pdf下载地址没错,就是在gitee上。原创 2021-04-14 22:08:10 · 3386 阅读 · 9 评论 -
物联网:断点续传策略及流程图
前言在物联网数据采集场景中,当现场有采集网关时,断点续传功能就尤为重要,可以保证数据的连续性,这个主要是因为使用2G/4G网络时,信号不太稳定。策略如上图所示,基本思路是:(1)“断线”是基于与云端交互进行判断的,比如说MQTT协议中,我们基本上能够检测到设备是在线还是离线,当然前提是,MQTT的心跳设置的不要过长。(2)存储的数据并不是实时的,而是存储当前要传的数据,比如设备1分钟上传1次数据,时间到后,检测到网关断线了,则把当前次数据存放到历史库中,而且只存当前次的一条,实时数据库该怎么刷新原创 2021-03-16 15:20:56 · 3456 阅读 · 1 评论 -
理解CPU的 推挽、开漏输出以及应用场景
0- 概述在嵌入式CPU中,GPIO口都是可以设置成多种模式的,比如STM32的芯片 GPIO端口可以由软件配置成多种模式: 对于 输入模式和复用功能模式,都是比较容易理解的,但是 输出 推免输出和开漏输出,理解起来确实有些难度, 如果不理解这两种模式,那么对于这两种模式的应用场景,也是难以很好的理解的,接下来,我们就以STM32的 GPIO口的 结构为例,从电路的角...原创 2020-02-20 14:09:36 · 11571 阅读 · 6 评论 -
阿里云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 评论 -
ID 值自动 “申请”和“释放” 小算法及C代码
简单的说下题目中涉及到的 应用场景,在 开发 网关或一些组态软件的时候,我们一般是需要创建变量或者设备表的,还有就是对于数据库表中的 ID值,我们在对表中记录进行“增”、“删”操作时,也涉及到 ID值的 管理,这个具体体现为:(1)当我们新创建一个变量或一条记录时,希望ID值为最新的,而且是唯一的、递增的。(2)如果只有“增”操作,没有“减”操作,那就比较简单了,对id值进行 id...原创 2019-11-02 18:52:53 · 616 阅读 · 0 评论 -
cJSON库使用:特别注意事项
cJSON的简单使用——STM32移植cJSON打包功能使用-代码案例、特别注意事项 在前面的文章中,我们对cJSON进行了一些简单分析,包括解析、打包这两种最常用功能,cJSON的移植相对简单,但是在使用的时候,还是有一些特别需要注意的地方的,这 主要是因为 cJSON库 中的一些函数会进行内存申请操作,但是并不会自动释放内存,这就相当于 是风险, 需要使用者自己去及时的释放 内存。...原创 2019-09-07 22:32:55 · 3807 阅读 · 0 评论 -
STM32之GPIO并行输入输出数据编程技巧
在STM32实际编程中,会遇到GPIO口连续的引脚并行输出应用,例如数码管驱动,LCD并行驱动,如果单独逐个去驱动IO口,编程麻烦,而且效率比较低,其实可以直接采用寄存器编程实现,这种思路的前提是,尽量从GPIO_Pin_0端口开始分配管脚,这样比较方便。这里主要用到GPIO的2个寄存器,分别是端口输入数据寄存器“GPIOx_IDR”和端口输出数据寄存器“GPIOx_ODR”其中x=A...E原创 2017-06-29 18:56:02 · 20255 阅读 · 0 评论 -
高速光耦6N137用于RS485通信的总结
关于RS485光耦隔离,之前用PS2501,发现波特率最大只能达到9600,如果想要获得更高的波特率应用,只能通过高速光耦,6N137就是一个可以参考使用的器件,6N137的转换速率理论上可达10Mbits/s,实测在115200是没有问题的。一、6N137 6N137的内部原理图如下:图中可看到,输入侧是就普通的发光二极管,而输出侧则相比较普通的光耦是一个“与非门”,引脚7就是一原创 2017-06-20 15:44:27 · 35865 阅读 · 5 评论 -
一种全局变量的定义方法
参考uCOS中的全局变量定义,下面的方法很巧妙:在XXX.h头文件中定义如下#ifdef XXX_GLOBALS#define XXX_EXT#else XXX_EXT extern 然后再XXX.C文件中声明#define XXX_GLOBALS这样做有一个好处,在XXX.C文件中如果使用这些变量,由于已经宏定义了XXX_GLOBALS原创 2017-06-07 10:38:33 · 729 阅读 · 0 评论 -
uCOS-III移植到STM32分析
摘要:所谓移植是将一个系统嵌入到STM32工程项目中,需要将STM32的工程“神经”与uC/OS的“神经”搭一起。而对于操作系统的移植,我们需要知道功能流程,没有必要所有的程序代码都需要自己写,那就变成自己写操作系统了,会特别累。 一、移植步骤简述(1)下载STM32最新固件库3.5版本。(2)创建一个纯净的裸机工程项目。(3)uC/OS官网下载STM32的案例程序,找原创 2016-12-27 22:31:38 · 19694 阅读 · 1 评论 -
STM32 通用定时器的一些概念解析
STM32一共有8个定时器,其中定TIM1和TIM8为高级控制定时器,除了具有通用定时器的功能外,还兼具控制功能,不仅能够输出PWM还可以采集编码器,驱动各种电机的功能。而基本定时器TIM6和TIM7一般不用作普通定时器,一般会给别的定时器提供基准时钟信号。对于通用定时器TIM2~TIM5,基本的功能就不描述了,主要是看这些通用定时器如何使用:TIM_TimeBaseInitTypeDef原创 2016-05-24 17:17:02 · 4246 阅读 · 0 评论 -
Keil-MDK查看代码量,RAM时候用情况Code;RO-data;RW-data;ZI-data的分析
在使用Keil编译程序时,最后的编译结果会有如下的显示:linking...Program Size: Code=19020 RO-data=888 RW-data=244 ZI-data=10564 这个里面Code--代码占用空间.RO-data--Read Only只读常量的大小,如const型。RW-data是Read Write初始化的可读写变量的大小。ZI-d原创 2016-04-28 15:31:16 · 3606 阅读 · 0 评论 -
I2C分析及RX8025驱动编写
一、 I2C1. I2C概要I2C总线由SDA和SCL构成的2线式双向通信,通过组合这2个信号,进行通信的开始/停止/数据传送/应答等接收信号。非通信时:SDA、SCL都保持高电平。通信的开始和结束通过SCL处于高电平,切上升或者下降SDA来控制。数据的传送及发送信号时的SDA线上的数据变更在SCL线低电平区间进行,接收信号侧在SCL线处于高电平区间进行读取原创 2016-03-15 15:32:57 · 19336 阅读 · 7 评论 -
STM32F10X的时钟树及时钟初始化
对于初学者而言,时钟是一个很重要很深的概念,对于STM32芯片来讲,为了实现低功耗,设计了一个功能完善但是却很复杂的时钟系统,使得外围功能的时钟可配置,相对应的,单片机的时钟基本上固定的几种,简单配置后就能使用,而STM32的外围功能不仅要配置,还需要在最开始就要设置这些外设时钟,只有使能这些外设时钟后,这些外设才能够使用。STM32的时钟树,如下图所示:STM32有一下4个时钟源:原创 2016-03-24 17:27:45 · 6981 阅读 · 0 评论 -
窗口看门狗的真正作用
STM32有2个看门狗:独立看门狗和窗口看门狗。独立看门狗IWDG--独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。窗口看门狗WWDG----系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。简单的讲,看门狗就是检测系统故障的,如果因为系统故障而没有及时喂狗,则引发复位重启。对于一般的看原创 2015-12-23 10:47:32 · 16025 阅读 · 3 评论 -
嵌入式Linux驱动开发案例流程--LED驱动
本文主要是以一个最简单的LED驱动开发流程,来窥探一下Linux驱动开发为何物。基本流程:1.编写驱动文件xxxx.c这个文件的主要作用是对设备硬件初始化,主要是xxx_init(),其中也包括设备的注册。 对file_operations结构体进行初始化,这个初始化是核心,其实是对open.write.read等函数找映射函数。各种映射函数的编写,例如xxx_o原创 2015-07-14 14:39:30 · 1845 阅读 · 0 评论 -
软件中断SWI的实现
///////////////////////////////转载//////////////////////////////////////////http://blog.youkuaiyun.com/mr_raptor/article/details/6556451///////////////////////////////////////////////////////////////转载 2015-06-12 16:09:36 · 1512 阅读 · 0 评论 -
推挽输出、开漏输出、复用开漏输出、复用推挽输出 以及上拉输入、下拉输入、浮空输入、模拟输入的区别
转自:http://blog.sina.com.cn/s/blog_6ebd49350100pzju.html 谢谢原作者最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多:(1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入(3)GPIO_Mode_IPD 下拉输入 (4)GPI转载 2017-08-08 16:35:43 · 1396 阅读 · 0 评论