我用的是LPC2300芯片,在调试外部中断0的时候信号量能够正常工作,我建立两个任务,一个是让LED灯灭,一个是让LED灯亮,LED灯亮前等待外部中断的信号量,如果我在这个任务中不加串口向外发数据OSSemPend(sem,0,&err);<br />FIO2SET|=0x000000FF;就这两句的话,任务能够正常执行。在按一下,灯亮一下,但是我加上这个 OSSemPend(sem,0,&err);<br /> FIO2SET|=0x000000FF;<br /> UART0Putch(0x55);<br />这样一来,我第一次按,灯亮,然后灭,串口也能收到'U',再按一键,LED亮,串口收到数据,但不会再灭了,不知道为什么。以下是我的程序,有哪位大哥帮我看下,谢谢啦!<br /><br /><br />#include "config.h"<br />#include "stdlib.h"<br /><br />#define TaskStkLengh 64 <br /> <br />OS_STK TaskStk [TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈<br />OS_STK TaskStk1 [TaskStkLengh]; //Define the Task1 stack 定义用户任务1的堆栈<br />OS_EVENT *sem;<br />OS_EVENT *Uart0Sem;<br />void Task0(void *pdata); //Task0 任务0<br />void Task1(void *pdata); //Task1 任务1<br />extern void UART1_Handler(void);<br />unsigned char temp;<br />void UART1_Exception(void)<br />{ <br /> uint8 IIR;<br /> <br /> OS_ENTER_CRITICAL();<br /> while(((IIR = U1IIR) & 0x01) == 0)<br /> { /* 有中断未处理完 */<br /> switch (IIR & 0x0e)<br /> {<br /> case 0x02: /* THRE中断 */<br /> U1THR = temp;<br /> U1IER = U1IER & (~0x02)<br /> break;<br /> case 0x04: /* 接收数据可用 */<br /> OSSemPost(Uart0Sem); /* 通知接收任务 */<br /> U1IER = U1IER & (~0x01); /* 禁止接收及字符超时中断 */<br /> break;<br /> case 0x06: /* 接收线状态 */<br /> temp = U1LSR;<br /> break;<br /> case 0x0c: /* 字符超时指示 */<br /> OSSemPost(Uart0Sem); /* 通知接收任务 */<br /> U1IER = U1IER & (~0x01); /* 禁止接收及字符超时中断 */<br /> break;<br /> default :<br /> break;<br /> }<br /> } <br /> VICVectAddr = 0; // 通知中断控制器中断结束<br /> OS_EXIT_CRITICAL();<br />}<br /><br />void UART_Init(void)<br />{ <br /> PINSEL0 &= ~0xC0000000;<br /> PINSEL0 |= 0x40000000; /* Enable TxD1 pin */<br /> PINSEL1 &= ~0x00000003;<br /> PINSEL1 |= 0x00000001; /* Enable RxD1 pin */<br /><br /> U1LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */<br /> U1DLM = 0;<br /> U1DLL = 7; /* 115200 Baud Rate @ 12MHz PCLK Clock */<br /> U1FDR = 0x67; /* Fractional Divider */<br /> U1LCR = 0x03; /* DLAB = 0 */<br /> U1IER = 0x03; /* Enable RDA and THRE interrupts */<br /> U0FCR = 0x87;<br /> VICVectAddr7 = (uint32 )UART1_Exception;/* Set Interrupt Vector */<br /> VICVectCntl7 = 7; /* use it for UART1 Interrupt */<br /> VICIntEnable = (1 << 7); /* Enable interrupt */<br /> Uart0Sem = OSSemCreate(0);<br />}<br /><br /><br />void UART0Putch(uint8 Data)<br />{<br /><br /><br /> OS_ENTER_CRITICAL();<br /> if ((U1LSR & 0x00000020) != 0)<br /> { /* UART0发送保持寄存器空 */<br /> U1THR = Data;<br /> U1IER = U1IER | 0x02; /* 允许发送中断 */<br /> }<br /> OS_EXIT_CRITICAL();<br />} <br /><br />void UART0Write(uint8 *Data, uint16 NByte)<br />{<br /> OS_ENTER_CRITICAL();<br /> while (NByte-- > 0)<br /> {<br /> UART0Putch(*Data++);<br /> }<br /> OS_EXIT_CRITICAL();<br />}<br /> <br />uint8 UART0Getch(void)<br />{<br /> uint8 err;<br /><br /> OS_ENTER_CRITICAL();<br /> if ((U1LSR & 0x00000001) == 0)<br /> { /* 没有收到数据 */<br /> U1IER = U1IER | 0x01; /* 允许接收中断 */<br /> OSSemPend(Uart0Sem, 0, &err); /* 等待接收数据 */<br /> }<br /> err = U1RBR; /* 读取收到的数据 */<br /> OS_EXIT_CRITICAL();<br /> return err;<br />}<br /><br />int main (void)<br />{<br /> OSInit ();<br /> UART_Init(); <br /> OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2); <br /> OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 3); <br /> OSStart ();<br /> return 0; <br />}<br />/*********************************************************************************************************<br />** Task0 任务0<br />********************************************************************************************************/<br /><br />void Task0 (void *pdata)<br />{<br /> pdata = pdata;<br /> TargetInit ();<br /> <br /> while (1)<br /> {<br /> FIO2CLR|=0x000000FF;<br /> OSTimeDly(500);<br /> }<br />}<br />/*********************************************************************************************************<br />** Task1 任务1<br />********************************************************************************************************/<br /><br />void Task1 (void *pdata)<br />{ INT8U err;<br /> pdata = pdata;<br /><br /> while (1)<br /> {<br /> OSSemPend(sem,0,&err);<br /> FIO2SET|=0x000000FF;<br /> UART0Putch(0x55);<br /><br /> }<br />} |
|