Introduction
一般情况下,调试代码时都会把程序下载到芯片内部FLASH中,一些临时的数据存放在SRAM中,这是由于SRAM空间很小(0x20000000 - 0x20004FFF),价格较贵,而FLASH的空间较大(0x08000000 - 0x0801FFFF)。在一些场合下我们希望程序可以在SRAM中调试运行,将代码下载到SRAM中调试有以下优缺点:
-
优点:
-
缺点:
以上摘自《STM32库开发实战指南》第39章 在SRAM中调试代码。
Three Methods
-
使用__ramfunc关键字
使用__ramfunc关键字可以让函数存储到SRAM中,不过无法指定位置。并且带__ramfunc的函数调用不带__ramfunc的函数会出现警告,同时cpu 执行速度会变慢。
__ramfunc void function()
example
-
Code
-
Result
-
-
使用#pragma location指令
修改.icf文件可以使程序在指定的RAM区域中运行。在.icf文件中自定义一个SECTION,指定这个SECTION的地址区域;将.c文件中的函数指定存储到这个SECTION中,必须给每个需要存入RAM的函数都添加#pragma location语句。
-
修改.c文件
// method A #pragma location="MY_FUNC" void function() // method B void function() @ "MY_FUNC"
-
修改.icf文件
// method a // place functions into RAM without direct address initialize by copy { readwrite, section MY_FUNC }; //…… place in RAM_region { readwrite, block CSTACK, block HEAP, section MY_FUNC }; // method b // place functions into RAM at the direct address //…… place at address mem:0x20002000 {section MY_FUNC};
example
-
Code
修改.c文件
修改.icf文件 -
Result
-
-
使用#pragma default_function_attributes指令
#pragma default_function_attributes指令可以将一定区域内的所有函数存入SECTION中,更加方便快捷。对.icf文件的修改和方法二一致;在.c文件中,在需要存入RAM的函数区域开始位置和结束位置加上该指令。同样也可以使用#pragma default_variable_attributes将变量存入指定区域。
#pragma default_function_attributes = @ "MY_FUNC" void function1(){} void function2(){} void function3(){} #pragma default_function_attributes =
example
-
Code
-
Result
-
Application on CoreMark Project
CoreMark跑分测试可阅读上文[「玫瑰国」MM32L373 CoreMark跑分测试][coremark]。CoreMark测试CPU性能,运行速度越快,得分越高。上一篇文章中,CoreMark是按常规在FLASH里运行的,由于程序代码所占空间太大,无法把所有代码都放入SRAM,所以选取了core_list_join.c/core_matrix.c/core_state.c/core_util.c/core_portme.c中的函数,将它们存入了SRAM。
- 运行在FLASH上
- 部分运行在SRAM上
References
[1] 刘火良, 杨森. STM32库开发实战指南[M]. 北京: 机械工业出版社, 2017.5
[2] IAR SYSTEMS, Placing a group of functions or variables in a specific section[EB/OL], https://www.iar.com/knowledge/support/technical-notes/linker/how-do-i-place-a-group-of-functions-or-variables-in-a-specific-section/, 2018-5-31.
[3] 香水城, 【实战经验】IAR下如何让程序在RAM中运行[EB/OL], https://bbs.21ic.com/icview-961176-999-1.html, 2015-6-5.