- 博客(9)
- 收藏
- 关注
原创 stm32 lwip client同时稳定收发和自动重连
本文探讨了在嵌入式系统中使用LwIP实现TCP客户端时面临的一个常见问题:客户端无法自动检测服务器连接状态导致重连机制失效。文章首先介绍了LwIP的Socket接口开发流程,包括建立连接、收发数据等基本操作。随后详细分析了五种实现方案及其问题,重点指出TCP发送(write)和接收(recv)对连接断开检测的灵敏度差异。最终提出了两种有效解决方案:1)创建独立发送线程并结合信号量机制;2)使用select多路复用实现异步收发。文章还建议通过实现心跳机制来完善连接状态检测,为嵌入式工程师提供了实用的LwIP开
2026-06-24 16:03:36
223
原创 IAR工程通过修改icf文件链接函数到指定位置
在嵌入式软件的很多应用场景里面,需要将某些特定的函数放置到特定的位置,正好最近深度学习了一下IAR的分散加载,分享一下。将某些特定的函数放到Flash的特定位置,方便IAP来执行在线升级APP;或者为了保护知识产权将某些核心代码放置到对外不可见的特定ROM中;或者由于代码量的原因需要把代码放置到外部Flash中。将某些特定的函数放到SRAM中执行以提高代码的执行效率,甚至有的MCU为了以更高的效率执行代码还提供了CCRAM(内核耦合RAM)。
2025-04-11 21:34:50
2674
转载 向心加速度公式的推导
向心加速度公式的推导可谓“条条大路通罗马”,是一个十分有趣的数学问题,无论是通过三角、向量、解析几何还是极限、微积分等高等数学方法都可以进行求解,在此整理几个最为简便的方法供大家参考。
2024-12-19 11:38:26
2650
原创 球面面积的积分推导
想起求球表面积的积分推导,在B站上也看到求表面积的视频,他们都是先求球体体积,再求表面积,我觉得有点绕远求近了,所以我自己写了一点直接球表面积积分的推导,聊以记录。Rad的求取如最后一张图所示,R在α角平面的投影长度为R*sinθ,而轴线上α角平面的扇形区域对应的弧度。取半圆绕行α角度形成的形状S进行研究,取S表面角度为θ的绿色部分进行研究。,由于Rad最大处对应的是赤道上的弧度,南北半对称,取北半进行积分。下面这个图我花了好久时间画的。
2024-12-11 10:47:33
3058
原创 可变个数参数(...)的使用
必须通过宏va_start进行初始化,使指针指向传入的可变数据的列表,通过va_arg访问列表中的元素,和使用va_end释放列表占用空间。对于某些应用场景,某些函数的功能很相近,但是传入函数的参数个数不一样,使得我们必须使用不同的函数,比如2个数求平均,或者3个数求平均,甚至其他更多参数的情况;2) va_start:初始化va_list的变量,它是一个宏定义,调用后va_list的变量指针指向传入的可变数据的列表的第一个元素。va_end宏需要一个参数,是一个va_list类型的变量。
2024-05-13 18:08:05
332
原创 CM3的SVC获取处理号简析
因此,当用户程序想要控制特定的硬件时,它就要产生一个SVC异常,然后操作系统提供的SVC异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。第三部:查找当前PC对应的EXC_Code(可执行代码大多存放在Flash中,也可能在其他存储介质中,我以内部Flash为例),此时的PC指向的还是执行SVC指令之后的指令,需要在此基础上往后倒退一个SVC指令的宽度,因为SVC指令是16位的thumb指令,所以在此PC的基础上减2个字节即为SVC指令;该指令需要一个立即数,充当系统调用代号。
2024-02-28 18:34:42
934
4
原创 SWD TurnAround的理解
时间标签1到8表示Target的采样点,8-9之间是TA段,时间标签9到11是Target的ACK的驱动点,时间标签12标志ACK最后1bit的结束,12-13之间是TA段,因为这是SWD写操作,时间标签13以后的都属于Host驱动IO(在CLK的下降沿驱动),Target在CLK的上升沿采样。那么请看下图,把1CLK细化成4部分(H-F-L-R),时间标签1到8表示Target的采样点,9到11是Target的ACK的驱动点。在周转期间,主机和目标都不驱动线路,线路的状态是未定义的。
2024-02-06 17:59:48
1250
1
原创 ARM汇编LSLS指令
逻辑左移(立即数)将寄存器值左移一个立即位数,并将结果写入目标寄存器。CM3中兼容thumb和ARM指令,为thumb指令(16位)和ARM指令(32位),在CM3中汇编中常用到LSL指令,此指令用于逻辑左移。在“LSLS R1,R1,#5”这句汇编代码中,意思是将R1寄存器左移 5 位再写回到R1寄存器中。第二种情况下,因为左移5位后,R1= 0x1 0000 0000,导致溢出的那以为正好是1,所以C置位.如果 R1 = 0x8000 0000,执行完上面指令后 R1= 0, xPSR中C为0;
2023-07-28 10:45:56
7311
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅