我正在尝试在 lpc 1769 (cortex m3) 上进行上下文切换。我正在尝试编写一个计算数字指数的例程,在用户模式下将其作为子例程运行,但使用 SVC 调用和中断处理程序来要求 SVC 进程代表它与终端交互。要打印的值应作为寄存器参数传递给 SVC。
如果我从用户模式切换到主模式,如何将存储在用户模式堆栈中的值切换到主模式?
任何人都可以为上述查询编写一个小程序吗?
先感谢您。
您最多可以轻松传递四个参数。只需编写一个 C 函数并使用内联汇编程序调用主管:
#define svc(code) asm volatile ("svc %[immediate]"::[immediate] "I" (code))
#define SVC_WRITE_DATA 1
void sv_call_write_data(char *string, int length)
{
svc(SVC_WRITE_DATA);
}
请参阅第 3 点,如何在主管调用处理程序中提取这些参数。
您可以直接从用户模式堆栈中获取值。使用内联汇编器确定调用者使用的堆栈:
asm volatile(
"tst lr, #4\t\n" /* Check EXC_RETURN[2] */
"ite eq\t\n"
"mrseq r0, msp\t\n"
"mrsne r0, psp\t\n"
"b %[sv_call_handler_main]\t\n"
: /* no output */
: [sv_call_handler_main] "i" (sv_call_handler_main) /* input */
: "r0" /* clobber */
);
由于我目前也在为此烦恼,所以我写了一篇关于它的博客文章。您的 IDE 使用 GCC,因此这也适用于您:http: //falstaff.agner.ch/2013/02/18/cortex-m3-supervisor-call-svc-using-gcc/