日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

软定时器的启动与停止

發布時間:2025/4/5 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 软定时器的启动与停止 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 軟定時器的啟動與停止

1 軟定時器的啟動與停止

軟定時器單獨開一個定時器任務來處理,硬定時器直接放在Systick中斷中進行處理。

定時器啟動:

定時器停止:

具體的實現代碼如下:

/*************************************** Copyright (c)****************************************************** ** File name : tTimer.c ** Latest modified Date : 2016-06-01 ** Latest Version : 0.1 ** Descriptions : tinyOS的軟定時器實現 ** **-------------------------------------------------------------------------------------------------------- ** Created by : 01課堂 lishutong ** Created date : 2016-06-01 ** Version : 1.0 ** Descriptions : The original version ** **-------------------------------------------------------------------------------------------------------- ** Copyright : 版權所有,禁止用于商業用途 ** Author Blog : http://ilishutong.com **********************************************************************************************************/ #include "tinyOS.h" #include "tTimer.h"// "硬"定時器列表 static tList tTimerHardList;// "軟"定時器列表 static tList tTimerSoftList;// 用于訪問軟定時器列表的信號量 static tSem tTimerProtectSem;// 用于軟定時器任務與中斷同步的計數信號量 static tSem tTimerTickSem;/********************************************************************************************************** ** Function name : tTimerInit ** Descriptions : 初始化定時器 ** parameters : timer 等待初始化的定時器 ** parameters : delayTicks 定時器初始啟動的延時ticks數。 ** parameters : durationTicks 給周期性定時器用的周期tick數,一次性定時器無效 ** parameters : timerFunc 定時器回調函數 ** parameters : arg 傳遞給定時器回調函數的參數 ** parameters : timerFunc 定時器回調函數 ** parameters : config 定時器的初始配置 ** Returned value : 無 ***********************************************************************************************************/ void tTimerInit (tTimer * timer, uint32_t delayTicks, uint32_t durationTicks,void (*timerFunc) (void * arg), void * arg, uint32_t config) {tNodeInit(&timer->linkNode);timer->startDelayTicks = delayTicks;timer->durationTicks = durationTicks;timer->timerFunc = timerFunc;timer->arg = arg;timer->config = config;// 如果初始啟動延時為0,則使用周期值if (delayTicks == 0){timer->delayTicks = durationTicks;}else{timer->delayTicks = timer->startDelayTicks;}timer->state = tTimerCreated; }/********************************************************************************************************** ** Function name : tTimerStart ** Descriptions : 啟動定時器 ** parameters : timer 等待啟動的定時器 ** Returned value : 無 ***********************************************************************************************************/ void tTimerStart (tTimer * timer) {switch (timer->state){case tTimerCreated:case tTimerStopped:timer->delayTicks = timer->startDelayTicks ? timer->startDelayTicks : timer->durationTicks;timer->state = tTimerStarted;// 根據定時器類型加入相應的定時器列表if (timer->config & TIMER_CONFIG_TYPE_HARD){// 硬定時器,在時鐘節拍中斷中處理,所以使用critical來防護uint32_t status = tTaskEnterCritical();// 加入硬定時器列表tListAddLast(&tTimerHardList, &timer->linkNode);tTaskExitCritical(status);}else{// 軟定時器,先獲取信號量。以處理此時定時器任務此時同時在訪問軟定時器列表導致的沖突問題tSemWait(&tTimerProtectSem, 0);tListAddLast(&tTimerSoftList, &timer->linkNode);tSemNotify(&tTimerProtectSem);}break;default:break;} }/********************************************************************************************************** ** Function name : tTimerStop ** Descriptions : 終止定時器 ** parameters : timer 等待啟動的定時器 ** Returned value : 無 ***********************************************************************************************************/ void tTimerStop (tTimer * timer) {switch (timer->state){case tTimerStarted:case tTimerRunning:// 如果已經啟動,判斷定時器類型,然后從相應的延時列表中移除if (timer->config & TIMER_CONFIG_TYPE_HARD){// 硬定時器,在時鐘節拍中斷中處理,所以使用critical來防護uint32_t status = tTaskEnterCritical();// 從硬定時器列表中移除tListRemove(&tTimerHardList, &timer->linkNode);tTaskExitCritical(status);}else{// 軟定時器,先獲取信號量。以處理此時定時器任務此時同時在訪問軟定時器列表導致的沖突問題tSemWait(&tTimerProtectSem, 0);tListRemove(&tTimerSoftList, &timer->linkNode);tSemNotify(&tTimerProtectSem);}timer->state = tTimerStopped;break;default:break;} }/********************************************************************************************************** ** Function name : tTimerCallFuncList ** Descriptions : 遍歷指定的定時器列表,調用各個定時器處理函數 ** parameters : 無 ** Returned value : 無 ***********************************************************************************************************/ static void tTimerCallFuncList (tList * timerList) {tNode * node;// 檢查所有任務的delayTicks數,如果不0的話,減1。for (node = timerList->headNode.nextNode; node != &(timerList->headNode); node = node->nextNode){tTimer * timer = tNodeParent(node, tTimer, linkNode);// 如果延時已到,則調用定時器處理函數if ((timer->delayTicks == 0) || (--timer->delayTicks == 0)){// 切換為正在運行狀態timer->state = tTimerRunning;// 調用定時器處理函數timer->timerFunc(timer->arg);// 切換為已經啟動狀態timer->state = tTimerStarted;if (timer->durationTicks > 0){// 如果是周期性的,則重復延時計數值timer->delayTicks = timer->durationTicks;}else{// 否則,是一次性計數器,中止定時器tListRemove(timerList, &timer->linkNode);timer->state = tTimerStopped;}}} }/********************************************************************************************************** ** Function name : tTimerSoftTask ** Descriptions : 處理軟定時器列表的任務 ** parameters : 無 ** Returned value : 無 ***********************************************************************************************************/ static tTask tTimeTask; static tTaskStack tTimerTaskStack[TINYOS_TIMERTASK_STACK_SIZE];static void tTimerSoftTask (void * param) {for (;;){// 等待系統節拍發送的中斷事件信號tSemWait(&tTimerTickSem, 0);// 獲取軟定時器列表的訪問權限tSemWait(&tTimerProtectSem, 0);// 處理軟定時器列表tTimerCallFuncList(&tTimerSoftList);// 釋放定時器列表訪問權限tSemNotify(&tTimerProtectSem);} }/********************************************************************************************************** ** Function name : tTimerModuleTickNotify ** Descriptions : 通知定時模塊,系統節拍tick增加 ** parameters : 無 ** Returned value : 無 ***********************************************************************************************************/ void tTimerModuleTickNotify (void) {uint32_t status = tTaskEnterCritical();// 處理硬定時器列表tTimerCallFuncList(&tTimerHardList);tTaskExitCritical(status);// 通知軟定時器節拍變化tSemNotify(&tTimerTickSem); }/********************************************************************************************************** ** Function name : tTimerModuleInit ** Descriptions : 定時器模塊初始化 ** parameters : 無 ** Returned value : 無 ***********************************************************************************************************/ void tTimerModuleInit (void) {tListInit(&tTimerHardList);tListInit(&tTimerSoftList);tSemInit(&tTimerProtectSem, 1, 1);tSemInit(&tTimerTickSem, 0, 0);#if TINYOS_TIMERTASK_PRIO >= (TINYOS_PRO_COUNT - 1)#error "The proprity of timer task must be greater then (TINYOS_PRO_COUNT - 1)" #endiftTaskInit(&tTimeTask, tTimerSoftTask, (void *)0,TINYOS_TIMERTASK_PRIO, &tTimerTaskStack[TINYOS_TIMERTASK_STACK_SIZE]); }

tTimerModuleTickNotify 需要在中斷函數中進行調用。


參考資料:

  • 【李述銅】從0到1自己動手寫嵌入式操作系統
  • 總結

    以上是生活随笔為你收集整理的软定时器的启动与停止的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。