你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

系统定时巡检任务设置

[复制链接]
fansanderen 发布时间:2018-4-13 17:27

///////////////////////////////////////////////////////////////////////////////
// 在此添加任务名
typedef enum {
    TASK_BASE = 0,          // 基础任务
    TASK_HMI,               //
    TASK_COLLECT,
    TASK_UPLOAD,
    TASK_IOSCAN,
     // ...
    TASKS_MAX               // 总的可供分配的定时任务数目
} taskList_e;               // 任务名列表
///////////////////////////////////////////////////////////////////////////////

typedef struct {
    uint8_t     run;                    // 任务运行标记:0-不运行,1-运行
    uint8_t     suspend;                // 任务挂起标记: 0-正常,1-挂起
    uint16_t    count;                  // 任务运行次数计数
    uint32_t    timer;                  // 最近一次运行时刻
    uint32_t    interval;               // 任务运行时间间隔
    void        (*taskHook) (void);     // 要运行的任务函数指针
} task_t;                               // 任务结构定义

extern task_t     task[TASKS_MAX];      // 任务列表


#include "timebase.h"

static uint8_t firstRun[TASKS_MAX];

void task_process (void)
{
    for (int i = 0; i < TASKS_MAX; i++) {               // 逐个任务状态查询
        uint32_t time = systime_ms();                   // 当前时间

#if 0   /* 缺陷:有溢出风险 */
        if (time >= task[i].timer) {                        // 任务间隔时间到
            task[i].timer = time + task[i].interval;        // 定时重置
            task[i].run = 1;
        }
#else
        if (task[i].suspend) {              // 设置挂起,跳至处理下一任务
            continue;
        }
        if (firstRun[i] == 0) {             // 首次运行,判断首次运行时间
            if (time < task[i].timer) {
                continue;
            } else {
                firstRun[i] = 1;
                task[i].run = 1;
                task[i].timer = time;
            }
        }
        if ((time - task[i].timer) >= task[i].interval) {
            task[i].timer = time;
            task[i].run = 1;
        }
#endif
        if (task[i].run) {
            if (task[i].taskHook != NULL) {
                task[i].taskHook();                          // 运行任务
                task[i].count++;
            }
            task[i].run = 0;                                 // 标志清0
        }
    }
}

#endif

/**
* 改变任务运行周期
*/
void task_chang_runcycle (taskList_e n, uint32_t interval)
{
    if (n < TASKS_MAX) {
        task[n].interval = interval;
    }
}

/*
* 任务挂起 / 恢复
*/
void task_suspend (taskList_e n, uint8_t en)
{
    if (n >= TASKS_MAX) {
        return;
    }

    if (en) {                           // 挂起
        task[n].run = 0;
        task[n].suspend = 1;
    } else {                            // 恢复
        task[n].suspend = 0;
    }
}

收藏 评论1 发布时间:2018-4-13 17:27

举报

1个回答
zero99 回答时间:2018-4-17 13:37:26
没有任何描述性的文字,不知道是啥

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版