軟件超時(shí)機(jī)制
1、背景
在嵌入式軟件程序設(shè)計(jì)過(guò)程中中,經(jīng)常會(huì)遇到超時(shí)(或定時(shí))的處理情況,基本處理思想是在時(shí)間到的時(shí)候進(jìn)行相關(guān)程序處理,下面介紹兩種超時(shí)(或定時(shí))的程序設(shè)計(jì)方案。
2、方案一
基本思想:定時(shí)器中斷使用一個(gè)變量TICK,中斷間隔時(shí)間t,在準(zhǔn)備定時(shí)開(kāi)始時(shí)讀取此時(shí)刻的TICK,在程序運(yùn)行過(guò)程中實(shí)時(shí)讀取當(dāng)前的TICK信息并計(jì)算即可。
因此在時(shí)間計(jì)算時(shí)只需計(jì)算開(kāi)始STARTTICK和結(jié)束ENDTICK即可完成時(shí)間計(jì)算。時(shí)間計(jì)算T=(ENDTICK-STARTTICK) * t;使用一個(gè)定時(shí)器中斷每t時(shí)間處理一次中斷,中斷里面時(shí)間計(jì)數(shù)值s_u32TCNT++,如下圖所示:
程序中定義一個(gè)結(jié)構(gòu)體來(lái)保存超時(shí)開(kāi)始和超時(shí)結(jié)束時(shí)間,結(jié)構(gòu)體定義如下圖所示:
在需要做定時(shí)超時(shí)處理的地方實(shí)時(shí)的獲取當(dāng)前s_u32TCNT并賦值給u32EndTimeTick,計(jì)算開(kāi)始u32StartTimeTick和結(jié)束時(shí)u32EndTimeTick的時(shí)間差來(lái)判斷時(shí)間是否到來(lái)即可,程序設(shè)計(jì)示意代碼如下圖所示:
3、方案二
基本思想:定義回調(diào)函數(shù)和回調(diào)注冊(cè)函數(shù),將定時(shí)/超時(shí)服務(wù)函數(shù)注冊(cè)回調(diào),每一次定時(shí)器中斷執(zhí)行一次回調(diào),回調(diào)函數(shù)只需對(duì)計(jì)時(shí)時(shí)間TCNT做減1操作即可。
當(dāng)TCNT為0時(shí)即定時(shí)/超時(shí)時(shí)間到,并置超時(shí)標(biāo)志,應(yīng)用程序只需判斷標(biāo)志即可明確定時(shí)/超時(shí)時(shí)間是否到來(lái);回調(diào)函數(shù)和回調(diào)注冊(cè)函數(shù)定義如下圖所示,多個(gè)超時(shí)/定時(shí)回調(diào)函數(shù)可注冊(cè)在回調(diào)函數(shù)數(shù)組中:
定時(shí)中斷函數(shù)中進(jìn)行遍歷處理,定時(shí)中斷函數(shù)處理示意代碼如下圖所示:
4、對(duì)比總結(jié)
方案一優(yōu)點(diǎn)在于中斷執(zhí)行單元執(zhí)行內(nèi)容少,代碼操作容易理解,缺點(diǎn)是應(yīng)用中實(shí)時(shí)的進(jìn)行計(jì)算開(kāi)始和結(jié)束TICK差值,代碼執(zhí)行效率不高。 方案二優(yōu)點(diǎn)在于將超時(shí)函數(shù)注冊(cè)在回調(diào)中即可,程序擴(kuò)展性較好,不用做過(guò)多的數(shù)值計(jì)算,代碼執(zhí)行效率相對(duì)較高,缺點(diǎn)是定時(shí)中斷中需要遍歷所有已注冊(cè)的對(duì)調(diào),中斷執(zhí)行內(nèi)容相對(duì)較多。
STM32程序超時(shí)設(shè)計(jì)
在程序設(shè)計(jì)中,出現(xiàn)以下類(lèi)似語(yǔ)句,是非常不可靠的,很有必要加入超時(shí)處理!
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 讀寫(xiě)EEPROM添加超時(shí):
uint16_t i = 0x0fff; while((!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))&&i){i--;};
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5094文章
19178瀏覽量
307732 -
STM32
+關(guān)注
關(guān)注
2272文章
10924瀏覽量
357608 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41760 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3255瀏覽量
115390 -
程序
+關(guān)注
關(guān)注
117文章
3796瀏覽量
81420
原文標(biāo)題:如何設(shè)計(jì)STM32嵌入式程序的超時(shí)機(jī)制?
文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
嵌入式軟件程序設(shè)計(jì)方案
![<b class='flag-5'>嵌入式</b>軟件<b class='flag-5'>程序</b>設(shè)計(jì)方案](https://file1.elecfans.com/web2/M00/A3/2C/wKgaomT31eWARG3kAAAR668O4LU514.png)
espconn_gethostbyname接口DNS解析超時(shí)機(jī)制要自己做嗎?
請(qǐng)問(wèn)HAL庫(kù)的超時(shí)機(jī)制可以修改嗎?
Linux串口通信的超時(shí)機(jī)制
實(shí)現(xiàn)嵌入式軟件超時(shí)的方法
嵌入式系統(tǒng)的超時(shí)控制及其應(yīng)用
一種基于嵌入式系統(tǒng)的遠(yuǎn)程程序更新機(jī)制
STM32嵌入式系統(tǒng)設(shè)計(jì)的智能控制網(wǎng)絡(luò)終端技術(shù)
![<b class='flag-5'>STM32</b><b class='flag-5'>嵌入式</b>系統(tǒng)設(shè)計(jì)的智能控制網(wǎng)絡(luò)終端技術(shù)](https://file1.elecfans.com//web2/M00/A5/95/wKgZomUMORiACjVaAABvOeNFMuk970.jpg)
基于公平心跳超時(shí)容錯(cuò)機(jī)制
嵌入式Linux應(yīng)用程序例程
![<b class='flag-5'>嵌入式</b>Linux應(yīng)用<b class='flag-5'>程序</b>例程](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
嵌入式軟件定時(shí)/超時(shí)機(jī)制程序設(shè)計(jì)
![<b class='flag-5'>嵌入式</b>軟件定時(shí)/<b class='flag-5'>超時(shí)機(jī)制程序</b>設(shè)計(jì)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
介紹兩種嵌入式軟件超時(shí)(或定時(shí))的程序設(shè)計(jì)方案
![介紹兩種<b class='flag-5'>嵌入式</b>軟件<b class='flag-5'>超時(shí)</b>(或定時(shí))的<b class='flag-5'>程序</b>設(shè)計(jì)方案](https://file1.elecfans.com/web2/M00/88/7B/wKgZomRoMLGAAvvBAAAR668O4LU666.png)
STM32程序超時(shí)設(shè)計(jì)
![<b class='flag-5'>STM32</b><b class='flag-5'>程序</b><b class='flag-5'>超時(shí)</b>設(shè)計(jì)](https://file.elecfans.com/web2/M00/25/87/poYBAGG3JvuAHH2xAABCW1i6V1M887.png)
嵌入式軟件中兩種超時(shí)程序設(shè)計(jì)方案
![<b class='flag-5'>嵌入式</b>軟件中兩種<b class='flag-5'>超時(shí)</b><b class='flag-5'>程序</b>設(shè)計(jì)方案](https://file.elecfans.com/web2/M00/25/87/poYBAGG3JvuAHH2xAABCW1i6V1M887.png)
評(píng)論