登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

怒了,周工来看 ucos2串口例程

作者:arcueid 栏目:ARM技术
怒了,周工来看 ucos2串口例程
usos2串口例程中有
        uint8 UART0Getch(void)
{
    uint8 err;

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

请问一下,在这个程序中先OS_ENTER_CRITICAL();关中断
然后OSSemPend(Uart0Sem, 0, &err); 我看ucos文档说关了中断以后不能用pend操作

早上发的贴到现在没人回,伤心了
刚刚打了电话给广州的说OS_ENTER_CRITICAL();也可以进行任务调度
我就纳闷了,可以任务调度还需要调用这条语句吗,调用它的目的不就是防止全局变量被意外修改吗

请zlg解释下,谢谢

2楼: >>参与讨论
cmj
非中断时可调用OS_Sched(0进行任务调度,请看书。
 
3楼: >>参与讨论
yzb1658
书上是这样写的
如果此时信号量无效(计数器的值是0),OSSemPend()函数要进一步检查它的调用函数是不是中断服务子程序[L6.10(4)]。在正常情况下,中断服务子程序是不会调用OSSemPend()函数的。

4楼: >>参与讨论
Arcueid
re
UART0Getch()并不是中断服务程序
它的作用是接收1个字符
        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;
            case 0x04:                                  /* 接收数据可用 */
                OSSemPost(Uart0Sem);                    /* 通知接收任务 */
                U0IER = U0IER & (~0x01);                /* 禁止接收及字符超时中断 */
                break;
            case 0x06:                                  /* 接收线状态   */
                TEMP = U0LSR;
                break;
            case 0x0c:                                  /* 字符超时指示 */
                OSSemPost(Uart0Sem);                    /* 通知接收任务 */
                U0IER = U0IER & (~0x01);                /* 禁止接收及字符超时中断 */
                break;
            default :
                break;
        }
    }
    VICVectAddr = 0;            // 通知中断控制器中断结束
    OS_EXIT_CRITICAL();
}
在串口的中断服务程序中发送信号
我的意思是它已经在UART0Getch()这里关闭了中断,而且由于信号量将进程挂起
注意并没有开中断
那么串口的中断服务程序怎么给这个进程发信号

5楼: >>参与讨论
ZLGARM
LZ不要怒了,这在老贴中就有过讨论
uCOS移植中的每个任务的中断状态是独立控制的,所以在关闭中断后进行任务调度,到了别的任务后,会打开中断的。这些在《基础教程》的P421有说明。
您有兴趣可以研究一下UCOS的移植代码。

6楼: >>参与讨论
Arcueid
re
哦,谢谢了哈,周工早说吗,害我从昨天等到今天,我在网上下了一个ucos的文档,但是没看到你上面说的"在关闭中断后进行任务调度,到了别的任务后,会打开中断的",看来要买一本仔细研究了

7楼: >>参与讨论
电子白菜
关中断只代表任务不会因为节拍而调度,
但会因为其它原因而调度的嘛!

8楼: >>参与讨论
讨论
好像不对吧?OS-CRITICAL-METHOD==2呀,那么OS_ENTER_CRITICAL();就是把以前的中断状态压入堆栈,然后关中断呀,书上P291说的很清楚呀
参与讨论
昵称:
讨论内容:
 
 
相关帖子
请问lpc2200工程模板中的*.scf文件起什么作用?
2138的片内flash能否用作数据存储器?如何使用?
非典Artx_Swi软中断演示C++全部工程压缩文件(首发版)
打造原汁原味和晕到加忽悠的菜农水潭
深入浅出RAM7~~~~~!
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号