1. 程式人生 > >ucosiii任務內建訊息佇列

ucosiii任務內建訊息佇列

1 //串列埠1中斷處理程式
 2 void USART1_IRQHandler(void)                    //串列埠1中斷服務程式
 3 {
 4     OS_ERR err;    
 5     OSIntEnter();    //通知UCOS進入中斷
 6     //傳送緩衝區空中斷
 7     if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)  {
 8         USART_SendData(USART1, *pTxBufRead);//向串列埠傳送緩衝區寫入一個位元組
 9         if((pTxBufRead++) == &Usart1TxBuf[USART1_TX_BUFFER_LEN - 1]){ //讀到最後一個位元組
10             pTxBufRead = Usart1TxBuf;  //移動讀指標到第首地址
11         }        
12         if(pTxBufRead == pTxBufWrite){ //若讀寫指標相等,表明本次緩衝區資料已經讀完
13             USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//關閉中斷
14         }
15         OSSemPost(&Usart1TxBufSem, OS_OPT_POST_1, &err); //釋放緩衝區訊號量
16     }    
17     //串列埠接收到資料中斷
18     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
19         *pRxBufWrite = USART_ReceiveData(USART1); //讀取一個位元組到緩衝區
20         OSTaskQPost(&Usart1RxTaskTCB, pRxBufWrite, 1, OS_OPT_POST_FIFO, &err);   //傳送該位元組所在緩衝區的地址到訊息佇列,等待任務處理
21         if((pRxBufWrite++) == &Usart1RxBuf[USART1_RX_BUFFER_LEN - 1]){ //若當前寫指標寫到緩衝區最後一個地址
22             pRxBufWrite = Usart1RxBuf; //寫指標更新為緩衝區第一個地址,環形佇列
23         }
24     }
25     OSIntExit();      //通知UCOS退出中斷