1.简述
在嵌入式开发里代码存储的最原始位置一定是在断电不丢失的存储器上比如flash.
旗芯微的MCU都是内置flash(XIP),所以程序运行时也是寻址flash上的代码
但是在某些情况下需要将flash上的代码拷贝到内存里执行(比如在bootloader里或者一些需要高效率执行的代码)。
本文将以FC4150 MCU为例子 简述将代码放到ram上运行的方法:
2.链接文件的处理
在flash.ld文件的section里面定义一个.code段(名称自定义,取名code是为了方便理解);同时在.code段里面定义一个.code_ram(后面函数或者变量可以定位到这个section里面);并且使用AT关键字指明该段的加载地址是来自哪里,>关键字指明运行地址在哪里;具体代码如下所示
.code : AT(__CODE_ROM)
{
. = ALIGN(4);
__CODE_RAM = .;
__code_start__ = .;
*(.code_ram);
. = ALIGN(4);
__code_end__ = .;
}>RAM_U
如上图所示,需要一个flash的加载地址;如下面代码所示,使用__CODE_ROM .+ = 0x500;这里为啥需要在当前位置上偏移0x500的大小呢?主要是上面还有label标签被其他需要类似操作使用了,不然会有地址重叠的编译报错(overlap),所以用户需要自己根据flash的使用情况自行做偏移操作
.text :
{
. = ALIGN(1024); /* V