lpc 1769上下文切换

时间:2013-02-11 11:09:21

标签: cortex-m3 lpc

  1. 我正在尝试在lpc 1769(cortex m3)上进行上下文切换。我正在尝试编写一个计算数字指数的例程,在用户模式下将其作为子例程运行,但使用SVC调用和中断处理程序要求SVC进程代表它与终端进行交互。要打印的值应作为寄存器参数传递给SVC。

  2. 如果我从用户模式切换到主模式,如何将用户模式堆栈中存储的值转换为主模式?

  3. 有人可以为上述查询编写一个小程序吗?

  4. 提前谢谢你。

1 个答案:

答案 0 :(得分:1)

  1. 您最多可以传递四个参数。只需编写一个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);
    }
    
  2. 参见第3点如何在管理程序调用处理程序中提取这些参数。

    1. 您可以直接从用户模式堆栈中获取值。使用内联汇编程序来确定调用者使用的堆栈:

          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 */
          );
      
    2. 由于我现在也在讨论这个问题,我写了一篇关于它的博客文章。您的IDE使用GCC,因此这也适用于您:http://falstaff.agner.ch/2013/02/18/cortex-m3-supervisor-call-svc-using-gcc/