VectorTable_ROM 0x08000000 0x00000200
{
VectorTable_RAM 0x20000000 0x00000200
{
*.o (RESET, +First)
}
}
IntFunction_ROM 0x08000200 0x00001600
{
IntFunction_RAM 0x20000200 0x00001600
{
*.o (IntFunction)
}
}
LR_IROM1 0x08001800 0x0003E800
{
ER_IROM1 0x08001800 0x0003E800
{
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20001800 0x0000D800 ; data bss
{
;*(InRoot$$Sections)
*.o (+RW +ZI)
}
RW_IRAM2 0x2000F000 0x00000C00 ; HEAP ADDRESS
{
*.o (HEAP)
}
RW_IRAM3 0x2000FC00 0x00000400 ; STACK ADDRESS
{
*.o (STACK)
}
}
说明:
1、分散加载区域1
????????VectorTable_ROM为中断向量表加载地址;
????????VectorTable_RAM为中断向量表执行地址。
2、分散加载区域2
????????IntFunction_ROM为中断服务函数加载地址;
????????IntFunction_RAM为中断服务函数执行地址。
3、分散加载区域3
????????LR_IROM1为剩余其他所有的(全局变量(data)、全局未初始化变量(.bss或.ZI)、只读变量(const、字符串)、代码(text、code))加载地址;
????????ER_IRAM1为只读变量、代码执行地址,等于加载地址,其中*(InRoot$$Sections)表示的是外部加载的所必须的段,也就是c语言所必须的运行时环境(详情可通过在MDK中按F1键查找帮助手册);
????????RW_IRAM2为堆区,通过这种方式可以将堆区定位到任意自己想要的位置,size(0x00000C00)必须要与startup文件中的大小一致;
????????RW_IRAM3为栈区,通过这种方式可以将栈区定位到任意自己想要的位置,size(0x00000C00)必须要与startup文件中的大小一致。
4、其他
????????此文章基于 MCU STM32F103RCT6,64K RAM,256K ROM
友情提示:
? ? ? ? 1、具体的语法可以通过在 MDK 软件中按 F1键 来查找跟过详细的帮助。
? ? ? ? 2、此文章的方式一般是做 bootloader 并且需要使用中断,才需要做此操作,因为在bootloader中需要擦除和写入 Flash,如果中断函数定义在 Flash 中,当正在擦除或写入 Flash 时,中断来了,中断将不能及时得到执行。
|