国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

鴻蒙Hi3861學習六-Huawei LiteOS-M(軟件定時器)

這篇具有很好參考價值的文章主要介紹了鴻蒙Hi3861學習六-Huawei LiteOS-M(軟件定時器)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、簡介

? ? ? ? 軟件定時器,是基于系統(tǒng)Tick時鐘中斷且由軟件來模擬的定時器。當經(jīng)過設(shè)定的Tick時鐘計數(shù)值后,會觸發(fā)用戶定義的回調(diào)函數(shù)。定時精度與系統(tǒng)Tick時鐘周期有關(guān)。

? ? ? ? 硬件定時器受硬件的限制,數(shù)量上不足以滿足用戶的實際需求。因此,為了滿足用戶需求,提供更多的定時器,LiteOS提供軟件定時器功能。

? ? ? ? 軟件定時器擴展了定時器的數(shù)量,允許創(chuàng)建更多的定時業(yè)務(wù)。

? ? ? ? 軟件定時器功能上支持:

  • 靜態(tài)裁剪:能通過宏關(guān)閉軟件定時器功能。
  • 軟件定時器創(chuàng)建。
  • 軟件定時器啟動
  • 軟件定時器停止。
  • 軟件定時器刪除
  • 軟件定時器剩余Tick數(shù)獲取。

? ? ? ? 更多概念可以參考:FreeRTOS學習六(軟件定時器)_freertos 執(zhí)行定時器回調(diào)函數(shù)的內(nèi)存消耗將是在定時器任務(wù)堆棧上動態(tài)分配_t_guest的博客-CSDN博客

????????Timer Management

二、運作機制

? ? ? ? 軟件定時器使用了系統(tǒng)的一個隊列一個任務(wù)資源,軟件定時器的觸發(fā)遵循隊列規(guī)則,先進先出。定時時間短的定時器總是比定時時間長的靠近隊列頭,滿足優(yōu)先被觸發(fā)的準則。

? ? ? ? 軟件定時器以Tick為基本計時單位,當用戶創(chuàng)建并啟動一個軟件定時器時,LiteOS會根據(jù)當前系統(tǒng)Tick時間寄用戶設(shè)置的定時間隔確定該定時器的到期Tick時間,并將該定時器控制結(jié)構(gòu)掛入計時全局鏈表。

? ? ? ? 當Tick中斷到來時,在Tick中斷處理函數(shù)中掃描軟件定時器的計時全局鏈表,看是否有定時器超時,若有則將超時的定時器記錄下來。

? ? ? ? Tick中斷處理函數(shù)結(jié)束后,軟件定時器任務(wù)(優(yōu)先級最高)被喚醒,在該任務(wù)中調(diào)傭之前記錄下來的定時器的超時回調(diào)函數(shù)。

三、API介紹

??????osTimerNew

????????函數(shù)功能

? ? ? ? 創(chuàng)建一個軟件定時器

? ? ? ??函數(shù)原型

osTimerId_t osTimerNew(osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr)

? ? ? ??參數(shù)

? ? ? ? func:超時回調(diào)函數(shù)

? ? ? ? type:運行模式

osTimerOnce 0,單次
osTimerPeriodic 1,周期

? ? ? ? argument:傳給定時器的參數(shù)。沒有填NULL

? ? ? ? attr:定時器相關(guān)屬性。自定義地址的時候會用到。大部分情況用不到,填NULL。

? ? ? ??返回值

? ? ? ? NULL:失敗

? ? ? ? 其他值:osTimerId_t類型的定時器ID。該ID給其他函數(shù)使用

? ? ? ??實例

osTimerPeriodic
char timer1_param[] = "timer1 param";
g_timer1_id = osTimerNew(Timer1_Callback, osTimerPeriodic, timer1_param, NULL);

??????osTimerStart

????????函數(shù)功能

? ? ? ? 軟件定時器啟動

? ? ? ??函數(shù)原型

osStatus_t osTimerStart(osTimerId_t timer_id, uint32_t ticks)

? ? ? ??參數(shù)

? ? ? ? timer_id:軟件定時器ID,創(chuàng)建時osTimerNew獲得

? ? ? ? ticks:軟件定時器的定時周期。對于Hi3861,定時器單位為10ms。

? ? ? ??返回值

? ? ? ? osOK:成功

? ? ? ? 其他值:失敗

typedef enum {
  /** Operation completed successfully */
  osOK                      =  0,
  /** Unspecified error */
  osError                   = -1,
  /** Timeout */
  osErrorTimeout            = -2,
  /** Resource error */
  osErrorResource           = -3,
  /** Incorrect parameter */
  osErrorParameter          = -4,
  /** Insufficient memory */
  osErrorNoMemory           = -5,
  /** Service interruption */
  osErrorISR                = -6,
  /** Reserved. It is used to prevent the compiler from optimizing enumerations. */
  osStatusReserved          = 0x7FFFFFFF
} osStatus_t;

? ? ? ??實例

osTimerId_t g_timer1_id;
timerDelay = 100U;
status = osTimerStart(g_timer1_id, timerDelay);

??????osTimerStop

????????函數(shù)功能

? ? ? ? 軟件定時器停止

? ? ? ??函數(shù)原型

osStatus_t osTimerStop(osTimerId_t timer_id)

? ? ? ??參數(shù)

? ? ? ? timer_id 定時器ID

? ? ? ??返回值

????????osOK:成功

? ? ? ? 其他值:失敗

? ? ? ??實例

osTimerId_t g_timer1_id;
osTimerStop(g_timer1_id);

??????osTimerDelete

????????函數(shù)功能

? ? ? ? 軟件定時器刪除

? ? ? ??函數(shù)原型

osStatus_t osTimerDelete(osTimerId_t timer_id)

? ? ? ??參數(shù)

????????timer_id 定時器ID

? ? ? ??返回值

????????osOK:成功

? ? ? ? 其他值:失敗

? ? ? ??實例

osTimerId_t g_timer1_id;
osTimerDelete(g_timer1_id);

四、代碼實例

? ? ? ? 此代碼創(chuàng)建兩個軟件定時器,定時器1為循環(huán)定時器,定時器2為單次定時器

#define LOG_I(fmt, args...)   printf("<%8ld> - [TIMER]:"fmt"\r\n",osKernelGetTickCount(),##args);
#define LOG_E(fmt, args...)   printf("<%8ld>-[TIMER_ERR]>>>>>>>>>>>>:"fmt"\r\n",osKernelGetTickCount(), ##args);

osTimerId_t g_timer1_id;
osTimerId_t g_timer2_id;

/***** 定時器1 回調(diào)函數(shù) *****/
void Timer1_Callback(void *arg)
{
    static uint8_t cnt = 0;
    LOG_I("timer1 callback,cnt:%d,param:%s",cnt,arg);
    if(cnt++ > 10)
    {
        osTimerDelete(g_timer1_id);
        LOG_I("timer1 delete");
    }
    else if(cnt == 3)
    {
        osTimerStop(g_timer1_id);
        LOG_I("timer1 stop and restart timer2");
        osTimerStart(g_timer2_id, 500);
    }
}

/***** 定時器2 回調(diào)函數(shù) *****/
void Timer2_Callback(void *arg)
{
    LOG_I("timer2 callback,param:%d",*(uint32_t *)arg);

    osTimerStart(g_timer1_id, 100);
    LOG_I("start timer1");
}

char timer1_param[] = "timer1 param";
uint32_t timer2_param = 1024;

void Hello_World(void)
{
    LOG_I("Test software Timer");

    uint32_t timerDelay;
    osStatus_t status;

/*timer 1*/
    g_timer1_id = osTimerNew(Timer1_Callback, osTimerPeriodic, timer1_param, NULL);
    if (g_timer1_id != NULL)
    {
        // Hi3861 1U=10ms,100U=1S
        timerDelay = 100U;

        status = osTimerStart(g_timer1_id, timerDelay);
        if (status != osOK)
        {
            LOG_E("timer1 start error");        
        }
        else
        {
            LOG_I("timer1 start success,cycle:%dms",timerDelay * 10);
        }
    }
    else
    {
        LOG_E("timer1 create fail!!!");
    }

/*timer 2*/
    g_timer2_id = osTimerNew(Timer2_Callback, osTimerOnce, (void *)&timer2_param, NULL);
    if (g_timer2_id != NULL)
    {
        // Hi3861 1U=10ms,100U=1S
        timerDelay = 500U;

        status = osTimerStart(g_timer2_id, timerDelay);
        if (status != osOK)
        {
            LOG_E("timer2 start error");
        }
        else
        {
            LOG_I("timer2 start success,cycle:%dms",timerDelay * 10);
        }
    }
    else
    {
        LOG_E("timer2 create fail!!!");
    }
}

? ? ? ? 定時器1為循環(huán)定時器,循環(huán)周期為1秒,定時器2為單次定時器,超時時間為5秒。兩個定時器同時啟動。在定時器1第三秒的時候,會停止自己,并且重新啟動定時器2。定時器2超時后會重新啟動定時器1。定時器1在第10次時會刪除自己。

? ? ? ? 看運行結(jié)果:

鴻蒙Hi3861學習六-Huawei LiteOS-M(軟件定時器)

? ? ? ? ?可以看到,雖然定時器2在運行,但是如果此時再次調(diào)用osTimerStart來啟動定時器2,會刷新定時器的超時時間。

? ? ? ? 這里我們用軟件打印當前的時間戳,來看一下1秒的定時周期是否準確。

鴻蒙Hi3861學習六-Huawei LiteOS-M(軟件定時器)

? ? ? ? ?可以看到1秒的定時還是很準的。文章來源地址http://www.zghlxwxcb.cn/news/detail-445682.html

到了這里,關(guān)于鴻蒙Hi3861學習六-Huawei LiteOS-M(軟件定時器)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Hi3861鴻蒙物聯(lián)網(wǎng)項目實戰(zhàn):智能安防報警

    Hi3861鴻蒙物聯(lián)網(wǎng)項目實戰(zhàn):智能安防報警

    華清遠見FS-Hi3861開發(fā)套件,支持HarmonyOS 3.0系統(tǒng)。開發(fā)板主控Hi3861芯片內(nèi)置WiFi功能,開發(fā)板板載資源豐富,包括傳感器、執(zhí)行器、NFC、顯示屏等,同時還配套豐富的拓展模塊。開發(fā)板配套豐富的學習資料,包括全套開發(fā)教程、視頻課程、7大項目實戰(zhàn)案例 可以幫助學員系統(tǒng)性學

    2024年02月09日
    瀏覽(23)
  • 鴻蒙OS Hi3861的芯片實際開發(fā)中遇到的問題

    優(yōu)點: 比較適合開發(fā)者快速開發(fā),上面的硬件操作的函數(shù)封裝很簡單,非常適合初學者使用封裝好的函數(shù)調(diào)用硬件管腳,比如I2c gpio spi sdio 都被封裝了,特別簡單,中文注釋,而且還提供了無線wifi 的封裝函數(shù),當然也有http 解析啊什么的,可以使用在簡單的物聯(lián)網(wǎng)控制的簡單

    2024年02月09日
    瀏覽(24)
  • 鴻蒙OS2.0 設(shè)備開發(fā)之Hi3861-基礎(chǔ)功能匯總

    鴻蒙OS2.0 設(shè)備開發(fā)之Hi3861-基礎(chǔ)功能匯總

    這是一篇講解在 鴻蒙2.0全量源碼中開發(fā)Hi3861 的常用功能匯總,可幫助我們 快速配置GPIO 如,如何實現(xiàn) PWM、I2C、ADC 等。 1.1 輸出 分兩步,使能、配置輸出值; 需要注意的是,有些GPIO還需要設(shè)置復用功能,可能默認不是普通GPIO模式。 這時候就需要使用 hi_io_set_func 函數(shù);以

    2024年02月07日
    瀏覽(25)
  • 使用FS_Hi3861鴻蒙開發(fā)板編譯時常見的一些問題

    使用FS_Hi3861鴻蒙開發(fā)板編譯時常見的一些問題

    本文檔支持的是下面的產(chǎn)品 華清遠見 FS-Hi3861 https://gitee.com/HiSpark/hi3861_hdu_iot_application/blob/master/src/vendor/hqyj/fs_hi3861/doc/%E5%8D%8E%E6%B8%85%E8%BF%9C%E8%A7%81%20FS_Hi3861%E5%BC%80%E5%8F%91%E6%8C%87%E5%AF%BC.md 目錄 在添加第三方庫完成后,再次編譯報錯,提示“undefined reference to ******” 編譯的時候,

    2024年02月08日
    瀏覽(52)
  • HI3861學習筆記(12)——GPIO輸入接口使用

    HI3861學習筆記(12)——GPIO輸入接口使用

    HI3861V100 芯片有 15 個 GPIO,引腳分布如下: 以下 GPIO 接口位于 baseiot_hardwareinterfaceskitswifiiot_litewifiiot_gpio.h 。 業(yè)務(wù)BUILD.gn中包含路徑 功能 初始化GPIO外設(shè) 函數(shù)定義 unsigned int GpioInit(void) 參數(shù) 無 返回 錯誤碼 功能 設(shè)置GPIO輸出方向 函數(shù)定義 unsigned int GpioSetDir(WifiIotGpioIdx id,

    2024年02月09日
    瀏覽(20)
  • Hi3861開發(fā)環(huán)境搭建 ||避坑指南|| [適用于幾乎所有以Hi3861為主控的開發(fā)板]

    Hi3861開發(fā)環(huán)境搭建 ||避坑指南|| [適用于幾乎所有以Hi3861為主控的開發(fā)板]

    前言: 這幾天為了搭建Hi3861的開發(fā)環(huán)境,看了不少官方文檔和視頻,但是依然折騰了很久才配置好編譯、上傳都能正常的環(huán)境,這其中踩了不少坑,希望通過這篇文章能讓大家少踩點。 當然其實主要問題還是源碼更新、視頻教程更新還有文檔更新速度沒匹配上 參考海思社區(qū)

    2024年02月05日
    瀏覽(90)
  • Hi3861 OpenHarmony 運行Hello World

    Hi3861 OpenHarmony 運行Hello World

    海思 hi3861 有2個型號: ?Hi3861LV100 低功耗版 低功耗MCU Wi-Fi芯片,適用于智能門鎖、智能貓眼等低功耗物聯(lián)網(wǎng)智能產(chǎn)品。 Hi3861V100 標準版 MCU Wi-Fi芯片,適用于大小家電、電工照明等常電類物聯(lián)網(wǎng)智能產(chǎn)品。 系統(tǒng)默認的是標準版,低功耗版好像是需要改下設(shè)置。越簡單越好的原

    2024年02月20日
    瀏覽(22)
  • Hi3861 硬件 i2c 驅(qū)動 oled

    Hi3861 硬件 i2c 驅(qū)動 oled

    最近想用 3861 做個有意思的東西,記錄一下開發(fā)過程。今天使用 3861 的硬件 i2c 驅(qū)動 oled。 硬件平臺:Bearpi-Nano 軟件SDK:潤和sdk 我之前寫過一篇基于 stm32cubemx 快速使用 iic 接口 oled 的過程,里面有現(xiàn)成的 oled 接口,我們只要直接拿過來替換掉底層接口就行。 ?STM32CubeMX驅(qū)動4腳

    2023年04月23日
    瀏覽(27)
  • Hi3861開發(fā)第一節(jié):環(huán)境搭建,并順利完成編譯

    Hi3861開發(fā)第一節(jié):環(huán)境搭建,并順利完成編譯

    步驟一:下載devicetool-windows-tool-3.1.0.400.zip版,下載網(wǎng)址:https://device.harmonyos.c om/cn/develop/ide#download 步驟二:解壓DevEco Device Tool壓縮包,雙擊安裝包程序,點擊\\\"下一步\\\"進行安裝(如果之前有 安裝過,會彈出先卸載之前版本在安裝,請按照要求先卸載); 步驟三:設(shè)置DevEco

    2024年02月09日
    瀏覽(20)
  • 鴻蒙LiteOs讀源碼教程+向LiteOS中添加一個簡單的基于線程運行時的短作業(yè)優(yōu)先調(diào)度策略

    鴻蒙LiteOs讀源碼教程+向LiteOS中添加一個簡單的基于線程運行時的短作業(yè)優(yōu)先調(diào)度策略

    【找到了一種簡單易懂的實驗實現(xiàn)方式,適合基礎(chǔ)較薄弱的同學,見第二部分】 最終效果如下: 依次創(chuàng)建了3個任務(wù)線程,以O(shè)ne、Two、Three指代,時間分別為15秒、30秒、10秒。 如果按生成順序輸出應該是:One-Two-Three,但我們修改了OsPriQueueEnqueue函數(shù),由原先的“先進先出”,

    2024年02月05日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包