无法获得最大RAM大小-带有rtos的STM32

时间:2018-10-16 13:07:27

标签: stm32

我正在使用STM32F103R8T6,我目前正在为RTOS设置最大堆大小

当我尝试设置12000时

#define configTOTAL_HEAP_SIZE                    ((size_t)12000)

错误编译

region `RAM' overflowed by 780 bytes    Project-STM32           C/C++ Problem

那么我最多可以使用什么?

2 个答案:

答案 0 :(得分:0)

查看链接器(.ld)文件。您将看到定义RAM的部分。假设链接器文件已正确生成,这将告诉您您有多少RAM。

答案 1 :(得分:0)

您粘贴的错误消息表明链接器超出了可用RAM区域的末尾780个字节。在您的情况下(STM32F103R8T6),它试图将21260字节(20KB + 780)放入RAM,该RAM只能容纳20KB。如果您将configTOTAL_HEAP_SIZE减少了链接器报告的数量,则可能会成功链接。但是,常规/非RTOS堆将有0个剩余空间,因此如果您的代码的任何部分想要使用它,mallocnew都不会成功。

您可以通过分析* .map文件来确定链接程序将哪些内容准确地放到RAM中(旁注:仅当程序成功链接后才创建映射文件,因此至少需要使其处于该状态)。当您打开它时,搜索20000000(RAM区域的开始),然后您应该在那里看到确切放置的内容,包括每个块的大小。

除非您对项目做过一些不寻常的事情(我认为可以肯定地假设您没有使用生成的项目来做),否则链接期间的RAM区域至少需要适合以下部分:

  • .data段中,诸如通过值实时初始化的全局变量之类的东西

  • .bss段与上面的段相似,不同之处在于值是零初始化的。这是最终放置大小为configTOTAL_HEAP_SIZE的字节数组的地方,RTOS会将其用作自己的堆

  • 堆栈(不要与RTOS堆栈大小混淆,这是完全独立的)-堆栈用于RTOS任务之外。它的大小是恒定的-请查阅您的sections.ld文件以找到该值。

  • 堆段,其大小由链接器动态计算,并且等于RAM的总大小减去所有其他节的大小。您使其他段越大,常规堆就越小。

话虽如此,除了要通过* .map文件来确定除RTOS堆以外,RAM还占用了什么,我还要三思而后行,为什么只需要分配12KB(总共20KB)到RTOS堆。诸如您是否需要许多任务,它们是否需要这么大的堆栈,您是否需要那么多/如此大的队列/互斥对象/信号灯之类的事情。