<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何實現(xiàn)嵌入式軟件定時/超時機制?

          共 2044字,需瀏覽 5分鐘

           ·

          2024-04-15 08:00

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

          這是兩種十分常用且實用的軟件定時方式,對良好的程序架構設計具有很好的借鑒作用。

          以下是原文。

          軟件超時機制

          1、背景

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

          2、方案一

          基本思想:定時器中斷使用一個變量TICK,中斷間隔時間t,在準備定時開始時讀取此時刻的TICK,在程序運行過程中實時讀取當前的TICK信息并計算即可。

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


          程序中定義一個結構體來保存超時開始和超時結束時間,結構體定義如下圖所示:


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

          3、方案二

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

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



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

          4、對比總結

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

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

          STM32程序超時設計

          在程序設計中,出現(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--;};



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

          -END-



          瀏覽 167
          10點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          10點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人妻摸一摸日日爽一爽,免费视频 | 三级片无码网址 | 日无码在线观看 | 欧美精在线 | 亚洲日韩欧美丝袜制服在线播放 |