问题:a22在添加插值算法的时候,发现播放功能正常,但是dfu升级到最后一点会重启的问题,定位发现是因为申请了一个很大的静态变量
初步判断是静态变量内存不够了而引起的问题:
关于单片机的内存可以看这个:"D:\Engineering documents\单片机的内存管理.xmind"
通过看keil的打印可以看出RAM=RW-data+ZI-data=50444+751856=802,300字节小于单片机内存的总大小1M,所以总的大小是够的,进一步看是静态变量的大小不够了
从上图可知静态变量和malloc内存是共用一块区域——ZI-data,那明明ZI-data大小是够的,为什么还会出现内存不够的问题呢,原来在freertos中,在系统运行的初期会划走一部分空间专门给malloc用,这块内存是不能给静态变量用的,所以即使在总的使用ram没到达1M的时候,静态变量也会放不下的问题,查看FreeRTOS的配置文件FreeRTOSConfig.h中,可以通过configTOTAL_HEAP_SIZE来设置动态内存堆的总大小,可以看出malloc划走了350k的大小,这么算起来,静态变量的大小确实是不够的
然后通过使用函数xPortGetFreeHeapSize()
来获取动态内存堆剩余可申请空间的大小。该函数会返回当前剩余的可用堆空间大小(以字节为单位),通过此函数发现malloc还有较大的空间
所以修改代码为使用malloc来申请内存空间,如此问题解决:
其他相关: