|
发表于 2008-8-20 15:25:33
|
显示全部楼层
TO【9楼】 mcu5i51 梦幻英雄
积分:162
派别:
等级:------
来自:河北衡水
我构思过一个简单的任务切换方法,不知道能不能用:在中断中保护R0-31,SP等现场数据,作为任务的依据,在改SP为另一个任务的私有堆伐空间,然后恢复另一个的保护数据在中断返回,程序会回到另一个任务了,因为所有保护的数据都在堆伐中,所以不会出现其他的情况了,不用关中断,甚至可以在切换任务时进入更高的中断,他们会保护自己用到的地方。
一个想法,一直没有用,理想的条件下只用C就能实现,甚至不用嵌入asm
你这办法老早就很多人在用了,而且现在正在用.这并不能解决临界区的问题.只要你用了中断,就会有临界区问题,举个例子:
假定i是全局资源,当前值为1
进程中的语句:
if(i)//假定执行这个判断时中断发生,那就意味着执行完这条语句后将跳入中断程序.而此刻这条语句已认为i!=0,所以流程已定为i--的方向
i--;//中断中返回后回到,此刻i本该是原来的值1,却因中断里的访问而变成了0,进程并不知道这一点,继续执行,于是在i--之后变成了-1,一个很可怕的值
else
i = 5;
中断里执行有同样的语句:
...
if(i)//执行到这时,i仍为1
i--;
else
i = 5;
//现在i变成0了
...
当i在打断前为1时,j的值会错误的变为-1,而不是预期的5.这个示例可能看不出问题的严重性,但试想一下这个i一个环形FIFO的下标指示...
在实际应用中这样的问题只是很常见的问题,但已经可以造成严重后果. |
|