ilikedota 发表于 2015-11-1 21:58

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

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)。

文中的术语和概念就不解释了,楼主自己搜。
页: [1]
查看完整版本: ucos从任务切换到中断ISR机制