一、程序存储与占用
1.编译后内存分配
编译后的Code(代码),RO-data(只读,譬如const),RW-data(读写,初始化非0的全局变量), 存储在ROM(flash)中,
ZI-data(初始化为0或者未初始化的变量),
运行时ROM占用是Code+RO-data+RW-data
运行时RAM占用是RO-data+RW-data+ZI-data;RW和ZI会被搬运到RAM使用。
二、动态内存erro常见事故
1.free非动态内存1
错误的free一个并非malloc/calloc来的内存会导致错误行为,譬如对一个字符串进行了free,下次malloc可能会错误的申请到该内存,而后由于字符串的非可变性导致该区域失效。
2.free非动态内存2
同样的错误free一个非动态内存也会可能导致下次calloc卡死在calloc里。
3.calloc申请内存大小
Calloc尽量申请len+1的内存,或者需要手动给末尾加\0,否则可能因为内存申请到有数据的位置而使得下次调用该内存长度变得更长,被错误的添加了无关的数据。
三、AT指令交互与数据处理
1.交互过快
在使用合宙/移远的4G模块时发现,当MCU与模块交互过快可能导致连包,无法接受到正确的数据,本次开发采用阻塞式,systick(1ms)作为时基,while等待。
经过测试1500-2000ms可以保证数据有效性,无连包.
2.重复连接
在AT交互初始化Socket,Https,MQTT的过程中发现,假如状态机switch重复执行了某个申请连接节点,会导致URC回传ERRO 或者重复连接,这时应当先查询连接状态,或者在申请连接之前先查询再处理。
处理方法有两种:1.判断已连接,则直接进入下一个状态节点 2.判断已连接,先断开,再重新连接。
处理方法取决于你的状态机switch查询流程设计。
四、非阻塞模拟异步操作
1.计时器if
使用计时器,在第一次进入时获取一个当前时间(一般配合状态机使用,在结构体中进行时间保存),而后进行if判断下次进入时间是否超过设定时间间隔,超过则更新时间记录,并切换至下一状态,否则直接break,等待下次进入判断。
N、附录,更新日志
2024/6/19
开始了该记录,主要内容是在调试合宙和移远的4G模块时发现的。
新增了1-1, 2-1~2-3, 3-1~3-2, 4-1等内容,针对AT交互和动态内存相关作出记录。
标签:RW,动态内存,free,C语言,内存,版本,日志,data,连接 From: https://blog.csdn.net/xixishuibubao/article/details/139790057