首页 > 解决方案 > 预期在 ARM 中的装配“)”

问题描述

我正在尝试在 C 中运行一些程序集。但我不断收到此错误。我不确定为什么。我知道混合汇编和 C 不是一个好习惯,但我是新手,如果可能的话,我想将所有的 C 转换为汇编。我认为我不需要该属性,但我试图做一些事情来纠正这个错误。错误来自这一行:

__asm("   LDR r1, %[OS_curr] \n"
::"r" (OS_curr)
);

我在 MSP432 微控制器 ARM 编译器上运行它。谢谢你。

void PendSV_Handler() __attribute__((naked));
void PendSV_Handler(void)

{
OSThread *volatile OS_currcopy;
OS_currcopy = OS_curr;
void *sp;
__disable_interrupt();
__asm("   LDR r1, %[OS_curr] \n"
        ::"r" (OS_curr)
   );
if(OS_curr != (OSThread *) 0){
    asm("   PUSH {r4-r11}");
    OS_curr -> sp = sp;
}
sp = OS_next -> sp;
OS_curr = OS_next;

asm("   POP {r4-r11}");
__enable_interrupt();
}

.global         OS_curr
.global         OS_next
.global         PendSV_HandlerAsm

.curradd: .word OS_curr
.currnext: .word OS_next

PendSV_HandlerAsm:
CPSID      i

;if(OS_curr != (OSThread *)0)
LDR        r1, .curradd
LDR        r1, [r0]
CBZ        r1, PendSV_restore

;Push r4  - r11
PUSH {r4-r11}

LDR        r1, .curradd
LDR        r1, [r1]

;OS_curr -> sp = sp;
STR        sp, [r1]

PendSV_restore:

;sp=OS_next -> sp;
LDR        r1, .currnext
LDR        r1, [r0]
LDR        r1, [r0]
STR        sp, [r13]

;OS_curr = OS_next;
LDR        r1, .currnext
LDR        r1, [r1]
LDR        r2, .curradd
LDR        r1, [r1]

;Pop  r4-r11
POP        {r4-r11}

;__enable_interrupts();
CPSIE      i

;return to next thread
BX         r14

标签: carminline-assemblyrtos

解决方案


推荐阅读