用的是已经移植好的UCOS工程模板,在调用 OS_ENTER_CRITICAL(); 进入临界段执行后,当串口发出中断时,依然转到串口中断服务函数。
难道不能屏蔽硬件中断?
OS_ENTER_CRITICAL(); //进入临界段
Disp_Imgg();
OS_EXIT_CRITICAL();
此法不行,我就临时关闭串中断UARTDisable(UART1_BASE);果然在进入Disp_Imgg()时不会跳转到中断服务函数中,但是当执行Disp_Imgg()后,启用串口中断,依然保留着在执行Disp_Imgg()时间内的中断,等于延时了中断的到来,这也是想不明白的。
IntDisable(UART1_BASE); //关闭串口中断
Disp_Imgg();
IntEnable(UART1_BASE);
//中断服务函数
void UART1_ISR(void)
{ //OSIntEnter();
static unsigned short n = 0;
char c;
char buf[UART1_RX_MAX+1];
UARTIntClear(UART1_BASE , UART_INT_RX | UART_INT_RT);
c = UARTCharGet(UART1_BASE);
if ( c == '\r' ) {
buf[n] = '\0';
n = 0;
UART_Puts("THEBUF++\r\n");
UART_Puts(buf);
WhereID(buf);
UART_Puts("--buzzer....\r\n");
} else {
if ( n < UART1_RX_MAX ) {
if ( isprint(c) ) {
buf[n++] = c;
UART_Puts("THEN++\r\n");
}
}
}
// OSIntExit();
}
请大家帮忙解决,谢谢!
你能确定OS_ENTER_CRITICAL()这个函数执行了,听你说来是觉得有点怪怪的。
OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()可以用来保护应用程序中的临界代码;然而要特别小心,如果在调用一些如OSTimeDel()之类的功能函数之前关中断,应用程序将会死机;原因是任务被挂起一段时间,直到挂起时间到,但由于中断关掉了,时钟节拍中断一直得不到服务,显然所有的挂起类调用都有这样的问题,所以要特别小心。作为一条普遍适用的规则,调用UCOS-ii功能函数时,中断总是开着的。
OS_ENTER_CRITICAL()是与体系结构相关联的代码,你需要看看它的实体,是否真正将中断关闭..
或者调试时,单步执行看看,cpsr的I位是否正确.