
《《《《《正文》》》》》
輪詢系統==》
就是在死循環裡順序的做各種事情!大概代碼如下圖1-1;這個适用于隻需順序執行事務且不需要外部事件來驅動事務的系統,比如僅僅實作LED翻轉的系統,使用輪詢系統來程式設計會很完美!
圖1-1
int main(void){ //硬體相關初始化 HardWareInit(); for (;;) { // 處理事情 1 Something1(); // 處理事情 2 Something2(); }}
前背景系統==》
但是上述在輪詢系統中翻轉LED的例子中,如果加入了按鍵操作等需要檢測外部信号的事件,用來模拟緊急報警,那麼整個系統的實時響應能力就不會那麼好了。假設Something2 是按鍵掃描,當外部按鍵被按下,相當于一個警報,這個時候,需要立馬響應,并做緊急處理,而這個時候程式剛好執行到 Something1,要命的是 Something1需要執行的時間比較久,久到按鍵釋放之後都沒有執行完畢,那麼當執行到 Something2的時候就會丢失掉一次事件。足見,輪詢系統隻适合順序執行的功能代碼,當有外部事件驅動時,實時性就會降低。相比輪詢系統,前背景系統是在輪詢系統的基礎上加入了中斷。外部事件的響應在中斷裡面完成,事件的處理還是回到輪詢系統中完成;大概代碼如下圖1-2;
圖1-2
int flag1 = 0;int flag2 = 0;int main(void){ //硬體相關初始化 HardWareInit();
for (;;) { if (flag1) { //處理事情 1 Something1(); } if (flag2) { // 處理事情 2 Something2(); } }}void ISR1(void){ /* 置位标志位 */ flag1 = 1; /* 如果事件處理時間很短,則在中斷裡面處理 如果事件處理時間比較長,在回到前台處理 */ Something1();}void ISR2(void){ /* 置位标志位 */ flag2 = 1; /* 如果事件處理時間很短,則在中斷裡面處理 如果事件處理時間比較長,在回到前台處理 */ Something2();}
序列槽執行個體==》
輪詢系統下的序列槽發送,代碼大概如下圖:
int main(void){ //硬體相關初始化 HardWareInit(); for (;;) { //uart發送函數 uart(0x55);//當中有等待發送完成函數 // 處其他事情 Otherthing(); }}void uart(uint8 data){ LPUARTx->SBUF_f.DATA = data; //判斷發送完成标志,此時系統一直在等待 while(FALSE == LPUart_GetStatus(LPUARTx,LPUartTC)){} LPUart_ClrStatus(LPUARTx,LPUartTC); }
前背景系統下的序列槽發送,代碼大概如下圖:
uint8 flag =0;int main(void){ //硬體相關初始化 HardWareInit(); for (;;) { //uart發送函數 uart(0x55); if(flag) //沒發送完就先做其他的事情 { //發送成功後的處理 DoSomething(); } // 處其他事情 Otherthing(); }}
void uart_ISR(void){ //發送完成标志 flag =1;}
void uart(uint8 data){ //發送後,不需在這裡等待,發送完成後跳到中斷通知函數uart_ISR LPUARTx->SBUF_f.DATA = data;}