Keil MDK之RTX系統時鐘節拍和時間管理
一、RTX的時鐘節拍
RTX的系統時鐘節拍可以在配置嚮導裡面設定:如下
1、Hardware timer
Core SysTick表示選擇系統滴答定時器
2、Timer clock value
表示定時器的主頻,單位HZ
3、Timer tick value
表示系統時鐘節拍週期,單位us
二、RTX的時間管理
RTX的時鐘管理函式有4個,如下是幫助手冊
下面分別對四個函式進行說明
1、
os_dly_wait函式原型:
void os_dly_wait ( U16 delay_time ); /* Length of time to pause */函式描述:
該函式用於任務的延時,引數為延時時間。注意:在同一個任務中不能和os_itv_wait函式混用
使用舉例:
__task void task1 (void) { .. os_dly_wait (20); .. }2、os_itv_set函式原型
void os_itv_set ( U16 interval_time ); /* Time interval for periodic wake-up */函式描述:
該函式用於設定延時時間,此函式必須配合os_itv_wait使用,引數是延時時間
使用舉例:
__task void task1 (void) { .. os_itv_set (50); .. }3、os_itv_wait函式原型
void os_itv_wait (void);
該函式用於等待延時時間到,此函式必須配合os_itv_set函式使用
使用舉例:
__task void task1 (void) { .. os_itv_set (20); for (;;) { os_itv_wait (); /* do some actions at regular time intervals */ } }4、os_time_get函式原型
U32 os_time_get (void);函式描述:
該函式用於獲取系統當前執行的時鐘節拍數
使用舉例:
BOOL init_io (void) { U32 ticks; ticks = os_time_get (); do { process_io (); if (io_ready()) { /* Success, IO initialized. */ return (__TRUE); } } while ((os_time_get () - ticks) < 10); /* Timeout, 10 ticks expired. */ return (__FALSE); }
os_dly_wait是週期性延時 os_itv_wait是相對延時
下面是實驗
實驗目的:
1、學習RTX的時間延時延時相關的函式和系統時鐘節拍計數的獲取
2、學習相對時間延時和週期性時間延時的實現
下面是完整的程式碼:
#include "bsp.h"/* 底層硬體驅動 */
#include <RTL.h>
static uint64_t AppTaskLEDStk[256/8];/*任務棧*/
static uint64_t AppTaskStartStk[512/8];/*任務棧*/
/*任務控制代碼*/
OS_TID HandleTaskLED = NULL;
/*函式宣告*/
static void AppTaskCreate(void);
__task void AppTaskLED(void);
__task void AppTaskStart(void);
/*
*********************************************************************************************************
*函 數 名: main
*功能說明: c程式入口
*形 參:無
*返 回 值: 錯誤程式碼(無需處理)
*********************************************************************************************************
*/
int main(void)
{
/*
ST韌體庫中的啟動檔案已經執行了 SystemInit() 函式,該函式在 system_stm32f4xx.c 檔案,主要功能是
配置CPU系統的時鐘,內部Flash訪問時序,配置FSMC用於外部SRAM
*/
bsp_Init();/**/
os_sys_init_user(AppTaskStart, /*任務函式*/
2, /*任務優先順序*/
&AppTaskStartStk, /*任務棧*/
sizeof(AppTaskStartStk));/*任務棧大小*/
/* 進入主程式迴圈體 */
while (1)
{
;
}
}
/*
*********************************************************************************************************
*函 數 名: AppTaskLED
*功能說明: LED閃爍的任務
*形 參:無
*返 回 值: 無
*********************************************************************************************************
*/
__task void AppTaskLED(void)
{
static uint8_t i = 0;
uint32_t Tick = 0;
while(1)
{
Tick = os_time_get();
printf("%d ",Tick);
if(i % 2 == 0)
{
GPIO_ResetBits(GPIOI,GPIO_Pin_10);/*點亮LED*/
}
else
{
GPIO_SetBits(GPIOI,GPIO_Pin_10);/*熄滅LED*/
}
os_dly_wait(100);/*系統延時函式 因為時鐘節拍為1000 所以這裡是延時800ms,也就是使AppTaskLED任務掛起800MS*/
i++;
}
}
/*
*********************************************************************************************************
*函 數 名:AppTaskCreate
*功能說明: 任務建立
*形 參:無
*返 回 值: 無
*********************************************************************************************************
*/
static void AppTaskCreate(void)
{
HandleTaskLED = os_tsk_create_user(AppTaskLED, /*任務函式*/
1, /*優先順序 注意RTX的數字越小,優先順序越低*/
&AppTaskLEDStk, /*任務棧起始地址*/
sizeof(AppTaskLEDStk));/*任務棧大小*/
}
/*
*********************************************************************************************************
*函 數 名:AppTaskStart
*功能說明: 開始任務
*形 參:無
*返 回 值: 無
*********************************************************************************************************
*/
__task void AppTaskStart(void)
{
static uint8_t i = 0;
AppTaskCreate();/*建立AppTaskLED任務*/
os_itv_set(1000);
while(1)
{
os_itv_wait();
if(i % 2 == 0)
{
GPIO_SetBits(GPIOF,GPIO_Pin_7);/*熄滅LED*/
}
else
{
GPIO_ResetBits(GPIOF,GPIO_Pin_7);/*點亮LED*/
}
i++;
}
}
實驗現象:
一個LED100ms閃爍,一個1S閃爍