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

  2. 如果我做模式从用户模式切换到主模式,我怎样才能获得存储在用户模式堆栈中的值到主模式?

  3. 任何人都可以为上述查询写一个小程序吗?

在此先感谢您。

+0

我想在nxp lpc xpresso IDE上使用它。谢谢 – 2013-02-11 11:10:54

回答

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); 
    } 
    

看点三如何提取的管理程序调用处理程序的参数。

  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. 由于我目前正与该hassling周围太,我写了一个关于它的博客文章。你的IDE使用GCC,所以这也应该适用于你:http://falstaff.agner.ch/2013/02/18/cortex-m3-supervisor-call-svc-using-gcc/