这两天在学习FreeRTOS实时操作系统,手里有一块以前买的普中科技(芯片:STM32F103C8T6)的开发板,于是就试了下把FreeRTOS移植到板子上。
使用开发板自带的LED的例子,参考正点原子的FreeRTOS移植参考手册。
按照步骤把FreeRTOS移植完用Keil5编译的过程中,出现了好多内存不足的link错误。见下图:
针对这个问题,查了下芯片官网。正点原子使用的是STM32F103VET6芯片(FLASH 512Kb,SRAM 64Kb),而我使用的开发板的芯片是STM32F103C8T6芯片(FLASH 128Kb,SRAM 20Kb),
芯片官网的架构图上是SRAM是10Kb,按照芯片手册来说应该是20Kb。两种芯片架构图如下:
了解了这个细节后,知道上面编译出错的根本原因是出在内存上。而FreeRTOS使用xCreatTask函数创建任务是用的动态内存,即在SRAM里自动分配的。
在FreeRTOSConfig.h配置文件中有设置RTOS要使用的内存大小,用configTOTAL_HEAP_SIZE宏定义的。
在正点原子的手册中,他的芯片是用的STM32F103VET6芯片(FLASH 512Kb,SRAM 64Kb),而它的这个宏定义的值是20K(20*1024)。
#define configTOTAL_HEAP_SIZE ((size_t)(20*1024))
我要移植到芯片 STM32F103C8T6芯片(FLASH 128Kb,SRAM 20Kb),因此这个宏定义不能使用上面芯片设置的值20K,修改成10K。
#define configTOTAL_HEAP_SIZE ((size_t)(10*1024))
再次编译工程,上述的错误消失,成功通过编译。
在网上还看到过修改程序优化等级的,不建议大家使用,首先把程序优化等级调节到最大,也就是Level 3(-O3),容易出现一些奇怪的问题,而且也不会节省多少内存。
建议还是设置成默认优化等级Level 0(-O0)不变。