我正在使用STM32F103R8T6,我目前正在为RTOS设置最大堆大小
当我尝试设置12000时
#define configTOTAL_HEAP_SIZE ((size_t)12000)
错误编译
region `RAM' overflowed by 780 bytes Project-STM32 C/C++ Problem
那么我最多可以使用什么?
答案 0 :(得分:0)
查看链接器(.ld)文件。您将看到定义RAM的部分。假设链接器文件已正确生成,这将告诉您您有多少RAM。
答案 1 :(得分:0)
您粘贴的错误消息表明链接器超出了可用RAM区域的末尾780个字节。在您的情况下(STM32F103R8T6),它试图将21260字节(20KB + 780)放入RAM,该RAM只能容纳20KB。如果您将configTOTAL_HEAP_SIZE
减少了链接器报告的数量,则可能会成功链接。但是,常规/非RTOS堆将有0个剩余空间,因此如果您的代码的任何部分想要使用它,malloc
或new
都不会成功。
您可以通过分析* .map文件来确定链接程序将哪些内容准确地放到RAM中(旁注:仅当程序成功链接后才创建映射文件,因此至少需要使其处于该状态)。当您打开它时,搜索20000000
(RAM区域的开始),然后您应该在那里看到确切放置的内容,包括每个块的大小。
除非您对项目做过一些不寻常的事情(我认为可以肯定地假设您没有使用生成的项目来做),否则链接期间的RAM区域至少需要适合以下部分:
.data
段中,诸如通过值实时初始化的全局变量之类的东西
.bss
段与上面的段相似,不同之处在于值是零初始化的。这是最终放置大小为configTOTAL_HEAP_SIZE
的字节数组的地方,RTOS会将其用作自己的堆
堆栈(不要与RTOS堆栈大小混淆,这是完全独立的)-堆栈用于RTOS任务之外。它的大小是恒定的-请查阅您的sections.ld
文件以找到该值。
堆段,其大小由链接器动态计算,并且等于RAM的总大小减去所有其他节的大小。您使其他段越大,常规堆就越小。
话虽如此,除了要通过* .map文件来确定除RTOS堆以外,RAM还占用了什么,我还要三思而后行,为什么只需要分配12KB(总共20KB)到RTOS堆。诸如您是否需要许多任务,它们是否需要这么大的堆栈,您是否需要那么多/如此大的队列/互斥对象/信号灯之类的事情。