gpt4 book ai didi

c - 使用全局 C 变量的 IAR 内联汇编

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:14 24 4
gpt4 key购买 nike

我正在使用 IAR Embedded Workbench for ARM 6.50.4 Functional Safety Version 6.50而且我似乎无法使汇编内联指令正常工作。

背景:我正在尝试使用 PIT 中断在 ARM7TDMI 上实现上下文切换。保存当前上下文时,我必须获取中断函数的堆栈地址,该地址保存在一个全局 C 变量中,该变量在同一个 c 文件中声明:

unsigned int* ptTask_CurrentTask;

__irq void SysIrqHandler( void )
{
// ... saving registers
__asm volatile( "LDR R0, %0\n\t" ::"r"(ptTask_CurrentTask) );
//... save the new top of stack
//select new task and restore associated registers
}

根据我从 EWARM_DevelopmentGuide.ENU.pdf 中收集到的信息,上面的说明应该使用正确的语法。我也尝试了不同的格式化指令的方法,但我得到的是:

错误[og006]:内联汇编中的语法错误:“错误[401]:操作数语法错误”

现在,当我将完整的上下文保存程序集例程导出到一个单独的 .s 文件并从 c 调用该函数时,以下指令工作正常。LDR R0,=ptTask_CurrentTask

由于汇编指令在他们自己的工作中,所以我执行内联汇编指令的方式肯定有问题,但我看不出有什么问题。

最佳答案

“r”约束指示通用寄存器,因此它最终发出 LDR R0, Rx 这确实是无效语法。如果您真的想在汇编代码中执行实际的指针取消引用,请直接嵌入正确的语法:

__asm volatile( "LDR R0, [%0]\n\t" ::"r"(ptTask_CurrentTask));

或者,更好的是,使用适当的约束来指示它是内存操作数(指针)并将语法留给编译器:

__asm volatile( "LDR R0, %0\n\t" ::"m"(ptTask_CurrentTask));

或者浪费一条额外的指令,让编译器去操心负载:

__asm volatile( "MOV R0, %0\n\t" ::"r"(*ptTask_CurrentTask));

无论哪种方式,直接触摸 r0 而不在 clobber 列表中声明它可能是一个坏主意......

关于c - 使用全局 C 变量的 IAR 内联汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28761599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com