|
大概是这样的。串口发完数据就 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[i]=CANRxMessage[i];
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[i]=CANRxFovMessage[i];
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,灯是不会闪的。
试验暂时就不做了,我感觉我这么想没错。
现在问题来了,如果要实现串口发送完后,闪灯任务和发送任务都及时知道,要怎么办?
还是说应该用事件标志组?那如果加点难度就用信号量呢? |
|