现象:使用RTT的SAL_AT组件,利用sim800c, 在阿里物联网平台进行OTA下载过程中,占用内存超大(700K的文件下载,动态内存使用最高超过600K)。下载完毕后内存全部释放。
查找问题:
看了下RTT实现机理是AT组件检查到+RECEIVE标志后,通过URC表调用回调函数,回调函数再执行at_socket.c中的at_recv_notice_cb()回调函数,使用at_recvpkt_put()将接收到的数据写入list链表上,然后使用workqueue唤醒等待接收数据的线程使用at_recvpkt_get()数据读取, 该函数读完后使用at_recvpkt_node_delete()删除链表节点并且释放内存。
在这个过程中内存申请就在urc_recv_func()函数,没接收到一个“+RECEIVE”b标志就会申请内存,因为没有释放,造成动态内存使用超高。
请教:
只要内存足够大,整个下载过程非常完整,但是过程中动态内存申请巨大。同样的应用程序,使用netdev组件转换成以太网,则没有这么大的内存消耗。
所以请教下这个占用内存超大的原理。以下是运行日志:
[172703] I/ali-ota: receive 4096 bytes, total recieve: 0 bytes
[172944] I/ali-ota: receive 4096 bytes, total recieve: 4096 bytes
[174964] I/ali-ota: receive 4096 bytes, total recieve: 8192 bytes
[175205] I/ali-ota: receive 4096 bytes, total recieve: 12288 bytes
free
memheap pool size max used size available size
ext-sram 1048576 63012 985564
heap 62816 62804 12
msh />[177267] I/ali-ota: receive 4096 bytes, total recieve: 16384 bytes
[177508] I/ali-ota: receive 4096 bytes, total recieve: 20480 bytes
[180038] I/ali-ota: receive 4096 bytes, total recieve: 24576 bytes
msh />free
memheap pool size max used size available size
ext-sram 1048576 77200 971376
heap 62816 62804 12
msh />[181498] I/ali-ota: receive 4096 bytes, total recieve: 28672 bytes
[181739] I/ali-ota: receive 4096 bytes, total recieve: 32768 bytes
msh />free
memheap pool size max used size available size
ext-sram 1048576 84220 964356
heap 62816 62804 12
msh />[183979] I/ali-ota: receive 4096 bytes, total recieve: 36864 bytes
[184220] I/ali-ota: receive 4096 bytes, total recieve: 40960 bytes
[186718] I/ali-ota: receive 4096 bytes, total recieve: 45056 bytes
[188782] I/ali-ota: receive 4096 bytes, total recieve: 49152 bytes
[189024] I/ali-ota: receive 4096 bytes, total recieve: 53248 bytes
[191181] I/ali-ota: receive 4096 bytes, total recieve: 57344 bytes
[191422] I/ali-ota: receive 4096 bytes, total recieve: 61440 bytes
[193701] I/ali-ota: receive 4096 bytes, total recieve: 65536 bytes
msh />free
memheap pool size max used size available size
ext-sram 1048576 126600 921976
heap 62816 62804 12
可以看见,从固件开始下载后,动态内存的使用往上飙升,直至下载完毕后,所有内存释放得干干净净。
更多回帖