詳解μC/OS-II軟體定時器簡單使用方法

來源:互聯網
上載者:User

詳解μC/OS-II軟體定時器簡單使用方法

μC/OS-II軟體定時器的基本使用主要分為兩步:建立與啟動

一、基本知識

1、建立定時器

OS_TMR *OSTmrCreate

(

INT32U dly,
INT32U period,
INT8U opt,
OS_TMR_CALLBACK callback,
void *callback_arg,
INT8U *pname,
INT8U *perr

)

入口參數解釋:

(1)dly:延時時間(單位:(1/OS_TMR_CFG_TICKS_PER_SEC)秒)

如果參數opt為:OS_TMR_OPT_ONE_SHOT,則dly表示定時器逾時時間

如果參數opt為:OS_TMR_OPT_PERIODIC,則dly表示定時器在開始迴圈模式前等待第一次啟動的逾時時間

(2)period:定時器重複啟動並執行時間周期(單位:(1/OS_TMR_CFG_TICKS_PER_SEC)秒)
如果參數opt為:OS_TMR_OPT_PERIODIC,則period表示定時器自動周期重啟的時間

如果參數opt為:OS_TMR_OPT_ONE_SHOT,則period無效

(3)opt:選擇定時器運行模式

如果參數opt為:OS_TMR_OPT_PERIODIC,則表示定時器會自動重載逾時時間,周期運行

如果參數opt為:OS_TMR_OPT_ONE_SHOT,則表示定時器只運行一次

(4)callback:逾時處理回呼函數(定時器中斷服務程式)

必須定義成類似這種函數介面的形式:void MyCallback (OS_TMR *ptmr, void *p_arg);

當定時器時間到了,就執行這個函數

(5)callback_arg:當callback被調用時傳遞給callback的入口參數

(6)pname:定時器的名稱(是一個字串,如"Timer0")

(7)*perr:定時器錯誤碼,是下面之一:

OS_ERR_NONE:沒有錯誤
OS_ERR_TMR_INVALID_DLY:指定了一個無效的延時時間
OS_ERR_TMR_INVALID_PERIOD:指定了一個無效的周期
OS_ERR_TMR_INVALID_OPT:指定了一個無效的選項
OS_ERR_TMR_ISR :在中斷服務程式裡調用錯誤
OS_ERR_TMR_NON_AVAIL:定時器池裡沒有閒置定時器

2、啟動定時器

BOOLEAN OSTmrStart (OS_TMR *ptmr, INT8U *perr)

這個函數是用來被應用程式調用,來啟動定時器的。

入口參數解釋:

(1)ptmr:指向待啟動的定時器

(2)*perr:錯誤碼

注意:μC/OS-II定時器的建立、啟動等函數不能在中斷服務程式裡調用

二、使用舉例

void OS_Timer0(OS_TMR *ptmr, void *p_arg)
{
static INT8U led = 1;

OSIntEnter();

led = !led;
LED0 = led;

OSIntExit();
}

//LED0任務
void led0_task(void *pdata)
{
OS_TMR *pTimer0 = 0;
INT8U err = 0;
pdata = pdata;

//建立定時器

pTimer0 = OSTmrCreate(0,
OS_TMR_CFG_TICKS_PER_SEC,
OS_TMR_OPT_PERIODIC,
//OS_TMR_OPT_ONE_SHOT,
(OS_TMR_CALLBACK)OS_Timer0,
(INT8U *)0,
"OSTIMER0",
&err);

OSTmrStart(pTimer0, &err); //啟動定時器

while (1)
{
delay_ms(1000);
}
}

OSTmrCreate函數參數period為OS_TMR_CFG_TICKS_PER_SEC,故逾時周期為:

(OS_TMR_CFG_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC)秒,即1秒

所以,OS_Timer0會每秒鐘被調用一次,LED0會亮一秒、滅一秒的迴圈。

三、注意:

(1)OS_TMR_CFG_TICKS_PER_SEC的值決定逾時時間的解析度,值越大,能設定的逾時時間越小,

假設設定dly或者period的為值x,則實際逾時時間為:(x / OS_TMR_CFG_TICKS_PER_SEC)秒

(2)OS_TICKS_PER_SEC的值決定μC/OS-II的時間片(即心跳周期),假設其值為100,則OS時間片為(1000ms / 100)= 10ms

即μC/OS-II時間片為(1000 / OS_TICKS_PER_SEC)毫秒

四、小技巧

可以利用MCU I/O口外部中斷加μC/OS-II的軟體定時器實現按鍵的消抖。具體是按按鍵觸發I/O硬體中斷,

然後在I/O中斷服務程式裡發送訊號量給一個阻塞的任務,這個阻塞的任務擷取訊號量後運行定時器啟動函數,

最後在定時器逾時處理函數裡讀取按鍵I/O電平值來判斷按鍵是否按下和抬起,來得到相應鍵值。故中斷觸發

方式可以配置為雙邊沿觸發。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.