打印
[uCOS/RTOS]

ucos从任务切换到中断ISR机制

[复制链接]
1169|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ilikedota|  楼主 | 2015-11-1 21:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ucos中的每一个任务都有其单独的任务堆栈区,如果发生任务和任务之前的切换,原来的任务的现场信息会全部保存到它的堆栈区中,以便下次运行它时知道它被切换前的运行状态。但是如果任务被外来的中断打断,因为CPU本来就有中断处理机制,会自动将任务运行现场“压栈”,按道理讲,“压栈”应该是压入到任务的专属堆栈中才对,但是我不太明白CPU又是怎么知道要压到专属堆栈中去的呢?我看ucos的源码没有这方面的程序啊?但是我看ucos中对任务与任务之间的切换和任务和中断ISR中间的切换函数确实不一样,前者是OS_TASK_SW(),后者是OSIntCtxSw().希望大神们能够指点指点,谢谢!!!

相关帖子

沙发
ilikedota|  楼主 | 2015-11-3 21:44 | 只看该作者
好冷清……

使用特权

评论回复
板凳
john_lee| | 2015-11-4 00:13 | 只看该作者
1、SP在切换任务时作为上下文的一部分被保存到“换出”的TCB中,并从“换入”的任务TCB中装载,所以SP总是指向当前任务的栈顶。
2、对于使用“软件中断”作为任务“主动切换”的方式来说,OS_TASK_SW 只是一个“trap”而已(主动触发中断),在中断里执行的 OsIntCtxSw 才是真正切换上下文的地方。对于没有“软件中断”的CPU,OS_TASK_SW 也是一个切换上下文的地方,与 OsIntCtxSw 稍有不同的是,前者可以只保存 call saved registers,而后者必须保存整个上下文(call saved registers 和 call used registers)。

文中的术语和概念就不解释了,楼主自己搜。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

98

帖子

3

粉丝