19.2 RTX中SVC中断方式调用函数方法 用户实现SVC中断方式调用函数方法如下(下面以添加两个SVC中断为例): 第1步:添加SVC_Table.s文件。 我们在前面讲解RTX的源码移植方式时这个文件已经加上。 第2步:使用属性__svc(x)声明函数,x从1开始,范围1-255。函数名随便命名,但是x的数值一定要保证是连续递增的。
- void __svc(1) SVC_1_FunCall(uint8_t _arg1, uint16_t _arg2, uint32_t _arg3, uint64_t *_arg4);
- void __svc(2) SVC_2_FunCall(void);
复制代码
第3步:写上面两个函数的实际代码,并将函数名更改成__SVC_x格式(统一改成这种命名方式是为了跟RTX系统的调用方式__SVC_0统一),x是从1开始,范围1-255。上面声明的两个函数不要动,这里修改的是实际函数名。另外用户可以根据需要加上中断开关操作,因为SVC中断可以被其它高优先级的中断抢占。 /* ****************************************************************************************************** * 函 数 名: __SVC_1和__SVC_2系统服务号 * 功能说明: 被SVC中断所调用的__SVC_1和__SVC_2 * 形 参:无 * 返 回 值: 无 ****************************************************************************************************** */ //这里的__SVC_1就是函数SVC_1_FunCall void __SVC_1(uint8_t _arg1, uint16_t _arg2,uint32_t _arg3, uint64_t *_arg4) { __disable_irq(); printf("_arg1= %drn", _arg1); printf("_arg2= %drn", _arg2); printf("_arg3= %drn", _arg3); printf("_arg4= %lldrn", *_arg4); __enable_irq(); } //这里的__SVC_2就是函数SVC_2_FunCall void __SVC_2(void) { __disable_irq(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); __enable_irq(); } 第4步:将定义的两个函数添加到SVC_Table.s文件里面 首先使用IMPORT命令声明下,类似C语言中的extern。然后添加到SVC_Table列表下,整体添加后的效果如下(红色字体是用户添加的): AREA SVC_TABLE, CODE, READONLY EXPORT SVC_Count SVC_Cnt EQU (SVC_End-SVC_Table)/4 SVC_Count DCD SVC_Cnt ; Import user SVC functions here. IMPORT __SVC_1 IMPORT __SVC_2 EXPORT SVC_Table SVC_Table ; Insert user SVC functions here. SVC 0 used byRTL Kernel. DCD __SVC_1 ; user SVC function DCD __SVC_2 ;user SVC function SVC_End END
至此,RTX中SVC中断的调用就实现了。实际应用的时候,用户只需调用函数SVC_1_FunCall和SVC_1_FunCall即可,这两个函数就是在SVC中断里面实现的。
|