如何给ARM写好⼀个SVC功能橡胶补强剂
Cortex-M 内核⽀持系统服务调⽤SVC(SuperVisor Call)指令,⽤户可以⽤这个指令⼿动触发⼀个异常,这有时候⾮常有⽤,例如当内核运⾏在⾮特权模式时想要修改只有在特权模式才能接⼊的特殊寄存器,异常处理只能运⾏在特权模式。 但是它如何运⾏和⽤户使⽤的编译器版本息息相关,如果有其他的软件模块可⽤的话,他们通常已经实现了SVC异常的处理,⽐如CMSIS RTOS。 1 触发SVC
⾸先程序代码中必须要插⼊SVC指令,这个指令有⼀个参数(Thumb code 0-255)来选择不同的SVC调⽤函数,下⾯的例⼦⽤来产⽣ SVC 0。但请考虑到,⼯程中的其它软件模块或许已经使⽤了,那样请使⽤其他参数值。 简易频谱分析仪若使⽤ARMCC,这个编译器能识别 __svc 关键字,因此能很简单的定义SVC函数如下,调⽤该函数能在当前位置产⽣⼀个SVC指令。缘114>雨水口施工
headcallvoid __svc(0) EnablePrivilegedMode( void ) ;
2 处理SVC
当使⽤RTOS时,⼀般都已经实现了SVC的处理,这样需要查看RTOS的⽂档来确定如何添加⼀个额外的⽤户SVC请求。在其他需要⽤户程序实现SVC的情况下,⼀般都需要特定的语法并使⽤汇编代码实现。下⾯使⽤Cortex-M3的例⼦⽤来说明(ARMCC编译器),它⽀持有条件的执⾏指令。 鞋架
这个函数以SVC_Handler_Main()结束,这是个普通的c函数,这个函数需要在堆栈返之前查看指令以确定SVC号,SVC0在本例中⽤来关闭特权模式。