Keil MDK之RTX系统时钟节拍和时间管理

一、RTX的时钟节拍

RTX的系统时钟节拍可以在配置向导里面设置:如下

Keil MDK之RTX系统时钟节拍和时间管理_第1张图片

1、Hardware timer

Core SysTick表示选择系统滴答定时器

2、Timer clock value

表示定时器的主频,单位HZ

3、Timer tick value

表示系统时钟节拍周期,单位us

二、RTX的时间管理

RTX的时钟管理函数有4个,如下是帮助手册

Keil MDK之RTX系统时钟节拍和时间管理_第2张图片

下面分别对四个函数进行说明


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闪烁

你可能感兴趣的:(Keil MDK之RTX系统时钟节拍和时间管理)