问题描述
我正在使用 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 上的总线接口将数据发送到外部液晶显示器。 希望有所帮助 =)