为什么ucos移植时有些函数必须用汇编写?


 

结论:操作系统进行任务切换时,需要对"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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被大佬糊弄的只会点灯的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值