如何在 C 中创建内联汇编函数?

问题描述

我正在使用 MSP 432 并且必须在 C 中创建一个程序集函数。我尝试使用 __asm void PendSV_Handler{} 创建函数。但这不起作用,并说需要一个标识符。

此外,我正在尝试运行此汇编命令 cpsid i,但它说 cpsID 未定义但 cpsIE i 有效。在这一点上我有点困惑。我对此还很陌生,我仍在学习。

下面是我试图组装的代码。我尝试通过执行 __asm void PendSV_handler 来制作函数程序集。

我不确定创建一个 asm 是否会更容易。包含这些说明的文件

OSThread *volatile OS_curr;
OSThread *volatile OS_next;

void PendSV_Handler(void){


__asm__("cpsid      i"

//if(OS_curr != (OSThread *)0)
        "ldr        r0,=OS_curr"
        "ldr        r0,[r0]"
        "cbz        r0,PendSV_restore");

// Push r4  - r11
__asm__("PUSH {r4-r11}"

        "ldr        r1,=OS_curr"
        "ldr        r1,[r1]"

// OS_curr -> sp = sp;
        "str         sp,[r1]");

PendSV_restore

// sp=OS_next -> sp;
        __asm__("ldr r0,=OS_next;"
                "ldr        r0,[r0]"
                "ldr        r0,[r0]"
                "str        sp,[r13]");

// OS_curr = OS_next;
        __asm__("ldr        r0,=OS_next"
                "ldr        r1,[pc,0xc]"
                "ldr        r0,=OS_curr"
                "str        r0,[r1]"

//Pop  r4-r11
                "POP        {r4-r11}"

//            __enable_interrupts();
                "cpsie      i"

//return to next thread
                "bx         r14");

}

解决方法

内联汇编器语法未在 C 编程语言中重新定义,其支持和语法是特定于编译器的。在海湾合作委员会中:

{{1}}
,

参考

内联汇编语法未在 C 编程语言中重新定义

我过去做过一个大学项目

inline void function(param1,param2)
{
   asm volatile ("param1");
   asm volatile ("param2");
}

但是,如果您在 ARM 上工作,请查看指令集以了解哪些命令是可能的

举个例子: 如果你想写一些时间关键的东西,需要按照书面顺序你可以做这样的事情

inline void COLOUR_GLCD_write_address_data(uint8_t address,uint16_t data)
{
  asm volatile ("DMB");
  *(volatile uint16_t*)LCD_CMD_ADDRESS = address; 
  asm volatile ("DMB");
  *(volatile uint16_t*)LCD_DATA_ADDRESS = data; 
}

这是为了通过 Atmel SAME70 上的总线接口将数据发送到外部液晶显示器。 希望有所帮助 =)