常量和函数放置在flash的指定区域
一、新增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(); } }
浙公网安备 33010602011771号