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

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

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

rt-thread優(yōu)化系列(三)軟定時(shí)器的定時(shí)漂移問題分析

出出 ? 來源:出出 ? 作者:出出 ? 2022-06-23 09:35 ? 次閱讀

定時(shí)器

所謂軟定時(shí)器,是由一個(gè)線程運(yùn)行維護(hù)的定時(shí)器列表。由線程調(diào)用定時(shí)器回調(diào)函數(shù)。
相對硬定時(shí)器,是由中斷(SysTick)維護(hù)的定時(shí)器列表,并在中斷中調(diào)用定時(shí)器回調(diào)函數(shù)。

另外,還有一種*硬件定時(shí)器*,這個(gè)和單片機(jī)里的定時(shí)器是一個(gè)概念,由外設(shè)定時(shí)器實(shí)現(xiàn)定時(shí)。和 rt-thread 提供的硬定時(shí)器是兩個(gè)不同概念。

對硬定時(shí)器回調(diào)函數(shù)有嚴(yán)格的執(zhí)行時(shí)間要求,而且不能調(diào)用任何在中斷中不能調(diào)用的函數(shù)??傊荒苡腥魏尾荒茉谥袛嘀袌?zhí)行的操作。

那么,軟定時(shí)器呢,要求需要這么嚴(yán)格嗎?

比如有個(gè)處理執(zhí)行時(shí)間 10ms,比如在定時(shí)器中斷函數(shù)里發(fā)送個(gè)等待 10ms 的消息...

無論是硬定時(shí)器還是軟定時(shí)器,它們各自有一個(gè)定時(shí)器列表。列表中的定時(shí)器根據(jù)定時(shí)時(shí)間長短排序,定時(shí)時(shí)間短的在前。掃描這個(gè)列表中所有定時(shí)器,直到結(jié)尾或者出現(xiàn)第一個(gè)定時(shí)時(shí)間未到的定時(shí)器節(jié)點(diǎn)。當(dāng)判斷出定時(shí)時(shí)間到的時(shí)候,調(diào)用定時(shí)器回調(diào)函數(shù)。
假如,某次掃描這個(gè)列表中多于一個(gè)定時(shí)器到達(dá)定時(shí)時(shí)間,也就是需要執(zhí)行兩個(gè)以上的定時(shí)器回調(diào)函數(shù)。并且前一個(gè)掃描到的定時(shí)器的回調(diào)函數(shù)執(zhí)行時(shí)間比較長,出現(xiàn)上面設(shè)想的某一種使用情況。這時(shí)候會(huì)出現(xiàn)什么效果?

因?yàn)橛捕〞r(shí)器的種種硬性要求,以下討論只針對軟定時(shí)器。

從對 `rt_soft_timer_check` 的幾個(gè)疑問講起

先擺出官方的 rt_soft_timer_check 函數(shù),實(shí)現(xiàn)。這個(gè)函數(shù)是來掃描定時(shí)器列表中到達(dá)定時(shí)時(shí)間的定時(shí)器,并調(diào)用定時(shí)器回調(diào)函數(shù)的。

```
void rt_soft_timer_check(void)
{
   rt_tick_t current_tick;
   struct rt_timer *t;
   register rt_base_t level;
   rt_list_t list;
   rt_list_init(&list);

   RT_DEBUG_LOG(RT_DEBUG_TIMER, ("software timer check enter\n"));

   /* disable interrupt */
   level = rt_hw_interrupt_disable();

   while (!rt_list_isempty(&rt_soft_timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1]))
   {
       t = rt_list_entry(rt_soft_timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1].next,
                           struct rt_timer, row[RT_TIMER_SKIP_LIST_LEVEL - 1]);

       current_tick = rt_tick_get();

       /*
        * It supposes that the new tick shall less than the half duration of
        * tick max.
        */
       if ((current_tick - t->timeout_tick) < RT_TICK_MAX / 2)
       {
           RT_OBJECT_HOOK_CALL(rt_timer_enter_hook, (t));

           /* remove timer from timer list firstly */
           _rt_timer_remove(t);
           if (!(t->parent.flag & RT_TIMER_FLAG_PERIODIC))
           {
               t->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED;
           }
           /* add timer to temporary list  */
           rt_list_insert_after(&list, &(t->row[RT_TIMER_SKIP_LIST_LEVEL - 1]));

           soft_timer_status = RT_SOFT_TIMER_BUSY;
           /* enable interrupt */
           rt_hw_interrupt_enable(level);

           /* call timeout function */
           t->timeout_func(t->parameter);

           RT_OBJECT_HOOK_CALL(rt_timer_exit_hook, (t));
           RT_DEBUG_LOG(RT_DEBUG_TIMER, ("current tick: %d\n", current_tick));

           /* disable interrupt */
           level = rt_hw_interrupt_disable();

           soft_timer_status = RT_SOFT_TIMER_IDLE;
           /* Check whether the timer object is detached or started again */
           if (rt_list_isempty(&list))
           {
               continue;
           }
           rt_list_remove(&(t->row[RT_TIMER_SKIP_LIST_LEVEL - 1]));
           if ((t->parent.flag & RT_TIMER_FLAG_PERIODIC) &&
               (t->parent.flag & RT_TIMER_FLAG_ACTIVATED))
           {
               /* start it */
               t->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED;
               rt_timer_start(t);
           }
       }
       else break; /* not check anymore */
   }
   /* enable interrupt */
   rt_hw_interrupt_enable(level);

   RT_DEBUG_LOG(RT_DEBUG_TIMER, ("software timer check leave\n"));
}

疑問一 `rt_list_t list` 這個(gè)臨時(shí)中間變量的作用是什么?

  • 進(jìn)入 `rt_soft_timer_check` 函數(shù)后,先初始化 list 變量。
  • 掃描定時(shí)器列表,當(dāng)有到時(shí)的定時(shí)器,把這個(gè)定時(shí)器從軟定時(shí)器列表 `rt_soft_timer_list` 移除,插入到這個(gè) list 臨時(shí)存放。
  • 開中斷,調(diào)用定時(shí)器回調(diào)函數(shù),關(guān)中斷
  • 把 list 中存放的定時(shí)器移除
  • 判斷定時(shí)器的周期定時(shí)器還是一次性定時(shí)器
  • 繼續(xù)掃描定時(shí)器列表

list 是個(gè)局部變量,僅僅起臨時(shí)存放當(dāng)前這個(gè)定時(shí)器的作用。看似是一種穩(wěn)妥的做法。
但是,這樣做的初衷是什么?
為什么這個(gè)定時(shí)器一定要放到某個(gè)列表里?
如果從軟定時(shí)器列表 `rt_soft_timer_list` 移除后,不插入任何列表會(huì)有什么影響?
因?yàn)橥顺?`rt_soft_timer_check` 函數(shù)后,list 列表不復(fù)存在了,應(yīng)該不是退出 `rt_soft_timer_check` 函數(shù)后的需求,那么插入 list 和 從 list 取出之間有哪些情況需要我們注意,需要用一個(gè)臨時(shí)列表將軟定時(shí)器暫存?

定時(shí)器回調(diào)函數(shù)里可能發(fā)生哪些操作?

  • 修改定時(shí)器設(shè)置
  • 停止,重啟定時(shí)器
  • 刪除定時(shí)器
  • 發(fā)生中斷,在中斷里執(zhí)行上述三種操作

修改定時(shí)器設(shè)置,可能只涉及到定時(shí)器的定時(shí)時(shí)間間隔和定時(shí)周期特性。這兩個(gè)參數(shù)設(shè)置需要定時(shí)器必須在某個(gè)列表中嗎?
停止,重啟定時(shí)器,必然導(dǎo)致修改定時(shí)器所在列表指針,這里就涉及到雙向列表的操作了。

> 簡短介紹一下雙向列表,

  • rt-thread 使用的雙向列表,每一個(gè)節(jié)點(diǎn)有一個(gè) prev 和 一個(gè) next 指針,分別指向雙向列表中的前一個(gè)節(jié)點(diǎn)和后一個(gè)節(jié)點(diǎn)。
  • 一個(gè)空列表 l 僅有一個(gè)不含數(shù)據(jù)的節(jié)點(diǎn),此節(jié)點(diǎn)的 prev next 指針均指向它自己。
  • 任何一個(gè)帶數(shù)據(jù)的列表節(jié)點(diǎn)必須進(jìn)行初始化,使得它的 prev next 分別指向它自己,這一點(diǎn)和空列表 l 完全雷同!換句話說,***任何一個(gè)雙向列表節(jié)點(diǎn)均有作為鏈表的潛質(zhì)***。從操作上講,你可以定義兩個(gè)定時(shí)器,然后這兩個(gè)定時(shí)器之間構(gòu)建一個(gè)含有兩個(gè)節(jié)點(diǎn)的雙向列表,當(dāng)然,這種做法沒有多少實(shí)用意義。
  • 從鏈表中移除的節(jié)點(diǎn),**必須**使得它的 prev next 指針指向它自己。
  • **無論一個(gè)節(jié)點(diǎn)是否在某個(gè)雙向鏈表中,或者僅僅是一個(gè)獨(dú)立節(jié)點(diǎn),對它進(jìn)行刪除操作,效果是完全一樣的!**
  • 更多的操作詳見 rtservice.c 文件中相關(guān)函數(shù),`rt_list_init, rt_list_insert_after, rt_list_insert_before, rt_list_remove` 等等。

停止定時(shí)器會(huì)把當(dāng)前定時(shí)器從定時(shí)器列表刪除,無論這個(gè)定時(shí)器有沒有在某個(gè)定時(shí)器列表中,或者只是一個(gè)獨(dú)立的定時(shí)器節(jié)點(diǎn),刪除操作的結(jié)果都是一樣的,使用 list 這個(gè)臨時(shí)列表可能不能保護(hù)它不被刪除。
重啟定時(shí)器會(huì)把它先從前一個(gè)列表中刪除,然后插入軟定時(shí)器列表 `rt_soft_timer_list` 。list 這個(gè)臨時(shí)列表也阻止不了重啟定時(shí)器操作。

**至此,可以看出,`rt_list_t list` 這個(gè)臨時(shí)列表無任何存在意義**

疑問二 `soft_timer_status` 指示的是什么狀態(tài)?

這是一個(gè)全局靜態(tài)變量,它的使用也很簡單,只在四個(gè)地方使用了,上面的源碼函數(shù)里有兩處,其它兩個(gè)地方分別是初始化聲明

/* soft timer status */
static rt_uint8_t soft_timer_status = RT_SOFT_TIMER_IDLE;

和——以下摘自 `rt_timer_start` 函數(shù)

#ifdef RT_USING_TIMER_SOFT
   if (timer->parent.flag & RT_TIMER_FLAG_SOFT_TIMER)
   {
       /* check whether timer thread is ready */
       if ((soft_timer_status == RT_SOFT_TIMER_IDLE) &&
          ((timer_thread.stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND))
       {
           /* resume timer thread to check soft timer */
           rt_thread_resume(&timer_thread);
           rt_schedule();
       }
   }
#endif /* RT_USING_TIMER_SOFT */

將這四個(gè)地方聯(lián)系起來看,意思好像是調(diào)用定時(shí)器回調(diào)函數(shù)前修改軟定時(shí)器為 busy 狀態(tài),返回回調(diào)函數(shù)后恢復(fù)為 idle 狀態(tài),而如果是在定時(shí)器回調(diào)函數(shù)里調(diào)用 `rt_timer_start` ,可以達(dá)到不進(jìn)行任務(wù)調(diào)度的目的。好像是起了雙保險(xiǎn)作用,真是這樣嗎?

我們分析一下上面這段 `rt_timer_start` 函數(shù)片段。
首先判斷定時(shí)器是不是軟定時(shí)器,只有軟定時(shí)器啟動(dòng)時(shí)才有進(jìn)行任務(wù)調(diào)度的可能。
其次,判斷 `soft_timer_status` 是否空閑,以及軟定時(shí)器線程是否***掛起態(tài)***。
以上仨?xiàng)l件均滿足,進(jìn)行任務(wù)調(diào)度。

我們重點(diǎn)關(guān)注“其次”,一個(gè)定時(shí)器線程調(diào)用的定時(shí)器回調(diào)函數(shù),這個(gè)線程會(huì)是掛起態(tài)嗎?答案是肯定不是。它在運(yùn)行著,肯定是 `RT_THREAD_RUNNING` 的。那么這個(gè) `soft_timer_status` “雙保險(xiǎn)”了嗎?

疑問三 開篇提到的假想

開篇提到了一種假想,假想軟定時(shí)器回調(diào)函數(shù)占用 cpu 時(shí)間有點(diǎn)兒長,會(huì)產(chǎn)生什么影響,引起什么后果。
討論這個(gè)問題仍然離不開 `rt_soft_timer_check` 函數(shù)工作原理,我們再梳理一下 `rt_soft_timer_check` 函數(shù)的操作。(以下分析忽略 list 以及 soft_timer_status 相關(guān)操作)

  • 關(guān)中斷
  • 掃描列表是否有節(jié)點(diǎn)
  • 取出第一個(gè)節(jié)點(diǎn)
  • ***獲取當(dāng)前系統(tǒng) tick***
  • 檢查定時(shí)器是否定時(shí)時(shí)間到,如果到時(shí)
  • 先從軟定時(shí)器列表 `rt_soft_timer_list` 移除定時(shí)器。非周期定時(shí)器,取消激活態(tài)
  • 開中斷
  • 執(zhí)行定時(shí)器回調(diào)函數(shù)。(這里可能存在長時(shí)間操作)
  • 關(guān)中斷
  • 對于周期性定時(shí)器,重啟定時(shí)器;非周期定時(shí)器,前面已經(jīng)做了取消激活態(tài)操作。
  • 繼續(xù)掃描列表,取出第一個(gè)節(jié)點(diǎn),***獲取當(dāng)前系統(tǒng) tick*** ,檢查定時(shí)器是否定時(shí)時(shí)間到。。。

假設(shè) RT_TICK_PER_SECOND = 1000,有兩個(gè)周期性定時(shí)器 t0 t1 ,定時(shí)間隔不同,同時(shí)啟動(dòng),各自的定時(shí)器回調(diào)函數(shù)執(zhí)行時(shí)間 t0 500us,t1 5 ms。
經(jīng)過一段時(shí)間以后,總是可能會(huì)出現(xiàn)定時(shí)間隔公倍數(shù)時(shí)刻 Tn ,它們倆同時(shí)達(dá)到定時(shí)時(shí)間。
如果 t1 先被處理,那么 t1 重啟的時(shí)候系統(tǒng) tick 已經(jīng)是 Tn + 5;t0 的重啟時(shí)間有 50% 的可能是 Tn + 5, 50%的可能是 Tn + 6。
如果 t0 先被處理,t0 的重啟時(shí)間有 50% 的可能是 Tn, 50%的可能是 Tn + 1;t1 重啟時(shí)間是 Tn + 5 或 Tn + 6。

即便不考慮 t0 不考慮它對外的影響,也不考慮它受到的影響,僅僅分析 t1 自己對自己的影響,也可以看出來,隨著時(shí)間的推移,它的定時(shí)間隔不是初始設(shè)定的 Inv ,而是 Inv + 5。

優(yōu)化后的 `rt_soft_timer_check` 流程

  • ***獲取當(dāng)前系統(tǒng) tick***
  • 關(guān)中斷
  • 掃描列表是否有節(jié)點(diǎn)
  • 取出第一個(gè)節(jié)點(diǎn)
  • 檢查定時(shí)器是否定時(shí)時(shí)間到,如果到時(shí)
  • 先從軟定時(shí)器列表 `rt_soft_timer_list` 移除定時(shí)器。
  • 對于周期性定時(shí)器,***重啟定時(shí)器***;非周期定時(shí)器,取消激活態(tài)。
  • 開中斷
  • 執(zhí)行定時(shí)器回調(diào)函數(shù)。(這里可能存在長時(shí)間操作)
  • 關(guān)中斷
  • 繼續(xù)掃描列表,取出第一個(gè)節(jié)點(diǎn),檢查定時(shí)器是否定時(shí)時(shí)間到。。。

其中,優(yōu)化后的重啟定時(shí)器不能使用原來的接口。需要使用如下原型函數(shù)接口

static rt_err_t _rt_timer_start(rt_timer_t timer, rt_tick_t current_tick)

第二個(gè)參數(shù)是進(jìn)入 `rt_soft_timer_check` 函數(shù),第一次關(guān)中斷前獲取的當(dāng)前系統(tǒng) `tick` 值,無論下面掃描出多少個(gè)到達(dá)時(shí)間的定時(shí)器,啟動(dòng)時(shí)間都是同一個(gè) `tick` 值。
而且無論其中某個(gè)定時(shí)器回調(diào)函數(shù)執(zhí)行時(shí)間有多長,或者多個(gè)回調(diào)函數(shù)累積執(zhí)行時(shí)間有多長,它們的啟動(dòng)時(shí)間都是相同的!

注:由此,引起的另一個(gè)弊端的,期間某個(gè)定時(shí)器定時(shí)時(shí)間到了,但是會(huì)被判定為未到,下次調(diào)用 `rt_soft_timer_check` 時(shí)才會(huì)被處理。

附測試程序

static void led1_timeout(void *parameter)
{
   rt_tick_t current_tick;
   int pin = rt_pin_read(LED1_PIN); 
   rt_pin_write(LED1_PIN, !pin);
   current_tick = rt_tick_get();
   rt_hw_us_delay(50000);
}
void led_tick_thread(void *parameter)
{
   rt_timer_t led1_timer;
   led1_timer = rt_timer_create("ledtim1", led1_timeout,
                               RT_NULL,  1000,
                               RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);
   if (led1_timer != RT_NULL) {
       rt_timer_start(led1_timer);
   }
   while (1) {
       rt_pin_write(LED0_PIN, PIN_HIGH);
       rt_thread_mdelay(500);
       rt_pin_write(LED0_PIN, PIN_LOW);
       rt_thread_mdelay(500);
   }
}

作為對比,兩個(gè) led 一個(gè)用軟定時(shí)器控制亮滅頻率,一個(gè)用 mdelay 延時(shí)控制亮滅頻率。
如果 timeout 沒有延遲,兩個(gè)燈一直是同步的;有延遲后,過一段時(shí)間兩個(gè)燈亮滅變不同步了。

總結(jié)

肯定有很多人反對說,定時(shí)器回調(diào)函數(shù)不要有長時(shí)間操作。發(fā)消息,信號(hào),郵箱...交給其它線程操作云云。
軟定時(shí)器本身就是一個(gè)線程,通過某種技術(shù)手段,在這個(gè)線程中可以完成的工作,一定要使用消息機(jī)制交給另外一下線程完成嗎?

如何抉擇,請君深思

本優(yōu)化系列所有提到的更改已經(jīng)提交到 gitee ,歡迎大家測試
https://gitee.com/thewon/rt_thread_repo

相關(guān)文章:
rt-thread 優(yōu)化系列(0) SysTick 優(yōu)化分析
rt-thread 優(yōu)化系列(一) 之 過多關(guān)中斷
rt-thread 優(yōu)化系列(二) 之 同步和消息關(guān)中斷分析

審核編輯:湯梓紅

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

    關(guān)注

    23

    文章

    3218

    瀏覽量

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

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61971
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1239

    瀏覽量

    39442
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    rt-thread 驅(qū)動(dòng)篇(八)hwtimer 重載算法優(yōu)化

    區(qū)別于 rt-thread 內(nèi)核實(shí)現(xiàn)的兩種定時(shí)器,這種定時(shí)器依賴芯片內(nèi)置的定時(shí)器外設(shè),依靠穩(wěn)定高速的晶振實(shí)現(xiàn)精確定時(shí),可以實(shí)現(xiàn)
    的頭像 發(fā)表于 06-23 10:10 ?2878次閱讀
    <b class='flag-5'>rt-thread</b> 驅(qū)動(dòng)篇(八)hwtimer 重載算法<b class='flag-5'>優(yōu)化</b>

    RT-Thread定時(shí)器工作機(jī)制以及定時(shí)器的管理方式

    當(dāng)不再需要?jiǎng)討B(tài)定時(shí)器時(shí),可以將其刪除,執(zhí)行如下函數(shù)之后系統(tǒng)會(huì)把這個(gè)定時(shí)器rt_timer_list 鏈表中刪除,然后釋放相應(yīng)的定時(shí)器控制塊占有的內(nèi)存:
    的頭像 發(fā)表于 02-15 10:36 ?1.2w次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>定時(shí)器</b>工作機(jī)制以及<b class='flag-5'>定時(shí)器</b>的管理方式

    RT-Thread記錄(四、RTT時(shí)鐘節(jié)拍和軟件定時(shí)器

    RT-Thread第4課,聽聽 RT-Thread 的心跳,再學(xué)習(xí)一下基于心跳的軟件定時(shí)器使用。
    的頭像 發(fā)表于 06-20 11:50 ?7217次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(四、RTT時(shí)鐘節(jié)拍和軟件<b class='flag-5'>定時(shí)器</b>)

    【每日一練】RT-Thread Nano-ADC(時(shí)鐘管理之軟件定時(shí)器)-3軟件定時(shí)器內(nèi)核代碼分析(第十七節(jié)學(xué)習(xí)視頻)

    :全局變量rt_tick自加 B:當(dāng)前線程執(zhí)行剩余時(shí)間減1C:當(dāng)前線程執(zhí)行完畢時(shí)間片會(huì)引起一次調(diào)度D:檢查定時(shí)器(hard模式;鏈表)打卡規(guī)則詳見:【每日一練】RT-Thread Nano入門全套
    發(fā)表于 06-02 10:32

    【每日一練】課程實(shí)踐-基于RT-Thread內(nèi)核定時(shí)器的電壓采集

    是基于對何老師課程的理解,做一個(gè)使用內(nèi)核的定時(shí)器來周期獲取電壓的采樣值,以這個(gè)實(shí)踐來鞏固這段時(shí)間學(xué)習(xí)到的RT-Thread的知識(shí),借這篇文章分享課程感悟,幫助更多想學(xué)習(xí)RT-Thread的小伙伴。二
    發(fā)表于 06-24 11:21

    RT-Thread提供了怎樣的定時(shí)器操作函數(shù)以及如何使用它們呢

    。rt_tick 的值表示了系統(tǒng)從啟動(dòng)到現(xiàn)在共經(jīng)過的時(shí)鐘節(jié)拍個(gè)數(shù)。定時(shí)器工作機(jī)制RT-Thread 提供的定時(shí)器基于系統(tǒng)的節(jié)拍,提供了基于節(jié)拍整數(shù)倍的
    發(fā)表于 04-02 11:41

    請問下rt-thread是否有更高定時(shí)器對象的實(shí)現(xiàn)

    查看rt-thread的源碼和相關(guān)文檔,已經(jīng)了解到了rt-thread定時(shí)器的實(shí)現(xiàn)原理,如文檔介紹,該定時(shí)器的精度并不很高,請問下,r-thread
    發(fā)表于 05-09 11:40

    【原創(chuàng)精選】RT-Thread征文精選技術(shù)文章合集

    優(yōu)化系列(零) SysTick 優(yōu)化分析rt-thread 優(yōu)化系列(一) 之 過多關(guān)中斷
    發(fā)表于 07-26 14:56

    RT-Thread軟件定時(shí)器怎么獲取定時(shí)器的狀態(tài)?

    rt-thread 軟件定時(shí)器怎么獲取定時(shí)器的狀態(tài) 比如獲取當(dāng)前定時(shí)器是運(yùn)行狀態(tài),還是停止?fàn)顟B(tài) ,自己加flag的方法除外哈
    發(fā)表于 01-31 15:19

    請教各位rt-thread軟件定時(shí)器大家一般怎么用 ?

    請教各位,rt-thread軟件定時(shí)器大家一般怎么用 ?按文檔說明 定時(shí)器是在一個(gè)單獨(dú)的任務(wù)里運(yùn)行,不能在定時(shí)器里做會(huì)導(dǎo)致延時(shí)的操作,所以
    發(fā)表于 04-20 16:14

    RT-thread初學(xué)

    RT-thread初學(xué)線程動(dòng)態(tài)創(chuàng)建線程靜態(tài)創(chuàng)建線程鉤子函數(shù)定時(shí)器獲取系統(tǒng)時(shí)間動(dòng)態(tài)創(chuàng)建定時(shí)器靜態(tài)創(chuàng)建定時(shí)器信號(hào)量靜態(tài)創(chuàng)建與動(dòng)態(tài)創(chuàng)建信號(hào)量信號(hào)量實(shí)例注意線程動(dòng)態(tài)創(chuàng)建線程/*任務(wù)回調(diào)函數(shù)*/
    發(fā)表于 12-31 19:45 ?8次下載
    <b class='flag-5'>RT-thread</b>初學(xué)

    詳細(xì)剖析Linux和RTOS(RT-Thread)的時(shí)鐘和定時(shí)器的使用

    Linux發(fā)燒友1.RTOS篇1.1RT-Thread簡介1.2時(shí)鐘管理1.2.1時(shí)鐘節(jié)拍1.3獲取系統(tǒng)節(jié)拍1.4定時(shí)器分類1.5定時(shí)器源碼分析1.6
    發(fā)表于 01-17 09:31 ?4次下載
    詳細(xì)剖析Linux和RTOS(<b class='flag-5'>RT-Thread</b>)的時(shí)鐘和<b class='flag-5'>定時(shí)器</b>的使用

    RT-Thread學(xué)習(xí)筆記 -- 時(shí)鐘管理

    RT-Thread學(xué)習(xí)筆記 – 時(shí)鐘管理軟件硬件定時(shí)器區(qū)別1.定時(shí)器分為硬件定時(shí)器和軟件定時(shí)器。區(qū)別:硬件
    發(fā)表于 01-17 09:53 ?1次下載
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 -- 時(shí)鐘管理

    RT-Thread驅(qū)動(dòng)篇:hwtimer重載值算法

    區(qū)別于 rt-thread 內(nèi)核實(shí)現(xiàn)的兩種定時(shí)器,這種定時(shí)器依賴芯片內(nèi)置的定時(shí)器外設(shè),依靠穩(wěn)定高速的晶振實(shí)現(xiàn)精確定時(shí),可以實(shí)現(xiàn)
    的頭像 發(fā)表于 04-01 10:06 ?1675次閱讀

    LPC55S69對接RT-Thread PWM設(shè)備框架

    在使用 RT-Thread 的 bsp pwm 的時(shí)候,注意到 lpc55sxx 系列只對接了通用定時(shí)器2中的通道1作為 PWM 輸出。但其實(shí) LPC55S69 具備非常多的 PWM 資源。于是根據(jù)
    的頭像 發(fā)表于 10-11 15:02 ?528次閱讀