代码之家  ›  专栏  ›  技术社区  ›  cookiecipher

使用C++类中的参数由该类的成员进行ARM SVC调用的语法是什么?

  •  0
  • cookiecipher  · 技术社区  · 2 年前

    我正在开发一个基于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++接口的正确机制/语法是什么?

    0 回复  |  直到 2 年前