【发布时间】:2021-12-28 22:29:03
【问题描述】:
我正在STM32F401RE板上用C++编写一个裸机编程项目,我需要实现malloc()和free()函数。
我知道嵌入式系统上的动态内存分配不是一个好主意,但我需要它。
据我所知,为了使用 C 标准库的 malloc 和 free 函数,我需要手动实现一个名为 _sbkr() 的函数,为此我创建了一个库单个函数并将其添加到 main.cpp 源代码的包含中。
问题是它不起作用,当我尝试动态分配一个变量时,它返回一个 NULL 指针。
用gcc生成main的汇编代码,在要上传到板子的最终对象中好像没有实现_sbrk函数。
如何正确实现这个功能?
【问题讨论】:
-
要构建一个原始的 _sbrk 函数来生成功能性 GCC libc 和 newlib,您必须定义芯片可用内存的 init 和 end,这通常在链接描述文件中定义符号。一个例子,更多可以在谷歌上找到,在这里:interrupt.memfault.com/blog/boostrapping-libc-with-newlib
-
您使用的是什么工具链和 C 库?如果 GCC + Newlib,sourceware.org/newlib/libc.html#Syscalls 的示例实现就足够了。
-
"我知道嵌入式系统上的动态内存分配不是一个好主意"...好吧,您需要了解为什么避免陷阱——不要只是接受公认的智慧,然后以任何方式使用它。这并不总是一个坏主意,但它可能会被错误地使用。你知道你在做什么吗?也许你应该发布一个关于这个的问题?甚至是关于如何避免它的;我们只知道您“需要它” - 总有替代方案 - 这可能是 X-Y 问题。
标签: c++ c embedded stm32 dynamic-memory-allocation