查看: 1184|回复: 0
打印 上一主题 下一主题

"任务栈切换

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-23 16:07:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
"任务栈切换确实比较简单,但是有个问题:就是环境的保存和恢复,在这篇文章里只是讨论如何回避这个问题。"   先来一句开场白:天下没有免费的午餐,牺牲少量的自由可以换取巨大的速度提升!!!!  所谓的"环境的保存和恢复",就是上下文.我的核心理念就是尽可能的避过上下文,而不是去保存它们,原因是这样的:  1.对于51这样的CPU来说,对寄存器进行保护会占用大量的存储(每任务+8字节),以及大量的时间(保存/恢复8个寄存器需要额外支出最少16个机器周期). 2.即使保存了寄存器,还得面对内存变量的覆盖问题.而解决内存变量的覆盖与解决寄存器变量覆盖的方法在KEIL中完全相同.  很多人会跳起来说保存寄存器是所有操作系统都是要做的,我只说一句:别太定向思维  可以换个思维方式:  所谓的上下文,不仅包括了堆栈和各寄存器,其实也包括了所有的内存的单元以及各种片上外设,仅将寄存器和堆栈划分到上下文中而其它部分取名为"公共资源"显然只是一厢情愿的定势思维.反过来说,既然可以选择避过那么多公共资源,又何不将寄存器也一起避过呢(除非是无法避过)?  事实上KEIL的编器给我们提供了这种机制,只要我们遵守一些简单的约定,就可以完全地避过寄存器保护的问题.  我手头最快的版本,切换一个任务只需10个机器周期,这是靠避过寄存器保护而换取的,否则,时间马上飚升至100周期.且对内存的巨大占用将使得在128B的片子上由原先的"免强可用"变成"完全不可用".  保护寄存器的版本我早就做过,意义不大,与现有的大量流行版本相比,没有什么优势和特点. 顺便提一句,省内存的版本我也做过,每字节堆栈开销为6机器周期!!!  讲的就是速度转载
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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