当前位置: 代码迷 >> 嵌入开发 >> uc/os的信号量有关问题,懂UC的
  详细解决方案

uc/os的信号量有关问题,懂UC的

热度:7313   发布时间:2013-02-26 00:00:00.0
uc/os的信号量问题,懂UC的请指教
首先是信号量的申明: 

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,如果是,则信号量创建失败
  相关解决方案