呵呵,高手都很忙,没空,俺来解一下吧~~~
根据 33楼:highgear老师的理论
一个简单的方法是:在中断中嵌入一句汇编,比如 nop. 此时, Keil 会把所有 context register (r0-r7,A,B,dptr,psw)push/pop. ...
highgear 发表于 2012-4-11 21:58
得出结论,只要在中断中嵌入一句汇编,Keil 会把所有的 context register (r0-r7,A,B,dptr,psw)push/pop 。
再根据 6楼:airwill老师的理论
这的确是一个难题, 不在于怎么解决, 在于最佳的效果.
本人和不赞成用库的办法. 增加了无关的程序更少令人讨厌!
所以我在做任务切换函数时, 使用的是插入了汇编代码的办法,
破坏了C代码的美感? 是啊, 我也不喜欢.
于是, 我用很精练的一个查表的汇编代码, 用 C 进行了"包装", 最后就让人 "不见一行汇编代码".
...
airwill 发表于 2012-4-9 09:41
得出结论,可用很精的一个查表的汇编代码, 用 C 进行了"包装", 最后就让人 "不见一行汇编代码"。
将两位老师的经典之作,组合在一起,就能完成这一道小学生题目。
并且中断C函数不用单独列出,写成一个单独的模块,可在任何模块中,随时按需指定调用,适用于任何版本的 Keil C51。
DEMO程序如下:
typedef void (* TaskCallback)( );
code char protection[1] = {0x22}; // RET 返回
void timer0( ) interrupt 0
{
……
(*((TaskCallback) protection))( );
……
} |