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

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

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

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

矜辰所致 ? 來源:矜辰所致 ? 作者:矜辰所致 ? 2022-06-20 11:50 ? 次閱讀
RT-Thread第4課,聽聽 RT-Thread 的心跳,再學(xué)習(xí)一下基于心跳的軟件定時(shí)器使用。

目錄

前言
一、RT-Thread 時(shí)鐘節(jié)拍
1.1 時(shí)鐘節(jié)拍的概念
1.2 時(shí)鐘節(jié)拍實(shí)現(xiàn)原理
1.3 時(shí)鐘節(jié)拍示例
二、RT-Thread 軟件定時(shí)器
2.1 軟件定時(shí)器基本介紹
2.2 系統(tǒng)定時(shí)器初始化
2.3 定時(shí)器工作機(jī)制
2.4 us 延時(shí)函數(shù)
2.5 軟件定時(shí)器 or 硬件定時(shí)器?
三、 RT-Thread 軟件定時(shí)器操作函數(shù)
3.1 動(dòng)態(tài)創(chuàng)建和刪除定時(shí)器
3.2 靜態(tài)創(chuàng)建和刪除定時(shí)器
3.3 啟動(dòng)和停止定時(shí)器
3.4 定時(shí)器控制函數(shù)
四、定時(shí)器使用示例
4.1 動(dòng)態(tài)創(chuàng)建定時(shí)器示例
4.2 靜態(tài)創(chuàng)建定時(shí)器示例
結(jié)語


前言

學(xué)習(xí)RTOS,肯定接觸到軟件定時(shí)器,學(xué)會軟件定時(shí)器的使用能夠使得我們擺脫硬件定時(shí)器在某些地方的局限性,而軟件定時(shí)器的實(shí)現(xiàn),又是基于系統(tǒng)的時(shí)鐘節(jié)拍,本文除了了解 RT-Thread 軟件定時(shí)器API,學(xué)會使用 RT-Thread 軟件定時(shí)器,還需要先了解下 RT-Thread 時(shí)鐘管理相關(guān)知識。

本 RT-Thread 專欄記錄的開發(fā)環(huán)境:
RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發(fā)環(huán)境 及 配合CubeMX開發(fā)快速上手)
RT-Thread記錄(二、RT-Thread內(nèi)核啟動(dòng)流程 — 啟動(dòng)文件和源碼分析
RT-Thread 內(nèi)核篇系列博文鏈接:
RT-Thread記錄(三、RT-Thread 線程操作函數(shù)及線程管理)

一、RT-Thread 時(shí)鐘節(jié)拍

1.1 時(shí)鐘節(jié)拍的概念

時(shí)鐘節(jié)拍 (OS Tick)是系統(tǒng)心跳!任何操作系統(tǒng)都需要提供一個(gè)時(shí)鐘節(jié)拍,以供系統(tǒng)處理所有和時(shí)間有關(guān)的事件。

操作系統(tǒng)中最小的時(shí)間單位是時(shí)鐘節(jié)拍,時(shí)鐘節(jié)拍是特定的周期性中斷,內(nèi)核在時(shí)鐘節(jié)拍到的時(shí)候進(jìn)行上下文切換。

RT-Thread 中,時(shí)鐘節(jié)拍的長度可以根據(jù) RT_TICK_PER_SECOND 的定義來調(diào)整,等于1/RT_TICK_PER_SECOND 秒,在我們測試的STM32F上,默認(rèn)的時(shí)鐘節(jié)拍為1ms,如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

在上一節(jié)創(chuàng)建線程的時(shí)候最后一個(gè)參數(shù)是時(shí)間節(jié)拍數(shù),比如設(shè)置為50,那么線程的時(shí)間片就是50ms。

另外,rtconfig.h中有 RT-Thread 內(nèi)核配置,線程通訊配置,組件配置,shell配置,設(shè)備驅(qū)動(dòng)配置等等的宏定義配置。

RT_TICK_PER_SECOND是可以修改的,比如我們修改成100。時(shí)鐘節(jié)拍就是10ms。

1.2 時(shí)鐘節(jié)拍實(shí)現(xiàn)原理

那么時(shí)間節(jié)拍是如何實(shí)現(xiàn)的?
前面說過:時(shí)鐘節(jié)拍是特定的周期性中斷,這個(gè)中斷一般由MCU硬件定時(shí)器決定,就是系統(tǒng)的時(shí)鐘節(jié)拍的產(chǎn)生還是基于MCU的硬件定時(shí)器!


對于我們使用的 Corex-M 芯片來說,就是由滴答定時(shí)器Systick 來實(shí)現(xiàn)系統(tǒng)時(shí)鐘節(jié)拍的。

既然與滴答定時(shí)器Systick有關(guān)系,那么我們可以通過工程代碼來看一看,如圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

在滴答定時(shí)器的中斷處理函數(shù)中,我們可以看到如下操作:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

上圖代碼中的 全局變量,rt_tick 的值表示了系統(tǒng)從啟動(dòng)開始總共經(jīng)過的時(shí)鐘節(jié)拍數(shù),即系統(tǒng)時(shí)間。rt_tick 在每經(jīng)過一個(gè)時(shí)鐘節(jié)拍時(shí),值就會加 1。

到這里又有一個(gè)問題了,STM32中滴答定時(shí)器Systick不是固定的嗎?
所以我們這里就要說說 RT_TICK_PER_SECOND 改變的是什么,這個(gè)宏定義是如何影響系統(tǒng)節(jié)拍的。

我們找到drv_common.c文件中的rt_hw_systick_init函數(shù),如下圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

上圖就是 RT-Thread 初始化配置啟動(dòng) MCU 滴答定時(shí)器的函數(shù),里面的配置用到了我們的宏定義RT_TICK_PER_SECOND,所以宏定義的改變可以直接改變 Systick 的頻率,直接使得系統(tǒng)的時(shí)鐘節(jié)拍不同。

1.3 時(shí)鐘節(jié)拍示例

在上文我們說到,全局變量 rt_tick 表示了系統(tǒng)從啟動(dòng)開始總共經(jīng)過的時(shí)鐘節(jié)拍數(shù), RT-Thread 給我們提供了一個(gè)函數(shù)rt_tick_get來查看當(dāng)前的時(shí)鐘節(jié)拍值:

/*
返回值:rt_tick 	當(dāng)前時(shí)鐘節(jié)拍值
*/
rt_tick_t rt_tick_get(void);

為了鞏固一下上面的內(nèi)容,我們來簡單的做個(gè)測試,因?yàn)闇y試比較簡單,我就直接上圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

當(dāng)RT_TICK_PER_SECOND為1000的時(shí)候,就表示我們設(shè)置系統(tǒng)節(jié)拍為 1ms,那么 tick 的值就是 1ms 加一次,所以延時(shí) 1000ms 以后,是增加1000。
當(dāng)RT_TICK_PER_SECOND為100 的時(shí)候,就表示我們設(shè)置系統(tǒng)節(jié)拍為 10ms,那么 tick 的值就是 10ms 加一次,所以延時(shí) 1000ms 以后,是增加100。

二、RT-Thread 軟件定時(shí)器

2.1 軟件定時(shí)器基本介紹

RT-Thread 操作系統(tǒng)提供軟件實(shí)現(xiàn)的定時(shí)器,以時(shí)鐘節(jié)拍(OS Tick)的時(shí)間長度為單位,即定時(shí)數(shù)值必須是 OS Tick 的整數(shù)倍。

定時(shí)器分為 單次觸發(fā)定時(shí)器,周期觸發(fā)定時(shí)器;

定時(shí)器不管使用和理解都是比較簡單的,對于軟件定時(shí)的的一些注意事項(xiàng),我在介紹FreeRTOS軟件定時(shí)器的時(shí)候?qū)戇^,可以比較參考一下,如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

與 FreeRTOS 不同的是,根據(jù)超時(shí)函數(shù)執(zhí)行時(shí)所處的上下文環(huán)境,RT-Thread 的定時(shí)器可以分為 HARD_TIMER 模式與 SOFT_TIMER 模式:

  • HARD_TIMER 模式

HARD_TIMER 模式的定時(shí)器超時(shí)函數(shù)在中斷上下文環(huán)境中執(zhí)行,RT-Thread 定時(shí)器默認(rèn)的方式是 HARD_TIMER 模式,即定時(shí)器超時(shí)后,超時(shí)函數(shù)是在系統(tǒng)時(shí)鐘中斷的上下文環(huán)境中運(yùn)行的。

簡單來說就是要把 HARD_TIMER 模式的回調(diào)函數(shù)當(dāng)成 中斷函數(shù)處理,快進(jìn)快出。

  • SOFT_TIMER 模式

SOFT_TIMER 模式可配置,通過宏定義 RT_USING_TIMER_SOFT 來決定是否啟用該模式。該模式被啟用后,系統(tǒng)會在初始化時(shí)創(chuàng)建一個(gè) timer 線程,然后 SOFT_TIMER 模式的定時(shí)器超時(shí)函數(shù)在都會在 timer 線程的上下文環(huán)境中執(zhí)行??梢栽诔跏蓟?/ 創(chuàng)建定時(shí)器時(shí)使用參數(shù)RT_TIMER_FLAG_SOFT_TIMER 來指定設(shè)置 SOFT_TIMER 模式。

個(gè)人的習(xí)慣是,應(yīng)用中還是定義 RT_USING_TIMER_SOFT,然后使用 SOFT_TIMER 模式,個(gè)人感覺這樣才更“像”軟件定時(shí)器。

最后要給個(gè)建議,實(shí)際應(yīng)用,不管是 HARD_TIMER 模式,還是 SOFT_TIMER 模式,在超時(shí)函數(shù)中都要做到快進(jìn)快出,不要有延時(shí)掛起等操作。

2.2 系統(tǒng)定時(shí)器初始化

在 RT-Thread 使用中,往往都會定義RT_USING_TIMER_SOFT ,使用軟件定時(shí)器并且啟動(dòng) SOFT_TIMER 模式 ,該模式被啟用后,系統(tǒng)會在初始化時(shí)創(chuàng)建一個(gè) timer 線程,用來對軟件定時(shí)器經(jīng)常管理,那么我們就通過源碼來看看 RT-Thread 到底是如何操作的。

通過 《RT-Thread記錄(二、RT-Thread內(nèi)核啟動(dòng)流程 — 啟動(dòng)文件和源碼分析)》學(xué)習(xí),我們可以找到rtthread_startup函數(shù):

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_16,color_FFFFFF,t_70,g_se,x_16

先來看看第一個(gè)rt_system_timer_init

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

接下來看看第二個(gè)函數(shù)rt_system_timer_thread_init

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

我們繼續(xù)進(jìn)入 timer 線程的入口函數(shù),來看看 timer 線程具體做了什么事情,這里我們就通過放源碼,看注釋來分析一下:

/* system timer thread entry */
static void rt_thread_timer_entry(void *parameter)
{
    rt_tick_t next_timeout;

    while (1)
    {
        /* 
        get the next timeout tick
        獲取下一次超時(shí)時(shí)間
        得到軟件定時(shí)器鏈表上的下一個(gè)定時(shí)器的超時(shí)時(shí)間點(diǎn)   
		*/
        next_timeout = rt_timer_list_next_timeout(rt_soft_timer_list);
        /*
        如果超過范圍,表示沒有軟件定時(shí)器,
        則掛起當(dāng)前線程,繼續(xù)線程調(diào)度
        */
        if (next_timeout == RT_TICK_MAX)
        {
            /* no software timer exist, suspend self. */
            rt_thread_suspend(rt_thread_self());
            rt_schedule();
        }
        else
        {
            rt_tick_t current_tick;

            /* 
            get current tick 
            獲取當(dāng)前時(shí)間點(diǎn)
            */
            current_tick = rt_tick_get();
			 /*
			 離下個(gè)中斷時(shí)間點(diǎn)還差些時(shí)候
			 */
            if ((next_timeout - current_tick) < RT_TICK_MAX / 2)
            {
                /* get the delta timeout tick */
                next_timeout = next_timeout - current_tick;//計(jì)算還差多長時(shí)間
                rt_thread_delay(next_timeout);//休眠差的這段時(shí)間 
            }
        }

        /* 
        check software timer
        檢查是否該產(chǎn)生超時(shí)事件
        */
        rt_soft_timer_check();
    }
}
#endif

如果要繼續(xù)往下面分析,就得繼續(xù)分析rt_soft_timer_check();的實(shí)現(xiàn)源碼了,這里我們就不繼續(xù)分析下去,因?yàn)榈侥壳盀橹?,我們對?RT-Thread 系統(tǒng)定時(shí)器的初始化過程已經(jīng)有了一個(gè)全面的認(rèn)識,對于我們理解定時(shí)器有了很大的幫助,但是喜歡研究的小伙伴可以繼續(xù)往下面分析,分析源碼是理解一個(gè)系統(tǒng)最直接最有效的方式!

2.3 定時(shí)器工作機(jī)制

和線程控制塊一樣,內(nèi)核對于定時(shí)器的管理是通過這個(gè)定時(shí)器控制塊結(jié)構(gòu)體,里面包括 RT-Thread 軟件定時(shí)器的所有的“屬性”,對這些屬性的查看,修改就可以對實(shí)現(xiàn)對這個(gè)軟件定時(shí)器的管理控制。

/**
 * timer structure
 */
struct rt_timer
{
	/**< inherit from rt_object */
    struct rt_object parent;                            
	/* 定時(shí)器鏈表節(jié)點(diǎn) */
    rt_list_t        row[RT_TIMER_SKIP_LIST_LEVEL];    
	/**< timeout function 定時(shí)器超時(shí)調(diào)用的函數(shù) */
    void (*timeout_func)(void *parameter);
    /**< timeout function's parameter 超時(shí)函數(shù)的參數(shù)*/             
    void            *parameter;                         
 	/**		 < timer timeout tick  定時(shí)器初始超時(shí)節(jié)拍數(shù) */
    rt_tick_t        init_tick;
    /**< timeout tick 定時(shí)器實(shí)際超時(shí)時(shí)的節(jié)拍數(shù)*/                         
    rt_tick_t        timeout_tick;                     
};
typedef struct rt_timer *rt_timer_t;

定時(shí)器控制塊由 struct rt_timer 結(jié)構(gòu)體定義并形成定時(shí)器內(nèi)核對象,再鏈接到內(nèi)核對象容器中進(jìn)行管理,list 成員則用于把一個(gè)激活的(已經(jīng)啟動(dòng)的)定時(shí)器鏈接到 rt_timer_list 鏈表中。

對于定時(shí)器的工作機(jī)制,在 RT-Thread 的介紹已經(jīng)很詳細(xì)了,我這里用官方一張圖表示一下:

在這里插入圖片描述

對于定時(shí)器的工作機(jī)制,實(shí)際上對我們使用定時(shí)器并沒有直接的幫助(因?yàn)槎〞r(shí)器的使用真的很簡單),但是他能夠讓我們更深的理解定時(shí)器。往往這些更深的理解在我們遇到問題的時(shí)候,對解決問題起著至關(guān)重要的作用。

2.4 us 延時(shí)函數(shù)

使用過STM32 HAL 庫的小伙伴都知道,HAL庫是沒有us延時(shí)的,在 FreeRTOS 中,也是沒有us延時(shí)函數(shù)的。但是我們在進(jìn)行一些總線操作的時(shí)候,比如軟件 I2C 通訊,不得不用到 us 延時(shí)函數(shù)。
現(xiàn)在好了,在使用 RT-Thread 的時(shí)候,系統(tǒng)直接給了我們一個(gè) us延時(shí)函數(shù),如下:

/**
 * This function will delay for some us.
 *
 * @param us the delay time of us
 */
void rt_hw_us_delay(rt_uint32_t us)
{
    rt_uint32_t start, now, delta, reload, us_tick;
    start = SysTick->VAL;
    reload = SysTick->LOAD;
    /* 獲得延時(shí)經(jīng)過的 tick 數(shù) */
    us_tick = SystemCoreClock / 1000000UL;
    do {  	
        now = SysTick->VAL; // 獲得當(dāng)前時(shí)間 
        delta = start > now ? start - now : reload + start - now;
    } while(delta < us_tick * us);
}

注意,這個(gè)函數(shù)只能支持低于 1 OS Tick 的延時(shí)。比如我們默認(rèn)的設(shè)置,1OS Tick 為 1ms,那么這個(gè)函數(shù)的參數(shù) us 必須小于 1000!

2.5 軟件定時(shí)器 or 硬件定時(shí)器?

那么在實(shí)際應(yīng)用中,是使用軟件定時(shí)器 還是硬件定時(shí)器?我在另外一篇博文有過說明,如下圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

用我們常用的 STM32系列芯片打個(gè)比方,也要看什么系列的芯片,首先STM32的定時(shí)器其實(shí)已經(jīng)足夠多,不管是M0全系列,還是M3M4全系列,至少也有4個(gè)(有錯(cuò)誤請指出),他的硬件定時(shí)器足夠多的情況下,你可以不用軟件定時(shí)器,對于一些系列信號,RAM比較小的情況,有的小于10KB,那么你在跑 RTOS 的時(shí)候都得特別注意內(nèi)存大小,這個(gè)時(shí)候如果對內(nèi)存管理,代碼優(yōu)化不是很了解的情況下,我是不建議用的。


但是一些特殊的應(yīng)用場合,軟件定時(shí)器還是比硬件定時(shí)器優(yōu)勢明顯,因?yàn)榭梢噪S意更改延時(shí)時(shí)間。同時(shí)使用軟件定時(shí)器的代碼移植起來更快。

三、 RT-Thread 軟件定時(shí)器操作函數(shù)

上文的基礎(chǔ)知識,說來說去也有一大堆了,到了說說怎么使用的時(shí)候了。
(快點(diǎn)!快點(diǎn)!理論都快睡著了! 用起來!展示起來?。?/p>

3.1 動(dòng)態(tài)創(chuàng)建和刪除定時(shí)器

動(dòng)態(tài)創(chuàng)建定時(shí)器(函數(shù)介紹看注釋,以下函數(shù)介紹類似):

/*
參數(shù)的含義:
1、name 	定時(shí)器的名稱
2、void (timeout) (void parameter) 	定時(shí)器超時(shí)函數(shù)指針(當(dāng)定時(shí)器超時(shí)時(shí),系統(tǒng)會調(diào)用這個(gè)函數(shù))
3、parameter 	定時(shí)器超時(shí)函數(shù)的入口參數(shù)(當(dāng)定時(shí)器超時(shí)時(shí),調(diào)用超時(shí)回調(diào)函數(shù)會把這個(gè)參數(shù)做為入口參數(shù)傳遞給超時(shí)函數(shù))
4、time 	定時(shí)器的超時(shí)時(shí)間,單位是時(shí)鐘節(jié)拍
5、flag 	定時(shí)器創(chuàng)建時(shí)的參數(shù),支持的值包括單次定時(shí)、周期定時(shí)、硬件定時(shí)器、軟件定時(shí)器等(可以用 “或” 關(guān)系取多個(gè)值)
返回值:
RT_NULL   	創(chuàng)建失?。ㄍǔ捎谙到y(tǒng)內(nèi)存不夠用而返回 RT_NULL)
定時(shí)器的句柄 	定時(shí)器創(chuàng)建成功
 */
rt_timer_t rt_timer_create(const char *name,
                           void (*timeout)(void *parameter),
                           void       *parameter,
                           rt_tick_t   time,
                           rt_uint8_t  flag)

上面的函數(shù),其中第5個(gè)參數(shù) flag,有2組值可以填寫(對于靜態(tài)創(chuàng)建定時(shí)器也是如此),如下圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

上面的2組宏定義可以以 “或” 邏輯的方式賦給 flag,比如:

pYYBAGKv7pKAaVBcAAAW6GOcMMA275.png

動(dòng)態(tài)刪除定時(shí)器

/*
參數(shù):
timer 	定時(shí)器句柄,指向要?jiǎng)h除的定時(shí)器控制塊
返回值:
RT_EOK 	刪除成功
*/
rt_err_t rt_timer_delete(rt_timer_t timer);

3.2 靜態(tài)創(chuàng)建和刪除定時(shí)器

和線程一樣,官方的用語是 初始化 和 脫離 定時(shí)器(理由在我上一篇博文有分析)。

靜態(tài)創(chuàng)建定時(shí)器

/*
參數(shù)的含義:
1、timer 	定時(shí)器句柄,指向要初始化的定時(shí)器控制塊,用戶創(chuàng)建的定時(shí)器控制塊結(jié)構(gòu)體
2、name 	定時(shí)器的名稱
3、void (timeout) (void parameter) 	定時(shí)器超時(shí)函數(shù)指針(當(dāng)定時(shí)器超時(shí)時(shí),系統(tǒng)會調(diào)用這個(gè)函數(shù))
4、parameter 	定時(shí)器超時(shí)函數(shù)的入口參數(shù)(當(dāng)定時(shí)器超時(shí)時(shí),調(diào)用超時(shí)回調(diào)函數(shù)會把這個(gè)參數(shù)做為入口參數(shù)傳遞給超時(shí)函數(shù))
5、time 	定時(shí)器的超時(shí)時(shí)間,單位是時(shí)鐘節(jié)拍
6、flag 	定時(shí)器創(chuàng)建時(shí)的參數(shù),支持的值包括單次定時(shí)、周期定時(shí)、硬件定時(shí)器、軟件定時(shí)器等(可以用 “或” 關(guān)系取多個(gè)值)
返回值:
無返回值
 */
void rt_timer_init(rt_timer_t  timer,
                   const char *name,
                   void (*timeout)(void *parameter),
                   void       *parameter,
                   rt_tick_t   time,
                   rt_uint8_t  flag)

靜態(tài)刪除定時(shí)器

/**
參數(shù):
timer 	定時(shí)器句柄,指向要?jiǎng)h除的定時(shí)器控制塊
返回值:
RT_EOK 	刪除成功
 */
rt_err_t rt_timer_detach(rt_timer_t timer)

3.3 啟動(dòng)和停止定時(shí)器

啟動(dòng)定時(shí)器

當(dāng)定時(shí)器被創(chuàng)建或者初始化以后,并不會被立即啟動(dòng),必須在調(diào)用啟動(dòng)定時(shí)器函數(shù)接口后,才開始工作,啟動(dòng)定時(shí)器函數(shù)接口如下:

/**
參數(shù):
timer 	定時(shí)器句柄,指向要啟動(dòng)的定時(shí)器控制塊
返回值:
RT_EOK 	啟動(dòng)成功
 */
rt_err_t rt_timer_start(rt_timer_t timer)

停止定時(shí)器

/**
參數(shù):
timer 	定時(shí)器句柄,指向要啟動(dòng)的定時(shí)器控制塊
返回值:
RT_EOK 		成功停止定時(shí)器
- RT_ERROR 	timer 已經(jīng)處于停止?fàn)顟B(tài)
 */
rt_err_t rt_timer_stop(rt_timer_t timer)

調(diào)用定時(shí)器停止函數(shù)接口后,定時(shí)器狀態(tài)將更改為停止?fàn)顟B(tài),并從 rt_timer_list 鏈表中脫離出來不參與定時(shí)器超時(shí)檢查。

當(dāng)一個(gè)周期性定時(shí)器超時(shí)時(shí),也可以調(diào)用這個(gè)函數(shù)接口停止這個(gè)定時(shí)器本身。

3.4 定時(shí)器控制函數(shù)

RT-Thread 提供了定時(shí)器控制函數(shù)接口,以獲取或設(shè)置更多定時(shí)器的信息。

/**
參數(shù)的含義:
1、timer 	 	定時(shí)器句柄,指向要控制的定時(shí)器控制塊
2、cmd 	
用于控制定時(shí)器的命令,當(dāng)前支持5個(gè)命令,
分別是設(shè)置定時(shí)時(shí)間,查看定時(shí)時(shí)間,設(shè)置單次觸發(fā),設(shè)置周期觸發(fā),查看狀態(tài)
3、arg 	
與 cmd 相對應(yīng)的控制命令參數(shù) 
比如,cmd 為設(shè)定超時(shí)時(shí)間時(shí),就可以將超時(shí)時(shí)間參數(shù)通過 arg 進(jìn)行設(shè)定
返回值:
RT_EOK 	成功
 */
rt_err_t rt_timer_control(rt_timer_t timer, int cmd, void *arg)

在官網(wǎng)介紹,上面函數(shù)的第二個(gè)參數(shù)只有 4 個(gè)命令,但是實(shí)際上我通過自己的工程查看得知現(xiàn)在的版本已經(jīng)有5個(gè)命令了,如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

四、定時(shí)器使用示例

定時(shí)器的使用還是比較簡單的,我們這里還是直接通過截圖說明的方式講解下示例。

4.1 動(dòng)態(tài)創(chuàng)建定時(shí)器示例

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

4.2 靜態(tài)創(chuàng)建定時(shí)器示例

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

結(jié)語

本文的內(nèi)容其實(shí)還是比較簡單的,在使用示例,我們只展示了定時(shí)器的創(chuàng)建方法和使用效果,實(shí)際引用中已經(jīng)能夠滿足大部分場合的需求。小伙伴可以自己新建線程嘗試通過定時(shí)器的控制函數(shù)控制某個(gè)定時(shí)器,以便更加熟悉 RT-Thread 軟件定時(shí)器的使用。

還是希望懂的朋友看完能夠多多指教!不懂的朋友看完能懂!謝謝!

聲明:本文內(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)注

    10

    文章

    1673

    瀏覽量

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

    關(guān)注

    23

    文章

    3218

    瀏覽量

    113686
  • RTOS
    +關(guān)注

    關(guān)注

    20

    文章

    804

    瀏覽量

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

    關(guān)注

    31

    文章

    1239

    瀏覽量

    39435
收藏 人收藏

    評論

    相關(guān)推薦

    RT-Thread記錄(一、版本開發(fā)環(huán)境及配合CubeMX)

    RT-Thread 學(xué)習(xí)記錄的第一篇文章,RT-Thread記錄(一、RT-Thread 版本、RT-T
    的頭像 發(fā)表于 06-20 00:28 ?4925次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>記錄</b>(一、版本開發(fā)環(huán)境及配合CubeMX)

    如何對RT-Thread內(nèi)核有基本的了解?

    RT-Thread時(shí)鐘管理以時(shí)鐘節(jié)拍為基礎(chǔ),時(shí)鐘節(jié)拍
    的頭像 發(fā)表于 07-19 10:12 ?7034次閱讀
     如何對<b class='flag-5'>RT-Thread</b>內(nèi)核有基本的了解?

    基于STM32和RT-thread內(nèi)核的系統(tǒng)時(shí)鐘

    一、系統(tǒng)時(shí)鐘rt-thread的系統(tǒng)時(shí)鐘模塊采用全局變量rt_tick作為系統(tǒng)時(shí)鐘節(jié)拍,該變量在
    發(fā)表于 03-02 14:21

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

    )【每日一練】RT-Thread Nano-ADC(時(shí)鐘管理之軟件定時(shí)器)-1軟件定時(shí)器創(chuàng)建(第
    發(fā)表于 06-02 10:32

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

    。 2)軟件定時(shí)器是由操作系統(tǒng)提供的一類系統(tǒng)接口,它構(gòu)建在硬件定時(shí)器基礎(chǔ)之上,使系統(tǒng)能夠提供不受數(shù)目限制的定時(shí)器服務(wù)。RT-Thread
    發(fā)表于 06-24 11:21

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

    長短是 OS Tick 時(shí)長的整數(shù)倍。如果一個(gè)時(shí)鐘節(jié)拍是 10ms,那么系統(tǒng)軟件定時(shí)器時(shí)長只能是 10ms、20ms、100等,而不能是 15ms。
    發(fā)表于 04-02 11:41

    如何設(shè)置rt-thread定時(shí)

    如果我當(dāng)前的時(shí)鐘節(jié)拍是0xfffffffd,我如果這時(shí)候開啟一個(gè)軟件定時(shí)器,tick設(shè)置值為2,那么插入到軟件
    發(fā)表于 06-02 11:19

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

    及配合CubeMX)RT-Thread記錄(二、RT-Thread內(nèi)核啟動(dòng)流程)RT-Thread記錄(三、
    發(fā)表于 07-26 14:56

    RT-Thread系統(tǒng)的時(shí)鐘管理接口詳細(xì)描述

    基礎(chǔ),時(shí)鐘節(jié)拍指的是周期性硬件定時(shí)器兩次中斷間的間隔時(shí)間長度, 這個(gè)周期性硬件定時(shí)器稱之為系統(tǒng)時(shí)鐘時(shí)鐘
    發(fā)表于 08-26 16:27

    RT-Thread系統(tǒng)定時(shí)器管理相關(guān)資料介紹

    系統(tǒng)開銷也將越大(在1秒中系統(tǒng)用于處理時(shí)鐘中斷的次數(shù)也就越多)。RT-Thread定時(shí)器也基于類似的系統(tǒng)節(jié)拍,提供了基于節(jié)拍整數(shù)倍的
    發(fā)表于 09-14 16:21

    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 STM32 配置系統(tǒng)時(shí)鐘(使用外部晶振)

    RT-Thread STM32 配置系統(tǒng)時(shí)鐘開發(fā)環(huán)境芯片:STM32F103RCT6RT-Thread Studio: V1.0.6(現(xiàn)在已經(jīng)更新到1.1.3,由于本人使用RTT開發(fā)已
    發(fā)表于 12-14 18:45 ?14次下載
    <b class='flag-5'>RT-Thread</b> STM32 配置系統(tǒng)<b class='flag-5'>時(shí)鐘</b>(使用外部晶振)

    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í)器信號量靜態(tài)創(chuàng)建與動(dòng)態(tài)創(chuàng)建信號量信號量實(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
    發(fā)表于 01-17 09:31 ?4次下載
    詳細(xì)剖析Linux和RTOS(<b class='flag-5'>RT-Thread</b>)的<b class='flag-5'>時(shí)鐘</b>和<b class='flag-5'>定時(shí)器</b>的使用

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

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