首页 > 解决方案 > C 裸函数 - 在 1 个函数中执行汇编和 c 代码的灼热解决方案

问题描述

我喜欢追踪 freertos isr 的。freertos 用于 2 个 isr (irq handler) 裸函数。

id 喜欢在入口级和出口级进行跟踪调用,如下所示(未注释)

#warning "system no longer operating with trace call since naked,.. solve"
void vPortSVCHandler( void )
{
  //hal_trace_wrapper_isr_enter(SVCall_IRQn); // modified

    __asm volatile (
                    "   ldr r3, pxCurrentTCBConst2      \n" /* Restore the context. */
                    "   ldr r1, [r3]                    \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */
                    "   ldr r0, [r1]                    \n" /* The first item in pxCurrentTCB is the task top of stack. */
                    "   ldmia r0!, {r4-r11}             \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */
                    "   msr psp, r0                     \n" /* Restore the task stack pointer. */
                    "   isb                             \n"
                    "   mov r0, #0                      \n"
                    "   msr basepri, r0                 \n"
                    "   orr r14, #0xd                   \n"
                    "   bx r14                          \n"
                    "                                   \n"
                    "   .align 4                        \n"
                    "pxCurrentTCBConst2: .word pxCurrentTCB             \n"
                );

  //hal_trace_wrapper_isr_exit(SVCall_IRQn); // modified
}

快速的想法是在自己的函数中提取裸露的部分。但是随后堆栈指针将带有偏移量,我怀疑我完全破坏了系统。

是否有另一种解决方案可以在 1 个函数中同时执行 c 和 asm?

标签: cfreertos

解决方案


这个函数根本没有编译器生成的代码,只有你看到的汇编指令执行。所以这真的不是一个 C 函数,而是一个汇编函数。确保在汇编指令执行之前绝对没有添加代码是赤裸裸的,因为FreeRTOS 内核必须完全控制堆栈和寄存器的使用方式。如果你去掉了裸属性,即使你用中断属性替换它,代码也根本不会执行——它肯定会崩溃。


推荐阅读