赞
踩
结论:操作系统进行任务切换时,需要对"cpu内的寄存器"进行直接操作,"这个直接操作,C做不到,只有汇编可以"。不要混淆了,C对接口中的寄存器可以操作的。
用汇编语言其中一个原因是可以提高任务切换的效率(如定时中断),但是,**传统os底层任务切换不用汇编,而用纯c语言(无嵌入式汇编)还真地不行**。中断程序、节拍定时中断可以完全用纯c来实现没有问题。
因为:
你一定很熟悉c语言,在调用一个函数结束后,一定会原路返回到调用函数的下一条执行。在中断中调用一个函数结束时,也会原路返回到下一个指令执行。
传统os的每个任务是一个超级循环(while(1){...}),对于抢占式调度,在开中断时刻,可以在任何位置进入中断程序,打断低优先级任务A代码执行,恢复高优先级任务B的**上下文**(所有cpu内的寄存器),跳到更高优先级的任务B中,从曾经被打断的位置继续执行。
这个任务切换过程,与c语言的调用函数完全不同,可以用中断程序跳转到任何想跳到的位置,从一个任务A的任何位置,可以跳到另一个任务B中的任何位置。
任务A跳到任务B,要保存任务A的上下文,以便跳回来时,恢复后继续执行任务A。跳到另一个任务B时要恢复曾经保存的上下文。
注!上下文就是指cpu内的所有寄存器。
关键的问题到啦!!!
纯c语言不能保存cpu内指定通用寄存器的内容,而汇编语言可以!纯c语言不能保存cpu内指定通用寄存器的内容,而汇编语言可以!纯c语言不能保存cpu内指定通用寄存器的内容,而汇编语言可以!
所以,传统os底层任务切换只能用汇编!linux,ucos等底层任务切换部分只能用汇编。
如果传统os退化为合作式调度,并且每次都是从头执行到完成(RTC),这种情况,不需要保存cpu内指定通用寄存器的内容,就可以只用纯c而不用汇编语言。tinyos和contiki os就是这样的。
传统os?现代os? 现代os底层任务切换就不用汇编,而用纯c语言,同样可以实现任务抢占,其关键是对事件的处理也是RTC的,更加不可思议的是它只有一个堆栈,一个堆栈,一个堆栈。QP就是个现代的os(http://www.state-machine.com)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。