我刚刚发现我的解码器库无法初始化,因为malloc()无法分配内存,并返回给调用方“NULL”。
我尝试了许多可能的场景,无论是否强制转换,并引用了许多关于malloc()的其他线程,但都没有成功,直到我将堆大小更改为0x000011400,这显然解决了问题。
现在,问题是,我怎样才能知道需要多少堆,或者留给程序多少堆?数据表上说我的MCU有:“高达192+4kbytes的SRAM,包括64kbyte的CCM(核心耦合存储器)数据RAM”,有人能解释一下这意味着什么吗?将其更改为0x00002000(8192字节)将导致以下数十个错误:
错误:L6406E:执行区域中没有空格。任何选择器
8KB的内存不是设备容量的一小部分吗?为什么我不能在0x00001800之外添加更多的内容?
编译后Keil报告的程序大小为:
程序大小:Code=103648 RO data=45832 RW data=580 ZI data=129340
最佳答案
错误错误:L6406E,是因为目标上没有足够的RAM来支持链接器文件,所以没有神奇的方法来获得更多的RAM,堆栈和堆都使用RAM内存,但在您的情况下,它似乎有足够的内存,但编译器并没有意识到这一点。
我的建议是将链接器响应文件与KeilμVision IDE一起使用,并根据使用情况更新所需的内存部分。。
链接器命令(或响应)文件仅包含链接器指令。命令文件中没有列出要链接的.OBJ文件和.LIB文件。这些是由μVision从项目文件中自动获取的。
开始使用链接器命令文件的最佳方法是让μVision自动为您创建一个链接器命令文件,然后开始进行必要的更改。
要从μVision生成命令文件。。。
转到“项目”菜单并选择“目标项”的选项。
单击L166 Misc或L51 Misc选项卡打开杂项链接器选项。
选中“使用链接器控制文件”复选框。
点击创建。。。按钮。这将创建链接器控制文件。
点击编辑。。。按钮。这将打开链接器控制文件进行编辑。
编辑命令文件以包含所需的指令。
创建链接器命令文件时,创建的文件包含当前选定的指令。
关于你面临的malloc()问题,
所需堆的大小取决于应用程序中所需的内存量,特别是使用malloc和calloc分配所需的内存动态内存。
请注意,一些C库(如“printf”)函数也在引擎盖下使用动态内存分配。
如果使用keil IDE编译源代码,那么可以通过修改启动文件来增加堆大小。
;******************************************************************************
;
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;
;******************************************************************************
Heap EQU 0x00000000
;******************************************************************************
;
; Allocate space for the heap.
;
;******************************************************************************
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
HeapMem
SPACE Heap
__heap_limit
;******************************************************************************
如果您使用make enviroment来构建应用程序,那么可以在线性文件中简单地更改堆大小。
详情请直接从Keil官网获取,请查看以下链接,
https://www.keil.com/pack/doc/mw/General/html/mw_using_stack_and_heap.html
http://www.keil.com/forum/11132/heap-size-bss-section/
http://www.keil.com/forum/14201/
比尔
杰瑞·詹姆斯。