跳转至

系统监控(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. 监控流程

监控组件工作流程如下:

  1. monitor_creat 创建监控事件组并初始化硬件看门狗,注册看门狗超时回调;
  2. 各任务通过 join_monitor 加入监控队列,并指定各自的存活上报周期(单位ms);
  3. 被监控任务在自身循环中周期性调用 task_alive 上报存活状态(置位事件组对应位);
  4. 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),该任务会周期性触发看门狗复位,仅作为反例演示,实际使用中应保证任务存活上报周期小于监控周期。