|
发表于 2010-7-24 09:25:35
|
显示全部楼层
我觉得这个os是有问题的,很多应该原子操作的变量都没有得到保护,例如kernel\queue.c文件:
void* CoPendQueueMail(OS_EventID id,U32 timeout,StatusType* perr)
{
...
pqcb->qSize--; /* Update the number of messages in the queue */
....
}
StatusType CoPostQueueMail(OS_EventID id,void* pmail)
{
...
pqcb->qSize++;
...
}
在CoPendQueueMail函数中,qSize++ 语句操作必须是原子,对于某些cisc处理器可能一条指令就可以做到,但对于risc处理器,这就要分三步完成:
1、读qSize变量到寄存器
2、寄存器 - 1
3、写寄存器到qSize变量
而我并没有看到os对这个变量有任何保护,如果程序执行到第2步,此时中断发生,假如在中断处理中调用了CoPostQueueMail函数,而该函数使qSize + 1,但中断返回后,程序回到qSize++的第2步并往下执行,qSize变量会被寄存器中的值替代,这意味着丢失了一个mail!
像这样的问题,coos中还可以找到一些。
也许我没有看完整,而出现的理解偏差,愿与coos的作者共同探讨。 |
|