我混合使用C和ASM代码在STCubeIDE中编写STM32H745.

我有以下 struct 来确保在两个核心CM4和CM7之间共享的变量的严格排序:

struct miscSharedMemoryStruct {
   volatile uint32_t triggerPtr;
   volatile uint32_t bufferHead;
}
__attribute__((section(".sram3"))) struct miscSharedMemoryStruct miscSharedMemory;

.sram3节是在链接器脚本中定义的,在两个内核的C代码中访问我的变量效果很好.到现在为止还好.然而..

为了允许访问miscSharedMemory个条目,我在ASM代码中将变量设置为全局:

.global miscSharedMemory

为了使汇编器能够识别正确的地址,我在头文件中添加了以下定义语句,其中定义了上面的 struct :

#define BUFFER_HEAD_ADR  ((uintptr_t)(&miscSharedMemory.bufferHead))

最后,我们的 idea 是将上述地址中的数据放入ASM代码中的一个寄存器中:

ldr R1, =BUFFER_HEAD_ADR

但是,在编译我的代码时,我得到一个

未定义对‘BUFFER_HEAD_ADR’的引用

What is the correct way to make the assembler recognize the right address to my variable in the struct?我可能不需要做.global语句,只要BUFFER_HEAD_ADR中存储的地址是正确的,并被汇编程序识别,但我只是不知道如何让它工作.

推荐答案

Address Calculation Solution for Assembly in STM32H745

为了应对在STM32H745微控制器的汇编代码中动态计算地址的挑战,我精心设计了一个解决方案,该解决方案优先考虑灵活性和透明度,而不求助于脚本提取或硬编码值.

1. Initial Problem:个 目标是从汇编中的特定地址加载数据,而不对其进行硬编码,考虑到代码的演变性质以及访问跨不同内核的共享内存时的可预测性的必要性.

一百零七 为了维护内核之间共享的变量的严格排序,引入了名为miscSharedMemoryStructstruct.这struct驻留在.sram3部分,包含triggerPtrbufferHead这样的变量.

3. Dynamic Address Storage: 挑战在于在编译时动态计算miscSharedMemory.bufferHead的地址,因为实际地址在链接器定义它之前是未知的.

4. Register-Relative Load Solution:个 其核心理念包括:

  1. 使用寄存器相对加载,而不是我在第一篇文章中使用的PC相对加载
  2. 汇编代码的第.data段中地址的存储.

5. C Code:

struct miscSharedMemoryStruct {
   volatile uint32_t triggerPtr;
   volatile uint32_t bufferHead;
} __attribute__((section(".sram3"))) struct miscSharedMemoryStruct miscSharedMemory;

extern volatile uint32_t *bufferHeadAdr;
bufferHeadAdr = (uint32_t *) &miscSharedMemory.bufferHead;

6. ASM Code:

.global bufferHeadAdr


.data

CBAdr:
variableA:     .word 0
variableB:     .word 0
.
.
bufferHeadAdr: .word 0
.
.


.text

LDR R0, =CBAdr
LDR R1, [R0, #bufferHeadAdr - CBAdr]

在汇编代码中,bufferHeadAdr被声明为全局的,其地址存储在.data部分中.然后使用寄存器相对寻址将实际地址加载到寄存器R1中.

请注意,在我的特定情况下,LDR R0, =CBAdr的利用率不会引起运行时影响.我无论如何都会声明R0,并在我的代码中保持不变,以便于广泛访问我的.data部分中的其他数据.

C++相关问答推荐

数组元素的编号索引

是否可以在C中进行D3 D12申请?

如何创建由符号组成的垂直结果图形?

从纯C中访问通用项对话框

如何创建一个C程序来存储5种动物的名字,并在用户 Select 其中任何一种动物时打印内存地址?

为什么cudaFree不需要数据 struct 的地址?

进程已完成,退出代码为138 Clion

GTK3按钮信号错误

如何计算打印二叉搜索树时每行所需的空间?

用C语言计算文本文件中的整数个数

Boyer Moore算法的简单版本中的未定义行为

如何使用libgpio(d)为Raspberry Pi编译C程序?

我在反转双向链表时遇到问题

为什么这个分配做得不好呢?

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

程序打印一些随机空行

当另一个指向 const 的指针观察到数据时,通过指针更改数据是否安全?

Linux memcpy 限制关键字语法

free后内存泄漏?

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?