|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
怒了,周工来看 ucos2串口例程 |
作者:arcueid 栏目:ARM技术 |
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 于 2006/2/23 8:57:00 发布:
非中断时可调用OS_Sched(0进行任务调度,请看书。 |
3楼: | >>参与讨论 |
作者: yzb1658 于 2006/2/23 10:57:00 发布:
书上是这样写的 如果此时信号量无效(计数器的值是0),OSSemPend()函数要进一步检查它的调用函数是不是中断服务子程序[L6.10(4)]。在正常情况下,中断服务子程序是不会调用OSSemPend()函数的。 |
4楼: | >>参与讨论 |
作者: Arcueid 于 2006/2/23 11:12:00 发布:
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 于 2006/2/23 11:38:00 发布:
LZ不要怒了,这在老贴中就有过讨论 uCOS移植中的每个任务的中断状态是独立控制的,所以在关闭中断后进行任务调度,到了别的任务后,会打开中断的。这些在《基础教程》的P421有说明。 您有兴趣可以研究一下UCOS的移植代码。 |
6楼: | >>参与讨论 |
作者: Arcueid 于 2006/2/23 12:29:00 发布:
re 哦,谢谢了哈,周工早说吗,害我从昨天等到今天,我在网上下了一个ucos的文档,但是没看到你上面说的"在关闭中断后进行任务调度,到了别的任务后,会打开中断的",看来要买一本仔细研究了 |
7楼: | >>参与讨论 |
作者: 电子白菜 于 2006/2/23 15:26:00 发布:
关中断只代表任务不会因为节拍而调度, 但会因为其它原因而调度的嘛! |
8楼: | >>参与讨论 |
作者: 讨论 于 2009/6/3 16:58:22 发布:
好像不对吧?OS-CRITICAL-METHOD==2呀,那么OS_ENTER_CRITICAL();就是把以前的中断状态压入堆栈,然后关中断呀,书上P291说的很清楚呀 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |