基于 STM32Cube生成的工程的内存管理异常

所属分类:STM32F系列 浏览数:567 提问者:zom 提问时间:2018-01-11

问:

用STM32CUBE建立的STM32F746工程,从芯片手册查到该芯片为320k+512k(ram+flash)空间,应用程序使用了不足100k的RAM,而工程方面使用了freeortos+lwip,发现工程里如果申请一个较大的空间,例如unsigned char tmp[50*1024];这样,程序不会跑飞,但程序跑起来总会有一些莫名的异常,例如某数组数据被修改等。后续通过下面两组测试来定位原因: 1、在freertosconfig.h里面修改configTOTAL_HEAP_SIZE的大小为20*1024(原来为15360),发现情况更加严重,就算删除测试用的50k数据也无法恢复。 2、申请一个20k的数组数据(全局),出现异常,后在定义处增加const unsigned char tmp[20*1024];异常消除。 上述的调试里面,已经排除由用户应用原因导致的异常。 咨询下,这个是不是跟芯片内存映射或者编译器有关,当前用的是keil v5的编译器


答:查看芯片资料,里面提到 0x2000 0000~0x2000 FFFF 为TCM RAM (64K) 0x2001 0000~0x2004 BFFF为SRAM1(240k) 0x2004 C000~0x2004 FFFF为SRAM2(16K) 而f746的ram=TCM+SRAM1+SRAM2. 在创建数组时,定义: __attribute__((at(0x20001 0000))) unsigned char tmp[20480]; 编译器会报错,错误如下: L971E:xxxx.o(.ARM.__AT_0x2000 2710)type RW incompatible with tcp_in.o(.bass) type ZI in er RW_IRAM1. 通过该条信息知道该空间被tcp_in占用,然后不断改变at的地址,在ram后面的地址全部都被占用,这说明芯片的ram全部都被使用了??? stm32有没有办法查看ram的使用情况?
回答者:zom 回答时间:2018-01-11

答:查看map文件看到: Total RO Size(Code + RO Data) 102456 (100.05KB) Total RW Size(RW Data + ZI Data) 101848 (99.46KB) Total RO Size(Code + RO Data + RW Data) 109328(106.77KB) 里面的RW就是 ram的使用情况???
回答者:zom 回答时间:2018-01-11

登录后回答。
图书推荐
漫画半导体(高清版)

漫画半导体(高清版)

这是一本实用性很强的图书,,以漫画的形式更易于让人接受,边读故事边学知识,轻松且易于记忆。
算法心得:高效算法的奥秘

算法心得:高效算法的奥秘

本书给我们带来了一大批极为诱人的知识,其中包括各种节省程序运行时间的技巧、算法与窍门...
基于STM8S-无刷直流电机控制应用

基于STM8S-无刷直流电机控制应用

无刷直流电机是21世纪最有发展前景的新型电机之一。本书以STM8S单片机为控制核心...
广告