天天看點

裸機系統用前背景系統還是輪詢系統?

裸機系統用前背景系統還是輪詢系統?

《《《《《正文》》》》》

輪詢系統==》

就是在死循環裡順序的做各種事情!大概代碼如下圖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;}      

繼續閱讀