我正在开发一个基于C++的RTOS,我需要知道使用内联ARM程序集的正确语法,以允许类成员函数生成具有正确参数设置的SVC指令,从而进入内核。
内核将提取SVC指令的8位用户定义代码,并将其用作成员函数指针表的索引,其思想是SVC指令从PSP堆栈指针切换到MSP,并使用MSP堆栈在监督模式下执行成员函数代码。
目标是Cortex-M4处理器,我正在使用-std=C++20编译选项与社区C++17编译器合作。
例如:
struct Foo
{
void something (int a , void * b) // Called by a task
{
asm volatile ("svc #00" : : "r" (a) , "r" (b) : "memory") ; // Guessing here...
}
void something_svc (int a , void * b)
{
... // Having the 'this' pointer and member function pointer 'something_svc', how to call it from inline ASM?
}
} ;
我尝试了很多不同的方法(
属性
((noinline))等),而我无法获得正确的语法来使其正确工作。
有时is工作得很好,然后我添加一个随机的“printf”进行测试,编译器会将内联asm代码重新排列到它现在被破坏的位置。
我看过GCC内联ASM食谱、GCC用户文档和许多在线文章,但似乎仍然找不到正确的方法来实现这一点。
理想情况下,任务调用将为“this”指针和两个参数生成mimimal代码:Setup r0/r1/r2,然后发出SVC#nn指令。
SVC处理程序将提取SVC 8位“nn”字段,为成员函数指针表编制索引,并使用从PSP堆栈中剥离的“this”指针和参数调用成员函数。
实现此C++到ASM到C++接口的正确机制/语法是什么?