首先是信号量的申明:
char *UARTRxBuf = "1234567890123456";
OS_EVENT *UARTRX;
OS_EVENT *UARTSend;
char *UARTBuf = "1234567890123456";
信号量的初始化:
static void taskUART(void *parg)
{
(void)parg;
static INT32U cut;
INT8U err;
char string[5];
uartInit();
UARTSend = OSSemCreate(0); //产生发送信号量
UARTRX = OSSemCreate(0); //产生接收信号量
for(;;)
{
OSSemPend(UARTSend,0,&err); //等待其它任务给信号,然后发送 ,这个发送信号量是正常的
uartPuts(UARTBuf);
}
}
这里是接收信号量的发送
在中断里void UART1_ISR(void)
{
char c;
static INT16U rx_cut;
static INT8U test_eof[4];
c = UARTCharGet(UART1_BASE);
if(c == 'h')
{
*UARTRxBuf = 'h'; //这是帧头
rx_cut = 1;
}
else if(rx_cut < 17) //最大帧长。
{
UARTRxBuf[rx_cut++] = c;
test_eof[3] = test_eof[2];
test_eof[2] = test_eof[1];
test_eof[1] = test_eof[0];
test_eof[0] = c;
if((test_eof[3] == 0x3c)&&(test_eof[2] == 0xc3)&&(test_eof[1] == 0x33)&&(test_eof[0] == 0xcc))
{
OSSemPost(UARTRX); //接收正常就发送信号量。
}
}
UARTIntClear(UART1_BASE , UART_INT_RX | UART_INT_RT);
}
在其它任务中无限等待信号量
static void taskLED2(void *parg)
{
(void)parg;
INT8U err;
for(;;)
{
LED_Toggle( LED2); //led闪烁
OSTimeDlyHMSM(0,0,1,0); // 延时1s
OSSemPend(UARTRX,0,&err); //OS_NO_ERR 等待接收信号量?£
}
}
但这里为什么这个信号量一直没有被挂起到等待状态,这个灯一直在闪烁。。。
------解决方案--------------------------------------------------------
OSSemPend(UARTRX,0,&err); //OS_NO_ERR 等待接收信号量?£
放到LED_Toggle( LED2); //led闪烁
前面
------解决方案--------------------------------------------------------
是不是OS_CFG文件里的OS_MAX_EVENTS定义的太小了,导致信号量没有创建成功?
OSSemCreate()执行完成之后,检查一下返回值是否是NULL,如果是,则信号量创建失败