|
代码如下:
- #if ((defined(__ARM_ARCH_7M__) && (__ARM_ARCH_7M__ != 0)) || \
- (defined(__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ != 0)) || \
- (defined(__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ != 0)))
- #define __SVC_INDIRECT(n) __svc_indirect(n)
- #elif ((defined(__ARM_ARCH_6M__) && (__ARM_ARCH_6M__ != 0)) || \
- (defined(__ARM_ARCH_8M_BASE__) && (__ARM_ARCH_8M_BASE__ != 0)))
- #define __SVC_INDIRECT(n) __svc_indirect_r7(n)
- #endif
- #define SVC0_0N(f,t) \
- __SVC_INDIRECT(0) t svc##f (t(*)()); \
- __attribute__((always_inline)) \
- __STATIC_INLINE t __svc##f (void) { \
- svc##f(svcRtx##f); \
- }
- #define SVC0_0(f,t) \
- __SVC_INDIRECT(0) t svc##f (t(*)()); \
- __attribute__((always_inline)) \
- __STATIC_INLINE t __svc##f (void) { \
- return svc##f(svcRtx##f); \
- }
- #define SVC0_1N(f,t,t1) \
- __SVC_INDIRECT(0) t svc##f (t(*)(t1),t1); \
- __attribute__((always_inline)) \
- __STATIC_INLINE t __svc##f (t1 a1) { \
- svc##f(svcRtx##f,a1); \
- }
- #define SVC0_1(f,t,t1) \
- __SVC_INDIRECT(0) t svc##f (t(*)(t1),t1); \
- __attribute__((always_inline)) \
- __STATIC_INLINE t __svc##f (t1 a1) { \
- return svc##f(svcRtx##f,a1); \
- }
- #define SVC0_2(f,t,t1,t2) \
- __SVC_INDIRECT(0) t svc##f (t(*)(t1,t2),t1,t2); \
- __attribute__((always_inline)) \
- __STATIC_INLINE t __svc##f (t1 a1, t2 a2) { \
- return svc##f(svcRtx##f,a1,a2); \
- }
- #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); \
- }
复制代码

需要事先了解到的知识点:
1、了解这个之前要先了解SVC软中断,这个知识点在RTX4教程的第19章有说明
http://www.armbbs.cn/forum.php?mod=viewthread&tid=14837
2、SVC 的0号系统服务被 RTX5 系统占用,即 SVC 0,当前列出的SVC0_X都是用的SVC 0中断。
而用户可以使用从 1 开始的服务号。使用的时候要保证从 1 开始,连续递增使用,范围 1 – 255。
3、RTX5的任务级API函数都是通过SVC 0软中断调用的,这点非常重要。
然后举个例子,就好理解了。
(1)下面是RTX5的定义
#define SVC0_0(f,t) \
__SVC_INDIRECT(0) t svc##f (t(*)()); \
__attribute__((always_inline)) \
__STATIC_INLINE t __svc##f (void) { \
return svc##f(svcRtx##f); \
}
(2)用户要使用的话,就得例化下SVC0_0
SVC0_0 (KernelInitialize, osStatus_t)
然后将其代入宏定义,就是下面这个样子
#define SVC0_8(KernelInitialize, osStatus_t)
__SVC_INDIRECT(0) osStatus_t svcKernelInitialize (t(*)());
__attribute__((always_inline)) __STATIC_INLINE osStatus_t __svcKernelInitialize (void)
{
return svcKernelInitialize(svcRtxKernelInitialize);
}
__SVC_INDIRECT(0) osStatus_t svcKernelInitialize (t(*)()); 这个函数的作用就是,调用到svcKernelInitialize的地方将以SVC 0号中断服务程序里面执行
当用户调用函数__svcKernelInitialize时,就会触发SVC 0 中断里面调用函数svcRtxKernelInitialize,这个函数是RTX5的原始API函数。
从而实现SVC中断里面调用RTX5的API。
|
评分
-
查看全部评分
|