本帖最后由 Cortex-M0 于 2012-4-18 13:11 编辑
谢谢各位盆友参与讨论,结贴给分~~~
61楼 或许是最佳的折中方案,用 C 对查表的汇编代码进行了"包装", 最后就让人 "不见一行汇编代码",既满足了highgear老师的要求,不插入汇编代码,又不破坏了C代码的美感,最大程度地保留了程序的“端庄”性。
----------------------------------------------------------------- 可 爱 的 分 界 线 -----------------------------------------------------------------
上次圈圈玩了个----基于51的圈圈操作系统(51_00_OS),全程C语言编程,但在任务切换函数中,依靠插入少量汇编代码压栈保护现场,破坏了C代码的美感。
这次highgear老师,玩了个8051 下的任务调度器 OSex,思路清晰,程序精简,由于highgear老师特意不插入汇编保护哪些寄存器,因此,存在一个小小的问题,即定时函数的中断过程中,对保护哪些寄存器,在任务函数未完全确定前,是未知的,只有任务函数完全确定后,才能由Keil C51编译器自动计算出,到底使用了哪些特殊寄存器并加以压栈保护。
要对所有的特殊寄存器加以压栈保护,俺常用方法有三。
方法1:
在初始化程序中适当加入一点简短变量赋值,让Keil C51将所有压栈变量扫到位,中断就全部压栈了。
方法2:
将中断程序建库,由于和其他程序的关联让Keil C51暂时摸不清头脑,结果就将全部压栈了。
方法3:
手工添加汇编。
----------------------------------------------------------------------
评论:
方法1 增加了无关的程序长度,使得程序不够精简。
方法2 由于使用了库,使得程序可读性下降。
方法3 违背了highgear老师的意愿,插入了汇编代码,破坏了C代码的美感。
由此可见,以上这三种方法都不是最理想,因些,俺求助二姨家各路大虾牛人,有啥更好的方法,即不用插入汇编,又能对所有的特殊寄存器进行压栈保护,所写C代码要求简短易读,说实话,这一道小学生题目,俺想了20年都未解。
有个网友,一道题目想了2年,并且给出奖金300元,俺穷,给不起那么多,对帮俺解答了这一道俺想了20年的小学生题目,奖金30元~~~ |