硬汉嵌入式论坛

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

[RL-RTX] RTX5任务切换原理是什么???

[复制链接]

13

主题

89

回帖

128

积分

初级会员

积分
128
发表于 2023-10-31 14:34:41 | 显示全部楼层 |阅读模式
RT,好像没找到相关资料,有没有老大知道的科普一下,看源码太慢了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2023-10-31 15:04:04 | 显示全部楼层
RTX5有个关键的设计是所有API都是在SVC软中断里面调用的,其它的就好理解了,也是PendSV做任务切换。
回复

使用道具 举报

13

主题

89

回帖

128

积分

初级会员

积分
128
 楼主| 发表于 2023-10-31 15:10:16 | 显示全部楼层
eric2013 发表于 2023-10-31 15:04
RTX5有个关键的设计是所有API都是在SVC软中断里面调用的,其它的就好理解了,也是PendSV做任务切换。

看来学完一个rtos再学另外的感觉都是大同小异,把不同点记一下基本就轻车熟路了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2023-10-31 15:21:49 | 显示全部楼层
qq1646544 发表于 2023-10-31 15:10
看来学完一个rtos再学另外的感觉都是大同小异,把不同点记一下基本就轻车熟路了

就是深入理解比较花时间,RTX5的代码略晦涩

[C] 纯文本查看 复制代码
#define SVC0_0N(f,t)                                                           \
SVC_INDIRECT(0) t    svc##f ();                                                \
__attribute__((always_inline))                                                 \
__STATIC_INLINE t  __svc##f (void) {                                           \
  SVC_ArgF(svcRtx##f);                                                         \
  svc##f();                                                                    \
}

#define SVC0_0(f,t)                                                            \
SVC_INDIRECT(0) t    svc##f ();                                                \
__attribute__((always_inline))                                                 \
__STATIC_INLINE t  __svc##f (void) {                                           \
  SVC_ArgF(svcRtx##f);                                                         \
  return svc##f();                                                             \
}

#define SVC0_1N(f,t,t1)                                                        \
SVC_INDIRECT(0) t    svc##f (t1 a1);                                           \
__attribute__((always_inline))                                                 \
__STATIC_INLINE t  __svc##f (t1 a1) {                                          \
  SVC_ArgF(svcRtx##f);                                                         \
  svc##f(a1);                                                                  \
}

#define SVC0_1(f,t,t1)                                                         \
SVC_INDIRECT(0) t    svc##f (t1 a1);                                           \
__attribute__((always_inline))                                                 \
__STATIC_INLINE t  __svc##f (t1 a1) {                                          \
  SVC_ArgF(svcRtx##f);                                                         \
  return svc##f(a1);                                                           \
}

#define SVC0_2(f,t,t1,t2)                                                      \
SVC_INDIRECT(0) t    svc##f (t1 a1, t2 a2);                                    \
__attribute__((always_inline))                                                 \
__STATIC_INLINE t  __svc##f (t1 a1, t2 a2) {                                   \
  SVC_ArgF(svcRtx##f);                                                         \
  return svc##f(a1,a2);                                                        \
}

#define SVC0_3(f,t,t1,t2,t3)                                                   \
SVC_INDIRECT(0) t    svc##f (t1 a1, t2 a2, t3 a3);                             \
__attribute__((always_inline))                                                 \
__STATIC_INLINE t  __svc##f (t1 a1, t2 a2, t3 a3) {                            \
  SVC_ArgF(svcRtx##f);                                                         \
  return svc##f(a1,a2,a3);                                                     \
}

#define SVC0_4(f,t,t1,t2,t3,t4)                                                \
SVC_INDIRECT(0) t    svc##f (t1 a1, t2 a2, t3 a3, t4 a4);                      \
__attribute__((always_inline))                                                 \
__STATIC_INLINE t  __svc##f (t1 a1, t2 a2, t3 a3, t4 a4) {                     \
  SVC_ArgF(svcRtx##f);                                                         \
  return svc##f(a1,a2,a3,a4);                                                  \
}



回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
发表于 2023-12-7 10:27:17 | 显示全部楼层
eric2013 发表于 2023-10-31 15:21
就是深入理解比较花时间,RTX5的代码略晦涩

[mw_shl_code=c,true]#define SVC0_0N(f,t)               ...

硬汉哥,能稍微指点下原理吗?例如osThreadNew,跳转看到调用的是__svcThreadNew,再跳转就是SVC0_3 (ThreadNew,           osThreadId_t,    osThreadFunc_t, void *, const osThreadAttr_t *),到这就看不懂了,不像其他os那么直接
回复

使用道具 举报

3

主题

122

回帖

131

积分

初级会员

积分
131
发表于 2023-12-7 13:37:36 | 显示全部楼层
LeslieChia 发表于 2023-12-7 10:27
硬汉哥,能稍微指点下原理吗?例如osThreadNew,跳转看到调用的是__svcThreadNew,再跳转就是SVC0_3 (Thr ...

硬汉哥的RTX教程里有
https://www.armbbs.cn/forum.php?mod=viewthread&tid=93396
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 16:50 , Processed in 0.171636 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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