1. 程式人生 > >Keil MDK之RTX系統時鐘節拍和時間管理

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);
}
5、函式os_dly_wait和os_itv_wait的區別

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閃爍