a.ubuntu下应用软件
...
do
{
<1>.write(...);
<2>.//被调度器调度了出去,比如ubuntu定时启动的bug程序trackerd
<3>.read(...,&status);
}while(status == NACK);
...
b.arm上的程序
int get_command(void)
{
...
while(command_received == false)
{
local_irq_disable();//local_irq_save(flags);
if(command_received == false)
{
if(time_out_200ms())
{
send_response2pc(...,&status);
}
}
local_irq_enable();
}
...
}
存在这样一种情况:
<1>中write的是分组数据包的最后一个数据包,所以command_received将在irq中被置为true,
于是get_command()函数退出
{因为send_response2pc()是异步通信,它并不会等待pc将数据接收完毕之后才返回,而是将数据送到上传缓冲区之后立即返回}
进入下一个状态,而因为ubuntu被trackerd程序搞的系统运行及其缓慢<2>将会持续600ms才会被kernel调度器再次调度,
所以空闲的arm这时已经进入下一次的get_command()命令循环,又因为200ms超时,[这时<3>因为600ms左右的严重延时,还没能得到执行]
使得send_response2pc()上发了下一状态的超时,这时<3>被执行,于是read(...,&status)得到的status就是下一个状态了,
逻辑混乱了,
解决方法:因为是在别人代码上进行补丁,所以不能对其进行大手术,其实改成使用同步上传机制可以很好的解决,
但是可以将time_out_200ms改成time_out_1500ms来使用时间解决这个问题,1.5s是程序所能容忍的最大延时,否则挂机![gliethttp_20080619]
阅读(2194) | 评论(0) | 转发(0) |