【FreeRTOS操作系统教程】第17章 FreeRTOS系统时钟节拍和时间管理
标签:
freertosfatfsstemwinstm32usb |
分类: FreeRTOS |
第17章
FreeRTOS系统时钟节拍和时间管理
本章节为大家讲解FreeRTOS操作系统的系统时钟节拍和时间管理函数,其中时间管理函数是FreeRTOS的基本函数,初学者务必要掌握。
本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429。
17.1 FreeRTOS的时钟节拍
17.2 FreeRTOS的时间管理
17.3 实验例程说明
17.4
17.1 FreeRTOS 的时钟节拍
任何操作系统都需要提供一个时钟节拍,以供系统处理诸如延时、超时等与时间相关的事件。
时钟节拍是特定的周期性中断,这个中断可以看做是系统心跳。中断之间的时间间隔取决于不同的应用,一般是1ms – 100ms。时钟的节拍中断使得内核可以将任务延迟若干个时钟节拍,以及当任务等待事件发生时,提供等待超时等依据。时钟节拍率越快,系统的额外开销就越大。
对于Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429,教程配套的例子都是用滴答定时器来实现系统时钟节拍的。
l
SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号:15),滴答定时器是一个24位
的递减计数器,支持中断。使用比较简单,专门用于给操作系统提供时钟节拍。
FreeRTOS的系统时钟节拍可以在配置文件FreeRTOSConfig.h里面设置:
#define
configTICK_RATE_HZ
如上所示的宏定义配置表示系统时钟节拍是1KHz,即1ms。
17.2 FreeRTOS 的时间管理
时间管理功能是FreeRTOS操作系统里面最基本的功能,同时也是必须要掌握好的。
17.2.1 时间延迟
FreeRTOS中的时间延迟函数主要有以下两个作用:
u
u
下面我们通过如下的框图来说明一下延迟函数对任务运行状态的影响,让大家有一个形象的认识。
运行条件:
u
u
运行过程描述如下:
u
u
u
u
上面就是一个简单的任务运行状态的切换过程。
17.2.2FreeRTOS的时间相关函数
FreeRTOS时间相关的函数主要有以下4个:
u
u
u
u
下面我们对这4个函数依次进行说明:
17.2.3函数vTaskDelay
关于这个函数的讲解及其使用方法可以看FreeRTOS在线版手册:
这里也对此函数进行下介绍。
函数原型:
void vTaskDelay(
函数描述:
函数vTaskDelay用于任务的延迟。
u
typedef uint32_t TickType_t;
#define
portMAX_DELAY
即延迟时间的范围是:1- 0xFFFFFFFF
使用举例:
static void vTaskLED(void *pvParameters)
{
}
17.2.4函数vTaskDelayUntil
关于这个函数的讲解及其使用方法可以看FreeRTOS在线版手册:
这里也对此函数进行下介绍。
函数原型:
void
vTaskDelayUntil( TickType_t
*pxPreviousWakeTime,
函数描述:
函数vTaskDelayUntil用于周期性延迟。
u
u
使用这个函数要注意以下问题:
1.
#define
INCLUDE_vTaskDelayUntil
2.
使用举例:
static void vTaskLED(void *pvParameters)
{
}
17.2.5函数xTaskGetTickCount
关于这个函数的讲解及其使用方法可以看FreeRTOS在线版手册:
这里也对此函数进行下介绍。
函数原型:
volatile TickType_t xTaskGetTickCount( void );
函数描述:
函数xTaskGetTickCount用于获取系统当前运行的时钟节拍数。
使用这个函数要注意以下问题:
1. 此函数用于在任务代码里面调用,如果在中断服务程序里面调用的话,需要使用函数xTaskGetTickCountFromISR
使用举例:
static void vTaskTaskUserIF(void *pvParameters)
{
}
17.2.6函数xTaskGetTickCountFromISR
关于这个函数的讲解及其使用方法可以看FreeRTOS在线版手册:
这里也对此函数进行下介绍。
函数原型:
volatile
TickType_t xTaskGetTickCountFromISR
函数描述:
函数xTaskGetTickCountFromISR
使用这个函数要注意以下问题:
1. 此函数用于在中断服务程序里面调用,如果在任务里面调用的话,需要使用函数xTaskGetTickCount,这两个函数切不可混用。
使用举例:
void TIM6_IRQHandler( void )
{
}
17.2.7函数vTaskDelay和vTaskDelayUntil的区别
函数vTaskDelayUntil实现的是周期性延迟,而函数vTaskDelay实现的是相对性延迟,反映到实际应用上有什么区别呢,下面就给大家举一个简单的例子。
运行条件:
u
u
u
实际运行过程效果:
Task1:
bsp_KeyScan+
|----2ms + 10ms
为一个周期------|
这个就是相对性的含义
Task2:
bsp_KeyScan +
这就是周期性的含义。
下面我们通过函数vTaskDelay来实现vTaskDelayUntil,大家会有一个更加全面的认识:
static void vTaskMsgPro(void *pvParameters)
{
}
17.3实验例程说明
17.3.1STM32F103开发板实验
配套例子:
V4-311_FreeRTOS实验_周期性延迟和相对性延迟函数
实验目的:
1.
2.
实验内容:
1.
2.
3.
FreeRTOS的配置:
FreeRTOSConfig.h文件中的配置如下:
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#endif
#define
configUSE_PREEMPTION
#define
configUSE_IDLE_HOOK
#define
configUSE_TICK_HOOK
#define
configCPU_CLOCK_HZ
#define
configTICK_RATE_HZ
#define
configMAX_PRIORITIES
#define
configMINIMAL_STACK_SIZE
#define
configTOTAL_HEAP_SIZE
#define
configMAX_TASK_NAME_LEN
#define
configUSE_TRACE_FACILITY
#define
configUSE_16_BIT_TICKS
#define
configIDLE_SHOULD_YIELD
#define
configGENERATE_RUN_TIME_STATS
#define
configUSE_STATS_FORMATTING_FUNCTIONS
#define
portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
#define
portGET_RUN_TIME_COUNTER_VALUE()
//#define
portALT_GET_RUN_TIME_COUNTER_VALUE
#define
configUSE_CO_ROUTINES
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
#define
INCLUDE_vTaskPrioritySet
#define
INCLUDE_uxTaskPriorityGet
#define
INCLUDE_vTaskDelete
#define
INCLUDE_vTaskCleanUpResources
#define
INCLUDE_vTaskSuspend
#define
INCLUDE_vTaskDelayUntil
#define
INCLUDE_vTaskDelay
#ifdef __NVIC_PRIO_BITS
#else
#endif
#define
configLIBRARY_LOWEST_INTERRUPT_PRIORITY
#define
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
几个重要选项说明:
u
使能抢占式调度器
u
系统主频72MHz。
u
系统时钟节拍1KHz,即1ms。
u
定义可供用户使用的最大优先级数,如果这个定义的是5,那么用户可以使用的优先级号是0,1,2,3,4,不包含5,对于这一点,初学者要特别的注意。
u
定义堆大小,FreeRTOS内核,用户动态内存申请,任务栈等都需要用这个空间。
u
定义受FreeRTOS管理的最高优先级中断。简单的说就是允许用户在这个中断服务程序里面调用FreeRTOS的API的最高优先级。为了进一步说明这个宏定义的的作用,解释如下:
l
l
l
更多关于这个参数说明请参看第12章。
FreeRTOS任务调试信息(按K1按键,串口打印):
上面截图中打印出来的任务状态字母B, R, D, S对应如下含义:
#define
tskBLOCKED_CHAR
#define
tskREADY_CHAR
#define
tskDELETED_CHAR
#define
tskSUSPENDED_CHAR
程序设计:
u
vTaskUserIF任务
vTaskLED任务
vTaskMsgPro任务 :2048字节
vTaskStart任务
任务栈空间是在任务创建的时候从FreeRTOSConfig.h文件中定义的heap空间中申请的
#define
configTOTAL_HEAP_SIZE
u
u
int main(void)
{
}
u
硬件外设的初始化是在bsp.c文件实现:
void bsp_Init(void)
{
}
u
static void AppTaskCreate (void)
{
}
u
static void vTaskTaskUserIF(void *pvParameters)
{
}
static void vTaskLED(void *pvParameters)
{
}
static void vTaskMsgPro(void *pvParameters)
{
}
static void vTaskStart(void *pvParameters)
{
}
17.3.2STM32F407开发板实验
配套例子:
V5-311_FreeRTOS实验_周期性延迟和相对性延迟函数
实验目的:
1.
2.
实验内容:
1.
2.
3.
FreeRTOS的配置:
FreeRTOSConfig.h文件中的配置如下:
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#endif
#define
configUSE_PREEMPTION
#define
configUSE_IDLE_HOOK
#define
configUSE_TICK_HOOK
#define
configCPU_CLOCK_HZ
#define
configTICK_RATE_HZ
#define
configMAX_PRIORITIES
#define
configMINIMAL_STACK_SIZE
#define
configTOTAL_HEAP_SIZE
#define
configMAX_TASK_NAME_LEN
#define
configUSE_TRACE_FACILITY
#define
configUSE_16_BIT_TICKS
#define
configIDLE_SHOULD_YIELD
#define
configGENERATE_RUN_TIME_STATS
#define
configUSE_STATS_FORMATTING_FUNCTIONS
#define
portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
#define
portGET_RUN_TIME_COUNTER_VALUE()
//#define
portALT_GET_RUN_TIME_COUNTER_VALUE
#define
configUSE_CO_ROUTINES
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
#define
INCLUDE_vTaskPrioritySet
#define
INCLUDE_uxTaskPriorityGet
#define
INCLUDE_vTaskDelete
#define INCLUDE_vTaskCleanUpResources 0
#define
INCLUDE_vTaskSuspend
#define
INCLUDE_vTaskDelayUntil
#define
INCLUDE_vTaskDelay
#ifdef __NVIC_PRIO_BITS
#else
#endif
#define
configLIBRARY_LOWEST_INTERRUPT_PRIORITY
#define
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
几个重要选项说明:
u
使能抢占式调度器
u
系统主频168MHz。
u
系统时钟节拍1KHz,即1ms。
u
定义可供用户使用的最大优先级数,如果这个定义的是5,那么用户可以使用的优先级号是0,1,2,3,4,不包含5,对于这一点,初学者要特别的注意。
u
定义堆大小,FreeRTOS内核,用户动态内存申请,任务栈等都需要用这个空间。
u
定义受FreeRTOS管理的最高优先级中断。简单的说就是允许用户在这个中断服务程序里面调用FreeRTOS的API的最高优先级。为了进一步说明这个宏定义的的作用,解释如下:
l
l
l
更多关于这个参数说明请参看第12章。
FreeRTOS任务调试信息(按K1按键,串口打印):
上面截图中打印出来的任务状态字母B, R, D, S对应如下含义:
#define
tskBLOCKED_CHAR
#define
tskREADY_CHAR
#define
tskDELETED_CHAR
#define
tskSUSPENDED_CHAR
程序设计:
u
vTaskUserIF任务
vTaskLED任务
vTaskMsgPro任务 :2048字节
vTaskStart任务
任务栈空间是在任务创建的时候从FreeRTOSConfig.h文件中定义的heap空间中申请的
#define
configTOTAL_HEAP_SIZE
u
u
int main(void)
{
}
u
硬件外设的初始化是在bsp.c文件实现:
void bsp_Init(void)
{
}
u
static void AppTaskCreate (void)
{
}
u
static void vTaskTaskUserIF(void *pvParameters)
{
}
static void vTaskLED(void *pvParameters)
{
}
static void vTaskMsgPro(void *pvParameters)
{
}
static void vTaskStart(void *pvParameters)
{
}
17.4总结
本章节主要为大家讲解了FreeRTOS操作系统的时钟节拍和时间管理函数,其中时间管理函数是FreeRTOS的基本函数,初学者务必要掌握。

加载中…