一、新增flash区域
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K
FLASH1 (rx) : ORIGIN = 0x00020000, LENGTH = 224K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
二、新增txt段
.text1 :
{
. = ALIGN(4); /*设置当前位置指针向前移动到下一个 4 字节对齐的位
置*/
KEEP(*(.text1.used)) /*使用 KEEP 指令保留所有输入文件中名为 .text1.used
的段。
KEEP 指示链接器即使在优化过程中也不应丢弃这些段
的内容,确保它们始终包含在最终的映像中。
通常用于标记重要的初始化代码、中断向量表等必须存
在的部分。*/
*(.text1) /*将所有输入文件中名为 .text 的段的内容合并到当前
定义的 .text 输出段*/
*(.text1.const)
*(.text1.func)
*(.text1.*) /*合并所有以 .text. 开头的其他子段,这些通常是编译
器为特定功能(如内联汇编、特定编译选项生成的代码等)生成的特殊文本段*/
. = ALIGN(4);
} >FLASH1 AT>FLASH1 /*指定 .text 段以及其包含的所有子段应当被放置在名
为 FLASH 的存储区域中
表示虽然 .text 段的内容会被存储在 FLASH 中,但在
运行时,CPU应从 FLASH 中加载这部分内容到内存中
这里的 AT 关键字指示了段的实际存储位置(物理地
址),而>操作符则指定了运行时的加载地址(虚拟地址)
*/
三、使用 attribute 对常量与函数进行修饰
// 该属性表示编译器将带有此属性的变量放入名为 .text1.const 段
__attribute__((section(".text1.const"))) const u8 DataTab[6] = {0x00,0x11,0x2
2,0x33,0x44,0x55};
// 该属性表示编译器将带有此属性的变量放入名为 .text1.func 段
__attribute__((section(".text1.func"))) void CPUDelay(volatile uint32_t us){
while(us--){
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP
();__NOP();
}
}