如何在STM32汇编代码中访问C结构体成员
解决汇编中访问STM32双核心共享结构体成员地址的问题
问题根源
汇编器无法直接识别C语言的宏定义(BUFFER_HEAD_ADR是C预处理器生成的符号),且ldr R1, =XXX伪指令要求XXX是汇编能识别的全局符号、常量或链接器可解析的表达式,这是报错的核心原因。
可行解决方案
方案1:汇编中直接计算成员偏移量
C结构体成员的内存偏移是固定的,可通过C编译器获取偏移后在汇编中直接使用:
- 在C代码中添加编译时打印偏移的代码:
编译后控制台会输出类似#include <stddef.h> // 编译时输出bufferHead的偏移值 #define STRINGIFY(x) #x #pragma message("offsetof(bufferHead) = " STRINGIFY(offsetof(struct miscSharedMemoryStruct, bufferHead)))offsetof(bufferHead) = 4的结果(因uint32_t占4字节)。 - 在汇编中通过全局变量基地址加偏移获取成员地址:
.global miscSharedMemory // 加载结构体基地址到R0 ldr R0, =miscSharedMemory // 加上偏移量得到bufferHead地址,存入R1 add R1, R0, #4
方案2:让C编译器导出汇编可识别的符号
在C头文件中定义全局常量,让编译器导出符号供汇编使用:
#include <stdint.h> #include <stddef.h> struct miscSharedMemoryStruct { volatile uint32_t triggerPtr; volatile uint32_t bufferHead; }; extern struct miscSharedMemoryStruct miscSharedMemory; // 定义全局常量并导出符号 const uintptr_t BUFFER_HEAD_ADR = (uintptr_t)(&miscSharedMemory.bufferHead); // 可选:若需放入共享SRAM3,添加段属性 // const uintptr_t BUFFER_HEAD_ADR __attribute__((section(".sram3"))) = (uintptr_t)(&miscSharedMemory.bufferHead);
然后在汇编中声明该符号并直接使用:
.global BUFFER_HEAD_ADR ldr R1, =BUFFER_HEAD_ADR
方案3:通过链接器脚本定义符号
直接在链接脚本中添加结构体成员的地址符号:
// 在.sram3段定义后添加 miscSharedMemory_bufferHead = miscSharedMemory + 4; // 4为bufferHead的偏移量
之后在汇编中直接使用该链接器生成的符号:
.global miscSharedMemory_bufferHead ldr R1, =miscSharedMemory_bufferHead
内容的提问来源于stack exchange,提问作者Hansel
相关产品推荐
相关产品推荐

