打印
[ZLG-ARM]

关于周立功的串口程序的疑惑(ucos下)

[复制链接]
2459|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fengboy|  楼主 | 2007-4-18 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

这几天我在学习easyarm2100的开发板,在ucos2系统下练习uart0,板子自带的程序我看的有点纳闷,还请大家指点一下.主要是下面两个函数.
** 函数名称: UART0Putch
** 功能描述: 发送一个字节数据
** 输 入: Data:发送的数据数据
        void UART0Putch(uint8 Data)
{
    uint8 temp;
    
    OS_ENTER_CRITICAL();
    QueueWrite((void *)UART0SendBuf, Data);         /* 数据入队 */
    if ((U0LSR & 0x00000020) != 0)
    {                                               /* UART0发送保持寄存器空 */
        QueueRead(&temp, UART0SendBuf);             /* 发送最初入队的数据 */
        U0THR = temp;
        U0IER = U0IER | 0x02;                       /* 允许发送中断,中断的状态可以在U0LSR中看到, */
    }
    OS_EXIT_CRITICAL();

** 函数名称: UART0_Exception
** 功能描述: UART0中断服务程序
        void UART0_Exception(void)
{
    uint8 IIR, temp, i;
    
    OS_ENTER_CRITICAL();
    while(((IIR = U0IIR) & 0x01) == 0)
    {                                                   /* 有中断未处理完 */
        switch (IIR & 0x0e)
        {
            case 0x02:                                  /* THRE中断    */
                for (i = 0; i < UART0_FIFO_LENGTH; i++) /* 向发送FIFO填充数据 */
                {
                    if (QueueRead(&temp, UART0SendBuf) == QUEUE_OK)
                    {
                        U0THR = temp;
                    }
                    else
                    {
                        U0IER = U0IER & (~0x02);        /* 队列空,则禁止发送中断 */
                    }
                }
                break;
.......................
有个疑问,UART0Putch使能THRE中断,但为什么还要(for (i = 0; i < UART0_FIFO_LENGTH; i++) /* 向发送FIFO填充数据 */
                {
                    if (QueueRead(&temp, UART0SendBuf) == QUEUE_OK)
                    {
                        U0THR = temp;
                    })
向FIFO填充数据,如果UART0SendBuf中有好几个数据,那不是数据被覆盖拉吗?他没判断发送保持寄存器的状态啊,直接接 U0THR = temp.
感觉这程序还不如不用THRE中断呢.

 

相关帖子

沙发
zlgARM| | 2007-4-18 18:11 | 只看该作者

fengboy

“向FIFO填充数据,如果UART0SendBuf中有好几个数据,那不是数据被覆盖拉吗?”
向FIFO中填数据怎么会覆盖UART0SendBuf?
串口的发送FIFO不是UART0SendBuf。

使用特权

评论回复
板凳
fengboy|  楼主 | 2007-4-19 14:45 | 只看该作者

关于周立功的串口程序的疑惑(ucos下)

谢谢.可能我没表达好.我主要想说为什么要向FIFO填充数据啊,对THRE中断的机制一直没搞懂.

使用特权

评论回复
地板
zlgARM| | 2007-4-19 21:31 | 只看该作者

fengboy

你用货车运货给别人,如果没有仓库,那怎么办?你岂不是要等要运的货到了你才能运?运一次等一次,你多累!效率多低!~
如果有了仓库,你就不需要担心要老是等了,你可以以最大负载不停地运货给别人。仓库这边也不闲着,其它人不断给仓库补货,免得仓库空了你就要等候。

但是仓库终究是要空的,这个时候就发生了THRE中断。

仓库空了,中断产生了。
FIFO空了,中断产生了。

使用特权

评论回复
5
fengboy|  楼主 | 2007-4-20 18:27 | 只看该作者

关于周立功的串口程序的疑惑(ucos下)

谢谢,现在明白拉

使用特权

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

本版积分规则

3

主题

7

帖子

1

粉丝