我目前正在使用ST的ARM-M4芯片开发一个程序并移植了一个网络库。在调试过程中,我注意到如果我不将 .s 文件中的 heap_size 增加到 0x400,程序就会崩溃。我已经用我自己的动态内存分配函数mymalloc替换了系统的malloc接口。但是,当我检查 .map 链接器文件时,我仍然在某些文件中看到对 malloc 函数的引用,但我找不到 .map 文件中调用 malloc 的实际代码行。
我的问题: 在ST的MDK环境下,是否有更好的方法来判断系统的malloc函数是否正在被调用?比如可以在线设置断点吗?
STM32 上 .s 启动文件中的 heap_size 的用途是否超出了动态内存分配函数(如 malloc)?
除了与malloc相关的动态内存分配函数之外,还有哪些系统库函数可能会使用malloc?
我的尝试: 在我的头文件顶部,我使用#define malloc mymalloc 来替换系统的malloc。 我使用库的 malloc 接口将系统的 malloc 替换为我自己的实现。
C 标准库使用堆来处理 I/O,例如
printf
函数,请参见示例 使用 printf 消耗堆
如果您不希望程序使用堆,请避免使用像
printf
这样的文件上的函数,或者最好完全避免使用 C 标准库(如果可能的话)。
如果这是不可能的,那么您必须保留(最小)量的堆,以便 C std 库可以分配其结构。
如果您有权访问调试器,则可以精确定位堆访问,在
malloc
函数或在映射文件中找到的 h1_alloc
中设置断点,并检查调用堆栈,您可以找出谁使用了堆,最有可能的是 C 库初始化。