【FreeRTOS操作系统教程】第29章 FreeRTOS独立看门狗监测任务执行状态

标签:
fatfsfreertosstemwinstm32usb |
分类: FreeRTOS |
第29章
FreeRTOS 独立看门狗监测任务执行状态
通过前面的几个章节,我们基本已经完成了FreeRTOS所有功能的讲解,本章节为大家介绍一种使用独立看门狗监测任务执行状态的方法,借此为大家提供一种在软件或者硬件死机时,FreeRTOS系统如何保证系统复位的思路。
本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429。
29.1 独立看门狗监测任务的实现思路
29.2 实验例程说明
29.3
29.1 独立看门狗监测任务的实现思路
29.1.1 什么是独立看门狗
假设有一只饥饿的狗正在看守一座房子,而有人要闯入。如果这个强盗的同谋以2分钟的时间间隔不停的向看门狗扔肉。那么这只狗将忙于吃肉而忽视保卫工作,因此将不会犬叫。然而,如果同谋扔完了肉或者由于其它原因忘了喂肉,狗将开始犬叫,从而惊动邻居、房屋主人或者警察。
嵌入式化的独立看门狗定时器遵循同样的方法。用户需要每隔一段时间就刷新看门狗定时器,否则将导致看门狗定时器溢出。在大多数情况下,看门狗定时器的溢出将使得系统复位。即使经过仔细规划和设计,嵌入式系统也有可能由于出乎预料的问题而死机,看门狗定时器就是用来处理类似情况的,看门狗定时器可用于从这种状态恢复。
教程使用的STM32F103,STM32F407和STM32F429都自带独立看门狗,使用也比较简单,用户初始化好看门狗,并设置好看门狗溢出时间即可,剩下就是在溢出时间范围内及时喂狗。
下面就提供一种利用独立看门狗监测多任务的执行状态的思路。
29.1.2 多任务监测实现思路
为了保证FreeRTOS的所有用户任务都在正常的运行,我们通过独立看门狗的形式来监测,一旦发现有某个任务长时间没有执行,看门狗就会将系统复位。
运行条件:
按照上面的实现思路,我们在开发板上面实战演练下。
29.2 实验例程说明
29.2.1 STM32F103 开发板实验
配套例子:
V4-335_FreeRTOS实验_独立看门狗监测任务执行状态
实验目的:
1.
实验内容:
1.
2.
3.
(1)
(2)
(3)
(4)
uxBits = xEventGroupWaitBits(xCreatedEventGroup,
TASK_BIT_ALL,
pdTRUE,
pdTRUE,
xTicksToWait);
xEventGroupSetBits(xCreatedEventGroup, TASK_BIT_1);
xEventGroupSetBits(xCreatedEventGroup, TASK_BIT_2);
xEventGroupSetBits(xCreatedEventGroup, TASK_BIT_3);
4.
vTaskScan 任务
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 AppObjCreate (void)
{
}
u
static void vTaskTaskUserIF(void *pvParameters)
{
static void vTaskTaskUserIF(void *pvParameters)
{
}
static void vTaskLED(void *pvParameters)
{
}
static void vTaskMsgPro(void *pvParameters)
{
}
static void vTaskScan(void *pvParameters)
{
}
static void vTaskStart(void *pvParameters)
{
}