打印

ucos上的一个串口驱动,感觉有问题,请大家看看

[复制链接]
3669|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dalujia|  楼主 | 2009-11-8 09:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个串口驱动是周公的模板,具体代码如下

uint8 UART0Read(uint8 *data, uint16 timeout)
{
    uint8 error=0;

    OS_ENTER_CRITICAL();
    while ((U0LSR & 0x00000001) == 0)
    {                                                                                      /* 没有收到数据 */
        U0IER = U0IER | 0x01;                                                 /* 允许接收中断 */
        OSSemPend(Uart0ReadSem, timeout, &error);        /* 等待接收数据 */
        if(error == OS_TIMEOUT)
        {
            return UART0_TIMEOUT;
        }
    }
    *data = U0RBR;                                                                /* 读取收到的数据 */
    OS_EXIT_CRITICAL();
    return error;
}



请注意里面的开关中断,这个函数是我最高任务里的,当这个开始运行时,一开始就关中断,这样我的中断就不运行了,并且一直等待信号量下去,这样就会出错吧,因为大部分时间都是在无限时超时等待数据,而中断是关掉的,我们的系统却没有出现问题,不知道怎么解释。而且这是周公的模板,不知道在这里开关中断是和用意。

相关帖子

沙发
desert_hawk| | 2009-11-8 16:35 | 只看该作者
关中断的情况下等待信号量倒是没有问题,前提是在关中断的情况下能够进行任务切换。周公的移植,任务切换应该是调用SWI软中断,在关中断的情况下也能进行。

使用特权

评论回复
板凳
dalujia|  楼主 | 2009-11-8 18:15 | 只看该作者
本帖最后由 dalujia 于 2009-11-8 18:16 编辑

是的,关中断的情况下也能等待信号量,但是你看ossempend函数,它超时后,并没有开中断。os_enter_critical和os_exit_critical并没有成对出现
if(error == OS_TIMEOUT)
        {
            return UART0_TIMEOUT;
        }

使用特权

评论回复
地板
dalujia|  楼主 | 2009-11-8 18:22 | 只看该作者
还有一点就是,在它关中断的时候,等待,ossempend,此时关中断,定时器0中断不处理异常,每个任务都有ostimedly函数,最终,将只执行空闲任务。但是我们的系统并没有出现这个问题,真不知道是什么原因

使用特权

评论回复
5
desert_hawk| | 2009-11-8 19:12 | 只看该作者
在一个任务里关中断,切换到其它任务不一定是关中断的,每个任务都会保存自己的CPSR和OsEnterSum(记录本任务关中断的次数),所以即使等待信号量的时候所有用户任务都不是就绪态,切换到空闲任务后仍然会打开中断,而打开中断之后,时钟节拍就会正常进行,其它任务也就能够运行了。
至于信号量超时后直接返回,开关中断没有成对出现,这个要看应用程序时怎么调用这个驱动的了,没有上下环境不好说。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
dalujia + 1
6
dalujia|  楼主 | 2009-11-8 20:21 | 只看该作者
非常感谢楼上,我觉得你的解释很合理。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

145

帖子

1

粉丝