查看: 7181|回复: 2

[MQX] KINETIS MQX在任务调度时为什么不使用PENDSV呢?

[复制链接]

该用户从未签到

2

主题

4

帖子

0

新手上路

Rank: 1

积分
6
最后登录
1970-1-1
发表于 2010-11-20 22:11:16 | 显示全部楼层 |阅读模式
KINETIS MQX在任务调度时为什么不使用PENDSV呢?我看其他系统在CORTEX M做的OS都使用pendsv
我知道答案 目前已有1人回答
回复

使用道具 举报

该用户从未签到

2

主题

224

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
322
最后登录
1970-1-1
发表于 2010-11-30 16:21:13 | 显示全部楼层

RE:KINETIS MQX在任务调度时为什么不使用PENDSV呢?

关于这个问题,其实不光是ARM cortex-M系列的移植不区分用户态和系统态,以前的PowerPC,codefire系列的移植也一样不区分用户态和系统态。
不知道ARC公司这么做的好处是什么,其实包括我本人在内也很困惑,究竟是什么原因导致MQX的设计者一直让系统跑在supervisor态。

该用户从未签到

2

主题

224

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
322
最后登录
1970-1-1
发表于 2011-1-31 13:39:09 | 显示全部楼层

RE:KINETIS MQX在任务调度时为什么不使用PENDSV呢?

不好意思,之前没好好看过MQX在M4上的移植代码,有些误导,现纠正如下:
1. 确实MQX在M4上的移植代码中没有用到PendSV。尽管中断向量表中有PendSV的入口“_pend_svc”(可见BSP代码中的vectors.c),但在实际应用中并没有用到PENDSVSET。
2. 虽然没有用PendSV,但是用了SVCall,具体代码可参见PSP的dispatch.s中的"_sched_start_internal","_sched_run_internal","_sched_execute_scheduler_internal","_task_block": svc SVC_RUN_SCHED/SVC_TASK_BLOCK/SVC_TASK_SWITCH。
3. 个人理解,在此用SVCall和PendSV类似,都从thread模式切换到了handler模式,SP从PSP切换到了MSP,同时在PSP中保存了{r0-r3,r12,r14,r15}和xPSR。不同的是用SVCall可以传递一个立即数给_svc_handler()以区分系统调用的功能。
4. 从handler模式返回到thread模式,同uCOS等其他操作系统在M系列MCU上的移植一样,都用"bx lr",并且lr=0xFFFFFFFD,以pop回{r0-r3,r12,r14,r15}及xPSR。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-11 07:03 , Processed in 0.098412 second(s), 23 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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