0

我正在使用 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");

}
4

2 回答 2

0

参考

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 上的 BUS 接口将数据发送到外部液晶显示器。希望有所帮助=)

于 2021-01-18T19:56:51.983 回答
0

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

void PendSV_Handler(void) 
{
    __asm__("cpsid      i");

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

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

    __asm__("ldr        r1, =OS_curr");
    __asm__("ldr        r1, [r1]");

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

PendSV_restore:

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

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

//Pop  r4-r11
    __asm__("POP        {r4-r11}");

//            __enable_interrupts();
    __asm__("cpsie      i");

//return to next thread
    __asm__("bx         r14");
}
于 2021-01-15T20:29:17.290 回答