silence_sky 发表于 2014-9-11 10:09:32

如何正确的同时使用OSSemAccept和OSSemPend

大概是这样的。串口发完数据就      OSSemPost(Sem_USART2_TXE);   //post一个信号量出来

然后有2个程序用到这个Sem_USART2_TXE,一个是闪灯的程序,如过发了就闪一下LED;另一个是发送程序,等待数据发完好接着再发。

闪灯的程序,优先级11:
void Task_Start(void *p_arg)
{
while (1)
{
    LED1(ON);
    OSTimeDlyHMSM(0,0,0,500);
    LED1(OFF);   
    OSTimeDlyHMSM(0,0,0,500);
    if(OSSemAccept(Sem_USART2_TXE))//查询Sem_USART2_TXE
      LED2(ON);
    else
      LED2(OFF);
}
}
发送的程序,优先级12:
void Task_USART(void *p_arg)
{
u32 i;
(void)p_arg;
while (1)
{
    OSSemPend(Sem_CAN_RXE,0,&Serr);
    for(i=0;i<20;i++)
       USART2_TX_Buf=CANRxMessage;   
    USART2_TX_count=0;
    USART2_TX_index=19;
    USART_ITConfig(USART2,USART_IT_TC,ENABLE); //启动发送
    if(CAN_RX_FIFO_NUM==4)
    {
      CAN_RX_FIFO_NUM--;
      OSSemPend(Sem_USART2_TXE,0,&Serr);//等待前一次发送完
      for(i=0;i<16;i++)
      USART2_TX_Buf=CANRxFovMessage;   
      USART2_TX_count=0;
      USART2_TX_index=15;
      USART_ITConfig(USART2,USART_IT_TC,ENABLE); ////启动发送
    }
}

按我的理解,OSSemPost(Sem_USART2_TXE)后,系统的OSEventCnt就加1了,不管是OSSemPend还是OSSemAccept,都会对OSEventCnt减一。事件POST后,因为串口任务优先级高,应该是先到OSSemPend去,OSEventCnt就为0了,那么OSSemAccept查询到的就一直是0,灯是不会闪的。
试验暂时就不做了,我感觉我这么想没错。
现在问题来了,如果要实现串口发送完后,闪灯任务和发送任务都及时知道,要怎么办?
还是说应该用事件标志组?那如果加点难度就用信号量呢?

Excellence 发表于 2014-9-11 10:27:38

可以一对二,看UCOS II那本书说明。
页: [1]
查看完整版本: 如何正确的同时使用OSSemAccept和OSSemPend