ucosiii任務內建訊息佇列
阿新 • • 發佈:2019-01-30
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退出中斷
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退出中斷