c - 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?
解决方案
这个函数根本没有编译器生成的代码,只有你看到的汇编指令执行。所以这真的不是一个 C 函数,而是一个汇编函数。确保在汇编指令执行之前绝对没有添加代码是赤裸裸的,因为FreeRTOS 内核必须完全控制堆栈和寄存器的使用方式。如果你去掉了裸属性,即使你用中断属性替换它,代码也根本不会执行——它肯定会崩溃。
推荐阅读
- javascript - 节点 JS。Uncaught (in promise) ReferenceError: require is not defined
- python - 无法防止斐波那契“for”循环迭代中的“列表索引超出范围”错误
- reactjs - 从 React 将令牌传递给 axios 的正确方法是什么?
- kotlin - Kotlin MutableList.take 到位了吗?
- prestashop-1.7 - 重定向prestashop很多
- r - 通过 ID 加入或合并 r 中具有不同行数的多个数据集,并通过创建函数删除不匹配的行
- javascript - 使用 jest.unstable_mockModule 模拟 ES6 模块时遇到问题
- c++ - 使用 bgpdump 工具将 MRT RIB 转换为可读格式
- sql - 在 T-SQL 中的主 Select 语句上引用 Group By 中的子查询时出错
- javascript - 更新方法角json服务器