欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

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

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

軟件定時器

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

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

移植步驟

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

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

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

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

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

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

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

下面分析一下MultiTimer在移植的第一步,配置系統(tǒng)時間基準(zhǔn)接口,安裝定時器驅(qū)動
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提供一個計(jì)數(shù)器。除去回調(diào)函數(shù),該開源項(xiàng)目還是單鏈表的很好的示例,學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)是比較乏味的,這個開源項(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);
  }
}
這篇文章不會詳細(xì)講解鏈表的操作,不懂的同學(xué)可以看之前文章《鏈表在STM32中的應(yīng)用》。

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

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

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

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

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

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

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

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


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

    關(guān)注

    114

    文章

    5199

    瀏覽量

    214948
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3256

    瀏覽量

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

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62999

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

    定時器一些使用案例

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    freeRTOS軟件定時器的使用

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

    Free RTOS的軟件定時器

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

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

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

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

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