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