STM32F427将函数设定在固定位置 STM32F427 基于 Cortex-M4F、GD32/STM32 通用编译器Keil MDK、GCC/STM32CubeIDE、IAR都支持通过「编译器段属性 链接脚本」两步把函数放到固定地址。核心思路是__attribute__((section(...)))只负责把函数放进自定义段真正决定地址的是链接脚本里对该段的定位。方法一Keil MDK最常用于 STM32F4Keil 用分散加载文件.sct控制内存布局。第 1 步在.sct文件中新增 Flash 段LR_IROM1 0x08000000 0x00100000 { ; 加载域地址按你的工程实际Flash起点/大小调整 ; ...其他默认段... ER_MYFUNC 0x08060000 0x2000 { ; 执行域函数固定到 0x08060000 *(.my_func) ; 收集所有标记为 .my_func 的代码 } ; ...其余段... }【也可用 FIXED 属性】ER_MYFUNC 0x08060000 FIXED { *(.my_func) }第 2 步在 C 代码中用段属性标记函数#define MY_FLASH __attribute__((section(my_func))) MY_FLASH void test_function(void) { return 1; }编译后在 map 文件中即可确认test_function是否定位到 0x08060000。方法二GCC / STM32CubeIDEGCC 同样用__attribute__((section))标记然后在.ld链接脚本中指定段地址。C 代码标记void my_function(void) __attribute__((section(.my_func))); void my_function(void) { /* 函数体 */ }链接脚本.ld中定位SECTIONS { ... .my_section 0x10000000 : { *(.my_section) /* 所有标记 .my_section 的部分 */ } }也可以使用 ARM 编译器提供的「__at 段」直接以地址命名void Communication_Test(u8 *in, u8 *out, u8 len) __attribute__((section(.ARM.__at_0x00031000)));其中.ARM.__at_address的地址即该函数被放置的位置。方法三IARIAR 用#pragma location指定地址例如#pragma location 0x00031000 void my_func(void);关键注意事项段属性≠地址__attribute__((section))只决定函数进入哪个段最终地址必须由链接脚本分配二者缺一不可。防止被优化丢弃若函数未被调用链接器可能剔除它。GCC 下用__attribute__((used))或链接脚本中的KEEP(...)保留例如KEEP((*(.boot.init)))Keil 下也建议用__attribute__((used))。地址对齐Flash 段建议使用ALIGN(4)因为 Cortex-M 指令尤其 Thumb-2要求按半字/字对齐函数地址通常需 4 字节对齐。.my_func 0x08060000 : ALIGN(4) { *(.my_func) }多函数顺序同一段内多个函数按声明顺序存放GCC/IDE 下可据此安排相对位置。验证编译后务必打开 map 文件或使用反汇编、nm工具确认目标函数确实位于期望地址这是最可靠的检查方式。未使用函数保留若函数不在调用链中且开-ffunction-sections链接时可能被 section GC 移除需配合KEEP/used处理。