點擊上方「嵌入式大雜燴」,選擇「置頂公眾號」第一時間查看嵌入式筆記!

鏈接:https://blog.csdn.net/qq_38767222/、https://blog.csdn.net/wyq200704/
在嵌入式軟件程序設(shè)計過程中中,經(jīng)常會遇到超時(或定時)的處理情況,基本處理思想是在時間到的時候進行相關(guān)程序處理,下面介紹兩種超時(或定時)的程序設(shè)計方案。
基本思想:定時器中斷使用一個變量TICK,中斷間隔時間t,在準(zhǔn)備定時開始時讀取此時刻的TICK,在程序運行過程中實時讀取當(dāng)前的TICK信息并計算即可。
因此在時間計算時只需計算開始STARTTICK和結(jié)束ENDTICK即可完成時間計算。時間計算T=(ENDTICK-STARTTICK)*t;使用一個定時器中斷每t時間處理一次中斷,中斷里面時間計數(shù)值s_u32TCNT++,如下圖所示:

程序中定義一個結(jié)構(gòu)體來保存超時開始和超時結(jié)束時間,結(jié)構(gòu)體定義如下圖所示:

在需要做定時超時處理的地方實時的獲取當(dāng)前s_u32TCNT并賦值給u32EndTimeTick,計算開始u32StartTimeTick和結(jié)束時u32EndTimeTick的時間差來判斷時間是否到來即可,程序設(shè)計示意代碼如下圖所示:

基本思想:定義回調(diào)函數(shù)和回調(diào)注冊函數(shù),將定時/超時服務(wù)函數(shù)注冊回調(diào),每一次定時器中斷執(zhí)行一次回調(diào),回調(diào)函數(shù)只需對計時時間TCNT做減1操作即可。
當(dāng)TCNT為0時即定時/超時時間到,并置超時標(biāo)志,應(yīng)用程序只需判斷標(biāo)志即可明確定時/超時時間是否到來;回調(diào)函數(shù)和回調(diào)注冊函數(shù)定義如下圖所示,多個超時/定時回調(diào)函數(shù)可注冊在回調(diào)函數(shù)數(shù)組中:


定時中斷函數(shù)中進行遍歷處理,定時中斷函數(shù)處理示意代碼如下圖所示:

方案一優(yōu)點在于中斷執(zhí)行單元執(zhí)行內(nèi)容少,代碼操作容易理解,缺點是應(yīng)用中實時的進行計算開始和結(jié)束TICK差值,代碼執(zhí)行效率不高。
方案二優(yōu)點在于將超時函數(shù)注冊在回調(diào)中即可,程序擴展性較好,不用做過多的數(shù)值計算,代碼執(zhí)行效率相對較高,缺點是定時中斷中需要遍歷所有已注冊的對調(diào),中斷執(zhí)行內(nèi)容相對較多。
在程序設(shè)計中,出現(xiàn)以下類似語句,是非常不可靠的,很有必要加入超時處理!
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
以下在stm32的system_stm32f10x.c文件中,判斷外部晶振起振的程序。可以參考,在以后的程序中借鑒。
#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
I2C 讀寫EEPROM添加超時:
uint16_t i = 0x0fff;
while ((!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))&&i){i--;};
由于微信公眾號近期改變了推送規(guī)則,如果您想經(jīng)常看到我們的文章,可以在每次閱讀后,在頁面下方點一個「贊」或「在看」,這樣每次推送的文章才會第一時間出現(xiàn)在您的訂閱列表里。
版權(quán)聲明:本文來源網(wǎng)絡(luò),免費傳達知識,版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請聯(lián)系我進行刪除。
猜你喜歡:
實用 | GitHub上一位老外的嵌入式C編碼規(guī)范
干貨 | 嵌入式開發(fā)常見問題解決方法
2020年精選原創(chuàng)筆記匯總
在公眾號聊天界面回復(fù)1024,可獲取嵌入式資源;回復(fù) m ,可查看文章匯總。
文章都看完了
不點個
嗎