91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于軟件定時(shí)器的一些討論

麥克泰技術(shù) ? 來源:麥克泰技術(shù) ? 2023-10-13 16:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

簡(jiǎn)介 這里先介紹下軟件定時(shí)器和硬件定時(shí)器的區(qū)別硬件定時(shí)器

CPU內(nèi)部自帶的定時(shí)器模塊,通過初始化、配置可以實(shí)現(xiàn)定時(shí),定時(shí)時(shí)間到以后就會(huì)執(zhí)行相應(yīng)的定時(shí)器中斷處理函數(shù)。硬件定時(shí)器一般都帶有其它功能,比如PWM輸出、輸入捕獲等等功能。但是缺點(diǎn)是硬件定時(shí)器數(shù)量少?。?/span>

軟件定時(shí)器

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

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

移植步驟

  • 配置系統(tǒng)時(shí)間基準(zhǔn)接口,安裝定時(shí)器驅(qū)動(dòng)

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

MultiTimer timer1;
  • 設(shè)置定時(shí)時(shí)間,超時(shí)回調(diào)處理函數(shù), 用戶上下指針,啟動(dòng)定時(shí)器

int MultiTimerStart(&timer1, uint64_t timing, MultiTimerCallback_t callback, void* userData);
  • 在主循環(huán)調(diào)用定時(shí)器后臺(tái)處理函數(shù)

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

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

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

下面分析一下MultiTimer在移植的第一步,配置系統(tǒng)時(shí)間基準(zhǔn)接口,安裝定時(shí)器驅(qū)動(dòng)
uint64_t PlatformTicksGetFunc(void)
{
    /* Platform implementation */
}
MultiTimerInstall(PlatformTicksGetFunc);
看一下MultiTimerInstall函數(shù)原型
typedef uint64_t (*PlatformTicksFunction_t)(void);
static PlatformTicksFunction_t platformTicksFunction = NULL;
int MultiTimerInstall(PlatformTicksFunction_t ticksFunc)
{
    platformTicksFunction = ticksFunc;
    return 0;
}
這其實(shí)就是函數(shù)指針實(shí)現(xiàn)的回調(diào)函數(shù),具體詳解看之前的文章《回調(diào)函數(shù)》,其實(shí)就是給MultiTimer提供一個(gè)計(jì)數(shù)器。除去回調(diào)函數(shù),該開源項(xiàng)目還是單鏈表的很好的示例,學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)是比較乏味的,這個(gè)開源項(xiàng)目是單鏈表很好的應(yīng)用落地,不太懂的同學(xué)可以學(xué)習(xí)下。下面摘取一下部分代碼鏈表的刪除
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);
  }
}
這篇文章不會(huì)詳細(xì)講解鏈表的操作,不懂的同學(xué)可以看之前文章《鏈表在STM32中的應(yīng)用》。

當(dāng)然MultiTimer也是有缺點(diǎn)的,比如一個(gè)定時(shí)器是1000ms,另一個(gè)定時(shí)器是500ms,調(diào)度時(shí)就會(huì)沖突,也沒有定時(shí)器調(diào)度搶占,會(huì)隨著其他代碼的阻塞而阻塞。這種類似的問題不再詳述,大家使用的時(shí)候多測(cè)測(cè)就好。

任務(wù)調(diào)度

看了上面的操作,如果我們不叫軟件定時(shí)器,叫它“任務(wù)”,是不是和FreeRTOS任務(wù)類似,感覺高端一些,甚至這篇文章標(biāo)題可以修改為《一篇文章教你實(shí)現(xiàn)操作系統(tǒng),開個(gè)歡笑,不做標(biāo)題黨。

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

當(dāng)然也可以使用開頭的粗糙方法

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

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

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


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    116

    文章

    5867

    瀏覽量

    225570
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3368

    瀏覽量

    123555
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67499

原文標(biāo)題:關(guān)于軟件定時(shí)器的一些討論

文章出處:【微信號(hào):麥克泰技術(shù),微信公眾號(hào):麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于STM32的軟件定時(shí)器設(shè)計(jì)

    軟件定時(shí)器是用程序模擬出來的定時(shí)器,可以由個(gè)硬件定時(shí)器模擬出成千上萬(wàn)個(gè)軟件
    發(fā)表于 07-03 17:06 ?1948次閱讀
    基于STM32的<b class='flag-5'>軟件</b><b class='flag-5'>定時(shí)器</b>設(shè)計(jì)

    555定時(shí)器電路原理圖 基于555芯片的定時(shí)器電路設(shè)計(jì)

    這節(jié)要將的是關(guān)于555芯片組成的定時(shí)器電路,主要講解6種,分別是延時(shí)定時(shí)器、長(zhǎng)延時(shí)定時(shí)器、分段式定時(shí)器、抗干擾的
    發(fā)表于 07-18 17:40 ?3w次閱讀
    555<b class='flag-5'>定時(shí)器</b>電路原理圖 基于555芯片的<b class='flag-5'>定時(shí)器</b>電路設(shè)計(jì)

    定時(shí)器一些使用案例

    本片文章包含了定時(shí)器一些使用,包括下面五個(gè)實(shí)驗(yàn):1.測(cè)量信號(hào)的脈寬2.PWM 輸出3.PWM 互補(bǔ)輸出4.PWM 輸入5.電容按鍵檢測(cè)
    發(fā)表于 08-16 07:00

    單片機(jī)的定時(shí)器中斷討論

    外部的脈沖信號(hào)(P3.4,P3.5兩個(gè)外部中斷輸入引腳)對(duì)寄存的數(shù)據(jù)+14.有了定時(shí)器/計(jì)數(shù)后可以增加單片機(jī)的效率,一些簡(jiǎn)單重復(fù)的+1工作可以交給
    發(fā)表于 12-08 08:29

    555定時(shí)器應(yīng)用設(shè)計(jì)軟件免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是555定時(shí)器應(yīng)用設(shè)計(jì)軟件免費(fèi)下載,本軟件款555定時(shí)器設(shè)計(jì)軟件,
    發(fā)表于 12-17 08:00 ?51次下載
    555<b class='flag-5'>定時(shí)器</b>應(yīng)用設(shè)計(jì)<b class='flag-5'>軟件</b>免費(fèi)下載

    設(shè)計(jì)軟件定時(shí)器

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

    基于硬件定時(shí)器軟件定時(shí)器

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

    STM32開發(fā)項(xiàng)目:軟件虛擬定時(shí)器的實(shí)現(xiàn)

    目錄背景軟件定時(shí)器庫(kù)特性源碼介紹softwaretimer.csoftwaretimer.h使用指南背景在不運(yùn)行實(shí)時(shí)操作系統(tǒng)的單片機(jī)中,面對(duì)一些復(fù)雜的項(xiàng)目需求時(shí),僅有的幾個(gè)硬件定時(shí)器
    發(fā)表于 12-24 19:15 ?1次下載
    STM32開發(fā)項(xiàng)目:<b class='flag-5'>軟件</b>虛擬<b class='flag-5'>定時(shí)器</b>的實(shí)現(xiàn)

    使用555定時(shí)器來制作一些樂器

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

    軟件定時(shí)器簡(jiǎn)介及程序配置

      軟件定時(shí)器就是允許函數(shù)設(shè)置定的等待時(shí)間,然后執(zhí)行。定時(shí)器執(zhí)行的函數(shù)被稱為定時(shí)器的回調(diào)函數(shù)。定時(shí)器
    的頭像 發(fā)表于 12-06 16:10 ?5183次閱讀
    <b class='flag-5'>軟件</b><b class='flag-5'>定時(shí)器</b>簡(jiǎn)介及程序配置

    單片機(jī)軟件定時(shí)器的實(shí)現(xiàn)方法

    定時(shí)器個(gè)數(shù)般都比較少,在一些有多個(gè)周期性操作的應(yīng)用場(chǎng)合就無(wú)法滿足要求。這時(shí),就可以基于硬件定時(shí)器派生出軟件
    的頭像 發(fā)表于 01-17 15:14 ?6797次閱讀
    單片機(jī)<b class='flag-5'>軟件</b><b class='flag-5'>定時(shí)器</b>的實(shí)現(xiàn)方法

    freeRTOS軟件定時(shí)器的使用

    freeRTOS中加入了軟件定時(shí)器這個(gè)功能組件,是個(gè)可選的、不屬于freeRTOS內(nèi)核的功能,由定時(shí)器服務(wù)(其實(shí)就是個(gè)
    的頭像 發(fā)表于 02-10 13:55 ?4011次閱讀

    Free RTOS的軟件定時(shí)器

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

    什么是軟件定時(shí)器?軟件定時(shí)器的實(shí)現(xiàn)原理

    軟件定時(shí)器是用程序模擬出來的定時(shí)器,可以由個(gè)硬件定時(shí)器模擬出成千上萬(wàn)個(gè)軟件
    的頭像 發(fā)表于 05-23 17:05 ?4288次閱讀

    如何實(shí)現(xiàn)個(gè)軟件定時(shí)器?

    在Linux,uC/OS,F(xiàn)reeRTOS等操作系統(tǒng)中,都帶有軟件定時(shí)器,原理大同小異。典型的實(shí)現(xiàn)方法是:通過個(gè)硬件定時(shí)器產(chǎn)生固定的時(shí)鐘節(jié)拍,每次硬件
    的頭像 發(fā)表于 04-29 11:00 ?1644次閱讀