|
RTX5中的这种定义方式,简直没人性,太高级了,玩不转,不过还是实现了这种方式的自定义使用方法:
- #define SVC0_3(f,t,t1,t2,t3) \
- __SVC_INDIRECT(0) t svc##f (t(*)(t1,t2,t3),t1,t2,t3); \
- __attribute__((always_inline)) \
- __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3) { \
- return svc##f(svcRtx##f,a1,a2,a3); \
- }
- #define SVC0_4(f,t,t1,t2,t3,t4) \
- __SVC_INDIRECT(0) t svc##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4); \
- __attribute__((always_inline)) \
- __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3, t4 a4) { \
- return svc##f(svcRtx##f,a1,a2,a3,a4); \
- }
复制代码

SVC 的0号系统服务被 RTX5 系统占用,即 SVC 0,当前列出的SVC0_X都是用的SVC 0中断。而用户可以使用从 1 开始的服务号。使用的时候要保证从 1 开始,连续递增使用,范围 1 – 255。
方法一:
1、这里下载个V7的RTX5例子:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93238
2、比如实现函数svcUsertest的SVC软中断调用:
添加如下代码:
- void svcUsertest(void)
- {
- bsp_SetTIMforInt(TIM6, 10,0,0);
- }
- #define SVC1_0N(f,t) \
- __SVC_1 t svc##f (t(*)()); \
- __attribute__((always_inline)) \
- __STATIC_INLINE t __svc##f (void) { \
- svc##f(svcUser##f); \
- }
- SVC1_0N(test, void);
- void * const osRtxUserSVC[2] = {(void *)1, svcUsertest};
复制代码
解释下osRtxUserSVC,这个是在RTX5的port文件里面要调用的,第1个参数是要自定义的函数个数,我们这里仅定义了一个,这里就写1即可。
3、用户调用的时候要写函数__svctest(),这点要特别注意。
4、由于调用的定时器中断,添加上一个中断函数处理:
- void TIM6_DAC_IRQHandler(void)
- {
- if((TIM6->SR & TIM_FLAG_UPDATE) != RESET)
- {
- TIM6->SR = ~ TIM_FLAG_UPDATE;
- bsp_LedToggle(4);
- }
- }
复制代码
方法二:
1、同方法1,下载V7的RTX5的例子。
2、比如要实现函数bsp_SetTIMforInt的软中断调用,添加如下代码:
- #define __SVC_1 __svc_indirect(1)
- #define OS_SetTIMforInt(t1,t2,t3,t4) _bsp_SetTIMforInt((uint32_t)bsp_SetTIMforInt, t1,t2,t3,t4)
- void _bsp_SetTIMforInt(uint32_t p, TIM_TypeDef* TIMx, uint32_t _ulFreq, uint8_t _PreemptionPriority, uint8_t _SubPriority) __SVC_1;
- void * const osRtxUserSVC[2] = {(void *)1, bsp_SetTIMforInt};
复制代码
3、调用的时候写函数OS_SetTIMforInt(TIM, 10, 0, 0);
4、由于调用的定时器中断,添加上一个中断函数处理:
- void TIM6_DAC_IRQHandler(void)
- {
- if((TIM6->SR & TIM_FLAG_UPDATE) != RESET)
- {
- TIM6->SR = ~ TIM_FLAG_UPDATE;
- bsp_LedToggle(4);
- }
- }
复制代码
|
|