系统监控(SYS MONITOR)¶
1. 概述¶
SDK内置组件系统监控是系统内尤为重要的一个组件,它负责监视控制加入监控队列里的每一个任务,以防有任务出现异常情况,避免因异常未及时处理而造成的损失。本组件以硬件看门狗(IWDG)为基础,在此基础之上实现了对多个任务同时进行监控的监控策略,以此来保证系统正常稳定的运行。CI14LP为双核架构(AON核+主核),主核运行FreeRTOS应用,本组件运行于主核侧。
2. 源文件¶
| 文件名 | 说明 |
|---|---|
| components\sys_monitor\ci_task_monitor.c | 具体实现 |
| components\sys_monitor\ci_task_monitor.h | 用户API |
3. 监控流程¶
监控组件工作流程如下:
monitor_creat创建监控事件组并初始化硬件看门狗,注册看门狗超时回调;- 各任务通过
join_monitor加入监控队列,并指定各自的存活上报周期(单位ms); - 被监控任务在自身循环中周期性调用
task_alive上报存活状态(置位事件组对应位); task_monitor监控任务以MONITOR_PERIOD(默认1000ms)为周期检查事件组:全部置位则喂狗并清零事件组,否则不喂狗,等待硬件看门狗超时复位系统。
- 相关宏配置说明如下(工程
user_config.h中可覆盖):
/*监控任务的个数,最大为23*/
#define MONITOR_TAST_MAX_COUNT (23)/* 范围:0 - 23 根据实际情况合理设置*/
/*监控周期(单位:MS)*/
#define MONITOR_PERIOD (1000)
- 相关API接口如下:
| 函数 | 描述 |
|---|---|
| monitor_creat | 监控事件组创建函数 |
| join_monitor | 任务加入监控函数 |
| exit_monitor | 任务退出监控 |
| task_alive | 被监控任务上报函数 |
| task_monitor | 监控任务函数 |
4. 使用示例¶
#include "ci_task_monitor.h"
uint8_t vTask_test1_id,vTask_test2_id,vTask_test3_id;
void vTask_test1(void *pvParameters)
{
int count = 0;
for(;;)
{
vTaskDelay(pdMS_TO_TICKS(500));
count++;
task_alive(vTask_test1_id);
}
}
void vTask_test2(void *pvParameters)
{
int count = 0;
for(;;)
{
vTaskDelay(pdMS_TO_TICKS(4000));
count++;
task_alive(vTask_test2_id);
}
}
void vTask_test3(void *pvParameters)
{
int count = 0;
for(;;)
{
vTaskDelay(pdMS_TO_TICKS(12000));
count++;
task_alive(vTask_test3_id);
}
}
void call_back(void)
{
mprintf("call back func\n");
}
void iwdg_test(void)
{
monitor_creat(call_back);
TaskHandle_t task1_handle = NULL,task2_handle = NULL,task3_handle = NULL;
xTaskCreate(vTask_test1,"vTask_test1",256,NULL,1,&task1_handle);
join_monitor(&vTask_test1_id,1000,task1_handle);
xTaskCreate(vTask_test2,"vTask_test2",256,NULL,2,&task2_handle);
join_monitor(&vTask_test2_id,5000,task2_handle);
xTaskCreate(vTask_test3,"vTask_test3",256,NULL,3,&task3_handle);
join_monitor(&vTask_test3_id,10000,task3_handle);
xTaskCreate(task_monitor,"task_monitor",256,NULL,4,NULL);
}
注意
join_monitor第2个参数为该任务的存活周期,其值应略大于任务循环周期,否则正常的任务也会被误判为异常;- 上例中 vTask_test3 的循环周期(12s)远大于其监控周期(10s),该任务会周期性触发看门狗复位,仅作为反例演示,实际使用中应保证任务存活上报周期小于监控周期。