1. 如何實(shí)現(xiàn)嵌入式軟件定時(shí)/超時(shí)機(jī)制?

        共 2044字,需瀏覽 5分鐘

         ·

        2024-04-15 08:00

        中給出了兩種軟件定時(shí)機(jī)制的設(shè)計(jì)方案,其目標(biāo)在于,讓各位嵌入式軟件工程師摒棄CPU阻塞等待延時(shí)的方式,使用硬件定時(shí)器作為時(shí)基,在其上面實(shí)現(xiàn)軟件定時(shí)器及時(shí)間到達(dá)后的回調(diào)函數(shù)。

        這是兩種十分常用且實(shí)用的軟件定時(shí)方式,對良好的程序架構(gòu)設(shè)計(jì)具有很好的借鑒作用。

        以下是原文。

        軟件超時(shí)機(jī)制

        1、背景

        在嵌入式軟件程序設(shè)計(jì)過程中中,經(jīng)常會遇到超時(shí)(或定時(shí))的處理情況,基本處理思想是在時(shí)間到的時(shí)候進(jìn)行相關(guān)程序處理,下面介紹兩種超時(shí)(或定時(shí))的程序設(shè)計(jì)方案。

        2、方案一

        基本思想:定時(shí)器中斷使用一個(gè)變量TICK,中斷間隔時(shí)間t,在準(zhǔn)備定時(shí)開始時(shí)讀取此時(shí)刻的TICK,在程序運(yùn)行過程中實(shí)時(shí)讀取當(dāng)前的TICK信息并計(jì)算即可。

        因此在時(shí)間計(jì)算時(shí)只需計(jì)算開始STARTTICK和結(jié)束ENDTICK即可完成時(shí)間計(jì)算。時(shí)間計(jì)算T=(ENDTICK-STARTTICK)*t;使用一個(gè)定時(shí)器中斷每t時(shí)間處理一次中斷,中斷里面時(shí)間計(jì)數(shù)值s_u32TCNT++,如下圖所示:


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


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

        3、方案二

        基本思想:定義回調(diào)函數(shù)和回調(diào)注冊函數(shù),將定時(shí)/超時(shí)服務(wù)函數(shù)注冊回調(diào),每一次定時(shí)器中斷執(zhí)行一次回調(diào),回調(diào)函數(shù)只需對計(jì)時(shí)時(shí)間TCNT做減1操作即可。

        當(dāng)TCNT為0時(shí)即定時(shí)/超時(shí)時(shí)間到,并置超時(shí)標(biāo)志,應(yīng)用程序只需判斷標(biāo)志即可明確定時(shí)/超時(shí)時(shí)間是否到來;回調(diào)函數(shù)和回調(diào)注冊函數(shù)定義如下圖所示,多個(gè)超時(shí)/定時(shí)回調(diào)函數(shù)可注冊在回調(diào)函數(shù)數(shù)組中:



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

        4、對比總結(jié)

        方案一優(yōu)點(diǎn)在于中斷執(zhí)行單元執(zhí)行內(nèi)容少,代碼操作容易理解,缺點(diǎn)是應(yīng)用中實(shí)時(shí)的進(jìn)行計(jì)算開始和結(jié)束TICK差值,代碼執(zhí)行效率不高。

        方案二優(yōu)點(diǎn)在于將超時(shí)函數(shù)注冊在回調(diào)中即可,程序擴(kuò)展性較好,不用做過多的數(shù)值計(jì)算,代碼執(zhí)行效率相對較高,缺點(diǎn)是定時(shí)中斷中需要遍歷所有已注冊的對調(diào),中斷執(zhí)行內(nèi)容相對較多。

        STM32程序超時(shí)設(shè)計(jì)

        在程序設(shè)計(jì)中,出現(xiàn)以下類似語句,是非常不可靠的,很有必要加入超時(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 讀寫EEPROM添加超時(shí):

        uint16_t i = 0x0fff;
        while ((!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))&&i){i--;};



        來源鏈接:
        https://blog.csdn.net/qq_38767222/、https://blog.csdn.net/wyq200704/

        -END-



        瀏覽 167
        10點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        10點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 日韩一级片免费在线观看 | 国产久一 | 美女航空一级毛片高清 | sm调教小sao货叫主人语录 | 夫出差公侵犯每晚高潮 |