軟件超時機制
1、背景
在嵌入式軟件程序設計過程中中,經常會遇到超時(或定時)的處理情況,基本處理思想是在時間到的時候進行相關程序處理,下面介紹兩種超時(或定時)的程序設計方案。
2、方案一
基本思想:定時器中斷使用一個變量TICK,中斷間隔時間t,在準備定時開始時讀取此時刻的TICK,在程序運行過程中實時讀取當前的TICK信息并計算即可。
因此在時間計算時只需計算開始STARTTICK和結束ENDTICK即可完成時間計算。時間計算T=(ENDTICK-STARTTICK) * t;使用一個定時器中斷每t時間處理一次中斷,中斷里面時間計數值s_u32TCNT++,如下圖所示:
程序中定義一個結構體來保存超時開始和超時結束時間,結構體定義如下圖所示:
在需要做定時超時處理的地方實時的獲取當前s_u32TCNT并賦值給u32EndTimeTick,計算開始u32StartTimeTick和結束時u32EndTimeTick的時間差來判斷時間是否到來即可,程序設計示意代碼如下圖所示:
3、方案二
基本思想:定義回調函數和回調注冊函數,將定時/超時服務函數注冊回調,每一次定時器中斷執行一次回調,回調函數只需對計時時間TCNT做減1操作即可。
當TCNT為0時即定時/超時時間到,并置超時標志,應用程序只需判斷標志即可明確定時/超時時間是否到來;回調函數和回調注冊函數定義如下圖所示,多個超時/定時回調函數可注冊在回調函數數組中:
定時中斷函數中進行遍歷處理,定時中斷函數處理示意代碼如下圖所示:
4、對比總結
方案一優點在于中斷執行單元執行內容少,代碼操作容易理解,缺點是應用中實時的進行計算開始和結束TICK差值,代碼執行效率不高。 方案二優點在于將超時函數注冊在回調中即可,程序擴展性較好,不用做過多的數值計算,代碼執行效率相對較高,缺點是定時中斷中需要遍歷所有已注冊的對調,中斷執行內容相對較多。
STM32程序超時設計
在程序設計中,出現以下類似語句,是非常不可靠的,很有必要加入超時處理!
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--;};
審核編輯:湯梓紅
-
嵌入式
+關注
關注
5140文章
19524瀏覽量
314744 -
STM32
+關注
關注
2289文章
11011瀏覽量
362268 -
中斷
+關注
關注
5文章
904瀏覽量
42508 -
定時器
+關注
關注
23文章
3287瀏覽量
117170 -
程序
+關注
關注
117文章
3820瀏覽量
82382
原文標題:如何設計STM32嵌入式程序的超時機制?
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
嵌入式軟件程序設計方案

espconn_gethostbyname接口DNS解析超時機制要自己做嗎?
請問HAL庫的超時機制可以修改嗎?
Linux串口通信的超時機制
實現嵌入式軟件超時的方法
一種基于嵌入式系統的遠程程序更新機制
STM32嵌入式系統設計的智能控制網絡終端技術

基于公平心跳超時容錯機制
嵌入式軟件定時/超時機制程序設計

評論