在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于軟件定時器的一些討論

麥克泰技術 ? 來源:麥克泰技術 ? 2023-10-13 16:14 ? 次閱讀
簡介 這里先介紹下軟件定時器和硬件定時器的區別硬件定時器

CPU內部自帶的定時器模塊,通過初始化、配置可以實現定時,定時時間到以后就會執行相應的定時器中斷處理函數。硬件定時器一般都帶有其它功能,比如PWM輸出、輸入捕獲等等功能。但是缺點是硬件定時器數量少!!

軟件定時器

軟件定時器允許設置一段時間,當設置的時間到達之后就執行指定的功能函數,被定時器調用的這個功能函數叫做定時器的回調函數。回調函數的兩次執行間隔叫做定時器的定時周期,簡而言之,當定時器的定時周期到了以后就會執行回調函數。FreeRTOS中有專門的軟件定時器功能,我們可以在MCU中簡單的是實現“軟件定時器”如下:
void timer_1000ms(void)
{
  printf("timer_1000ms
");
}
/*systick_ms在硬件定時器中每1ms加1*/
int main(void)
{
  static timer_tick = 0;
  timer_tick = systick_ms;
  while()
  {
    if((systick_ms-timer_tick)>1000)
    {
      timer_tick = systick_ms;
      timer_1000ms();
    }
  }
}
這就是簡單的軟件定時器,是的,這就是特別簡潔版本的軟件定時器。當然它是有缺點的,比如systick_ms每1ms加1,所以軟件定時器的精度是ms為單位的,并且如果while(1)中有其他代碼阻塞,軟件定時器也會跟著阻塞的。這個簡單的軟件定時器畢竟很"簡陋",大家可以自行封裝豐富一下,或者參考已經有的開源方案:MultiTimer,一款可無限擴展的軟件定時器。MultiTimer 是一個軟件定時器擴展模塊,可無限擴展你所需的定時器任務,取代傳統的標志位判斷方式, 更優雅更便捷地管理程序的時間觸發時序。開源地址:https://github.com/0x1abin/MultiTimer MultiTimer MultiTimer的設計比較簡潔,只有2個文件,并且只有4個函數,總共82行代碼,稍微花一點功夫就可以理解明白。

a265e5ba-699e-11ee-939d-92fbcf53809c.png

移植步驟

  • 配置系統時間基準接口,安裝定時器驅動

uint64_t PlatformTicksGetFunc(void)
{
    /* Platform implementation */
}
MultiTimerInstall(PlatformTicksGetFunc);
  • 實例化一個定時器對象

MultiTimer timer1;
  • 設置定時時間,超時回調處理函數, 用戶上下指針,啟動定時器

int MultiTimerStart(&timer1, uint64_t timing, MultiTimerCallback_t callback, void* userData);
  • 在主循環調用定時器后臺處理函數

int main(int argc, char *argv[])
{
    ...
    while (1) {
        ...
        MultiTimerYield();
    }
}

具體就不做手把手教程如何移植了,在STM32F207移植好的工程開源地址:

開源地址:https://github.com/strongercjd/STM32F207VCT6/tree/master/23-Timer-MultiTimer

下面分析一下MultiTimer在移植的第一步,配置系統時間基準接口,安裝定時器驅動
uint64_t PlatformTicksGetFunc(void)
{
    /* Platform implementation */
}
MultiTimerInstall(PlatformTicksGetFunc);
看一下MultiTimerInstall函數原型
typedef uint64_t (*PlatformTicksFunction_t)(void);
static PlatformTicksFunction_t platformTicksFunction = NULL;
int MultiTimerInstall(PlatformTicksFunction_t ticksFunc)
{
    platformTicksFunction = ticksFunc;
    return 0;
}
這其實就是函數指針實現的回調函數,具體詳解看之前的文章《回調函數》,其實就是給MultiTimer提供一個計數器。除去回調函數,該開源項目還是單鏈表的很好的示例,學習數據結構是比較乏味的,這個開源項目是單鏈表很好的應用落地,不太懂的同學可以學習下。下面摘取一下部分代碼鏈表的刪除
for (; *nextTimer; nextTimer = &(*nextTimer)->next) {
  if (timer == *nextTimer) {
    *nextTimer = timer->next; /* remove from list */
    break;
  }
}

插入鏈表

for (nextTimer = &timerList;; nextTimer = &(*nextTimer)->next) {
  if (!*nextTimer) {
    timer->next = NULL;
    *nextTimer = timer;
    break;
  }
  if (timer->deadline < (*nextTimer)->deadline) {
    timer->next = *nextTimer;
    *nextTimer = timer;
    break;
  }
}

遍歷鏈表

MultiTimer* entry = timerList;
for (; entry; entry = entry->next) {
  /* Sorted list, just process with the front part. */
  if (platformTicksFunction() < entry->deadline) {
    return (int)(entry->deadline - platformTicksFunction());
  }
  /* remove expired timer from list */
  timerList = entry->next;


  /* call callback */
  if (entry->callback) {
    entry->callback(entry, entry->userData);
  }
}
這篇文章不會詳細講解鏈表的操作,不懂的同學可以看之前文章《鏈表在STM32中的應用》。

當然MultiTimer也是有缺點的,比如一個定時器是1000ms,另一個定時器是500ms,調度時就會沖突,也沒有定時器調度搶占,會隨著其他代碼的阻塞而阻塞。這種類似的問題不再詳述,大家使用的時候多測測就好。

任務調度

看了上面的操作,如果我們不叫軟件定時器,叫它“任務”,是不是和FreeRTOS任務類似,感覺高端一些,甚至這篇文章標題可以修改為《一篇文章教你實現操作系統,開個歡笑,不做標題黨。

有些項目實時性要求高,需要任務搶占,所以需要使用FreeRTOS這樣的操作系統,但它資源占用比例過大,不利于項目開發,在一般的小項目中也用不到RTOS的太多功能,使用上面的思路,你可以把每個任務設置不同的間隔時間周期性調用,如果有實時性要求很高的事件,就通過中斷處理。

當然也可以使用開頭的粗糙方法

if((systick_ms-timer_tick)>1000)
{
   timer_tick = systick_ms;
   timer_1000ms();
}

這樣功能是可以實現的,但沒有模塊化,不利于代碼的維護。我們可以借鑒MultiTimer思路封裝一下軟件接口。

并且,如果你的項目中,任務的個數是固定不變的,可以將MultiTimer中的鏈表拿掉,直接使用全局變量就可以,如果有額外的時間模仿FreeRTOS實現一些信號量,對列等,這就是自己的OS(無搶占)啊。(當然這屬于重復造輪子,但對一些公司來講,有適合自己業務的,最精簡的代碼框架是很有必要的)。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • PWM
    PWM
    +關注

    關注

    114

    文章

    5186

    瀏覽量

    213957
  • 定時器
    +關注

    關注

    23

    文章

    3248

    瀏覽量

    114816
  • 函數
    +關注

    關注

    3

    文章

    4331

    瀏覽量

    62622

原文標題:關于軟件定時器的一些討論

文章出處:【微信號:麥克泰技術,微信公眾號:麥克泰技術】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于STM32的軟件定時器設計

    軟件定時器是用程序模擬出來的定時器,可以由個硬件定時器模擬出成千上萬個軟件
    發表于 07-03 17:06 ?1063次閱讀
    基于STM32的<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>設計

    555定時器電路原理圖 基于555芯片的定時器電路設計

    這節要將的是關于555芯片組成的定時器電路,主要講解6種,分別是延時定時器、長延時定時器、分段式定時器、抗干擾的
    發表于 07-18 17:40 ?1.9w次閱讀
    555<b class='flag-5'>定時器</b>電路原理圖 基于555芯片的<b class='flag-5'>定時器</b>電路設計

    定時器一些使用案例

    本片文章包含了定時器一些使用,包括下面五個實驗:1.測量信號的脈寬2.PWM 輸出3.PWM 互補輸出4.PWM 輸入5.電容按鍵檢測
    發表于 08-16 07:00

    單片機的定時器中斷討論

    外部的脈沖信號(P3.4,P3.5兩個外部中斷輸入引腳)對寄存的數據+14.有了定時器/計數后可以增加單片機的效率,一些簡單重復的+1工作可以交給
    發表于 12-08 08:29

    555定時器應用設計軟件免費下載

    本文檔的主要內容詳細介紹的是555定時器應用設計軟件免費下載,本軟件款555定時器設計軟件
    發表于 12-17 08:00 ?51次下載
    555<b class='flag-5'>定時器</b>應用設計<b class='flag-5'>軟件</b>免費下載

    設計軟件定時器

    在MCU芯片內部,往往硬件定時器的數量是非常有限的,而實際工程中卻需要大量的定時器來輔助完成具體的功能,如果個函數占用定時器,那么顯然
    發表于 11-05 18:35 ?2次下載
    設計<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>

    基于硬件定時器軟件定時器

    出現使用軟件定時器的情況,但是講定時器需要從硬件定時器開始講,軟件定時器是在其基礎之上延伸出來的
    發表于 11-25 09:51 ?8次下載
    基于硬件<b class='flag-5'>定時器</b>的<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>

    STM32開發項目:軟件虛擬定時器的實現

    目錄背景軟件定時器庫特性源碼介紹softwaretimer.csoftwaretimer.h使用指南背景在不運行實時操作系統的單片機中,面對一些復雜的項目需求時,僅有的幾個硬件定時器
    發表于 12-24 19:15 ?1次下載
    STM32開發項目:<b class='flag-5'>軟件</b>虛擬<b class='flag-5'>定時器</b>的實現

    使用555定時器來制作一些樂器

    電子發燒友網站提供《使用555定時器來制作一些樂器.zip》資料免費下載
    發表于 11-16 09:56 ?1次下載
    使用555<b class='flag-5'>定時器</b>來制作<b class='flag-5'>一些</b>樂器

    軟件定時器簡介及程序配置

      軟件定時器就是允許函數設置定的等待時間,然后執行。定時器執行的函數被稱為定時器的回調函數。定時器
    的頭像 發表于 12-06 16:10 ?3915次閱讀
    <b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>簡介及程序配置

    單片機軟件定時器的實現方法

    定時器個數般都比較少,在一些有多個周期性操作的應用場合就無法滿足要求。這時,就可以基于硬件定時器派生出軟件
    的頭像 發表于 01-17 15:14 ?4932次閱讀
    單片機<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>的實現方法

    freeRTOS軟件定時器的使用

    freeRTOS中加入了軟件定時器這個功能組件,是個可選的、不屬于freeRTOS內核的功能,由定時器服務(其實就是
    的頭像 發表于 02-10 13:55 ?2169次閱讀

    Free RTOS的軟件定時器

    軟件定時器是FreeRTOS中的個重要模塊,使用軟件定時器可以方便的實現一些與超時或周期性相關
    的頭像 發表于 02-10 15:53 ?2352次閱讀
    Free RTOS的<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>

    什么是軟件定時器軟件定時器的實現原理

    軟件定時器是用程序模擬出來的定時器,可以由個硬件定時器模擬出成千上萬個軟件
    的頭像 發表于 05-23 17:05 ?2794次閱讀

    如何實現軟件定時器

    在Linux,uC/OS,FreeRTOS等操作系統中,都帶有軟件定時器,原理大同小異。典型的實現方法是:通過個硬件定時器產生固定的時鐘節拍,每次硬件
    的頭像 發表于 04-29 11:00 ?657次閱讀
    主站蜘蛛池模板: 亚洲日本欧美| 五月婷婷免费视频| 狂野欧美激情性xxxx| 国产在线精品观看一区| 欧美精品videosex性欧美| 小雪被撑暴黑人黑人与亚洲女人| 手机看片国产在线| 日本免费一区二区在线观看| 欧美一区二区精品| 亚洲天天做夜夜做天天欢人人| 成人人免费夜夜视频观看| 亚洲高清色图| 成人精品亚洲| 狂野欧美激情性xxxx| 日韩怡红院| 天天天色| 4438x五月天| 天堂bt在线网bt| 在线免费看一级片| 亚洲性视频网站| 久久综合九色婷婷97| 国产人人干| 天堂网在线资源www最新版| 91精选视频在线观看| 成人国产激情福利久久精品| 亚洲狠狠97婷婷综合久久久久| 国产成人精品怡红院| 黄在线看| 免费四虎永久在线精品| 久久伊人操| 五月婷婷在线视频| 夜夜夜夜夜夜夜猛噜噜噜噜噜噜| 在线二区| 久久新地址| 热九九精品| 亚洲成人资源| 午夜影院三级| 这里只有精品视频| 在线女同免费观看网站| 久久精品免费在线观看| 国产激情在线观看|