硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4397|回复: 9
收起左侧

[RTOS] 【已更新】RTX5中SVC软中断和C连接符##的高级玩法

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2019-4-23 02:09:03 | 显示全部楼层 |阅读模式
代码如下:

  1. #if   ((defined(__ARM_ARCH_7M__)      && (__ARM_ARCH_7M__      != 0)) ||       \
  2.        (defined(__ARM_ARCH_7EM__)     && (__ARM_ARCH_7EM__     != 0)) ||       \
  3.        (defined(__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ != 0)))
  4. #define __SVC_INDIRECT(n) __svc_indirect(n)
  5. #elif ((defined(__ARM_ARCH_6M__)      && (__ARM_ARCH_6M__      != 0)) ||       \
  6.        (defined(__ARM_ARCH_8M_BASE__) && (__ARM_ARCH_8M_BASE__ != 0)))
  7. #define __SVC_INDIRECT(n) __svc_indirect_r7(n)
  8. #endif

  9. #define SVC0_0N(f,t)                                                           \
  10. __SVC_INDIRECT(0) t    svc##f (t(*)());                                        \
  11. __attribute__((always_inline))                                                 \
  12. __STATIC_INLINE   t  __svc##f (void) {                                         \
  13.   svc##f(svcRtx##f);                                                           \
  14. }

  15. #define SVC0_0(f,t)                                                            \
  16. __SVC_INDIRECT(0) t    svc##f (t(*)());                                        \
  17. __attribute__((always_inline))                                                 \
  18. __STATIC_INLINE   t  __svc##f (void) {                                         \
  19.   return svc##f(svcRtx##f);                                                    \
  20. }

  21. #define SVC0_1N(f,t,t1)                                                        \
  22. __SVC_INDIRECT(0) t    svc##f (t(*)(t1),t1);                                   \
  23. __attribute__((always_inline))                                                 \
  24. __STATIC_INLINE   t  __svc##f (t1 a1) {                                        \
  25.   svc##f(svcRtx##f,a1);                                                        \
  26. }

  27. #define SVC0_1(f,t,t1)                                                         \
  28. __SVC_INDIRECT(0) t    svc##f (t(*)(t1),t1);                                   \
  29. __attribute__((always_inline))                                                 \
  30. __STATIC_INLINE   t  __svc##f (t1 a1) {                                        \
  31.   return svc##f(svcRtx##f,a1);                                                 \
  32. }

  33. #define SVC0_2(f,t,t1,t2)                                                      \
  34. __SVC_INDIRECT(0) t    svc##f (t(*)(t1,t2),t1,t2);                             \
  35. __attribute__((always_inline))                                                 \
  36. __STATIC_INLINE   t  __svc##f (t1 a1, t2 a2) {                                 \
  37.   return svc##f(svcRtx##f,a1,a2);                                              \
  38. }

  39. #define SVC0_3(f,t,t1,t2,t3)                                                   \
  40. __SVC_INDIRECT(0) t    svc##f (t(*)(t1,t2,t3),t1,t2,t3);                       \
  41. __attribute__((always_inline))                                                 \
  42. __STATIC_INLINE   t  __svc##f (t1 a1, t2 a2, t3 a3) {                          \
  43.   return svc##f(svcRtx##f,a1,a2,a3);                                           \
  44. }

  45. #define SVC0_4(f,t,t1,t2,t3,t4)                                                \
  46. __SVC_INDIRECT(0) t    svc##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4);                 \
  47. __attribute__((always_inline))                                                 \
  48. __STATIC_INLINE   t  __svc##f (t1 a1, t2 a2, t3 a3, t4 a4) {                   \
  49.   return svc##f(svcRtx##f,a1,a2,a3,a4);                                        \
  50. }
复制代码


需要事先了解到的知识点:
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。

评分

参与人数 1金币 +20 收起 理由
missfox + 20 赞一个!

查看全部评分

回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2019-4-23 10:28:00 | 显示全部楼层
本帖最后由 missfox 于 2019-4-23 10:29 编辑

这么看代码,舒服了些
#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);                                       
}
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-4-23 12:50:44 | 显示全部楼层
至今看不懂这玩意,高级玩法啊
回复

使用道具 举报

4

主题

129

回帖

146

积分

初级会员

积分
146
发表于 2019-4-23 14:30:26 | 显示全部楼层
RT-Thread也是这种玩法
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2019-4-23 18:12:52 | 显示全部楼层
myxiaonia 发表于 2019-4-23 12:50
至今看不懂这玩意,高级玩法啊

是的,IDE把很多都封装好了,不好了解太细节的东西。
回复

使用道具 举报

610

主题

3062

回帖

4912

积分

至尊会员

积分
4912
发表于 2019-4-23 21:19:22 | 显示全部楼层
至今看不懂这玩意,高级玩法啊
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
发表于 2019-4-23 22:33:24 | 显示全部楼层
以前也觉的高级,现在是觉的能简单就简单
最早是在看linux内核的时候学习了。了解之后,总想在工程实践中秀一秀,再过了两年,感觉当时这种想法好SB
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2019-4-24 03:30:51 | 显示全部楼层
已经更新完毕。
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2019-4-24 10:46:32 | 显示全部楼层
更新了,赞一下
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-4-24 10:50:33 | 显示全部楼层
没有以前的RTX4简单明了了
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 06:54 , Processed in 0.302288 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表