Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15271577
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2008-06-19 14:12:46

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]

阅读(2142) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~