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

系统定时巡检任务设置

[复制链接]
fansanderen 发布时间:2018-4-13 17:27
0 h% t$ j% i' B) o/ @- N0 d( O, j
///////////////////////////////////////////////////////////////////////////////9 w* Z8 f9 Q7 Q: M
// 在此添加任务名+ E# C: n0 v  y( K
typedef enum {
2 c: i6 {- N5 X# H- c( j& H    TASK_BASE = 0,          // 基础任务/ ^/ E9 K9 o$ W- H! ]
    TASK_HMI,               //
  p& G3 ]6 d! t3 Z    TASK_COLLECT,
+ f/ g6 H) {* E) o* ~0 U7 d    TASK_UPLOAD,
8 T+ E- ]  V% @# Z; d* W) ?. N- z9 Z% G    TASK_IOSCAN,
' Q$ q  \$ C- E$ h  h     // ...7 X2 _- x: u0 m3 V0 V
    TASKS_MAX               // 总的可供分配的定时任务数目
* H' b/ T' b+ P; n& z2 |} taskList_e;               // 任务名列表1 [3 B: G9 q/ g) [9 f  R5 N
///////////////////////////////////////////////////////////////////////////////
0 {8 b8 K0 P! Z% J& R& }- k6 H. _/ l) f* V
typedef struct {" \4 w' \) C5 o9 g# k+ v' N7 f* u
    uint8_t     run;                    // 任务运行标记:0-不运行,1-运行
& p$ a8 C2 w& _* N& _; A: M    uint8_t     suspend;                // 任务挂起标记: 0-正常,1-挂起( e; p# o2 M0 p7 E5 o, r
    uint16_t    count;                  // 任务运行次数计数
  ]& [, O3 @( P6 Q    uint32_t    timer;                  // 最近一次运行时刻' o( x$ f" E8 e* |9 h$ a
    uint32_t    interval;               // 任务运行时间间隔% B+ {' y$ F- R  h
    void        (*taskHook) (void);     // 要运行的任务函数指针
! m* \1 H" v$ J} task_t;                               // 任务结构定义9 m2 v6 p$ [, _1 c9 w: H

$ `& Z5 \( \! k# O) V' \7 F% R4 sextern task_t     task[TASKS_MAX];      // 任务列表3 E  |- K: I. b% |  i( O# x8 w
2 ?8 X/ ?6 B  U! l1 l
' E  w* v' S' T- N: m" W
#include "timebase.h"  X4 @& }4 n, k7 p7 E0 t
$ H4 R6 B, Z( H( F5 i% ]) V. D
static uint8_t firstRun[TASKS_MAX];
, ^2 W& h3 }% b
. r* \, K7 {0 Y7 U8 g/ `void task_process (void)
5 g' n3 b" W' N; u{
% i; j: _# o' Z8 _- O6 ?    for (int i = 0; i < TASKS_MAX; i++) {               // 逐个任务状态查询5 K- i8 l4 e% o8 d
        uint32_t time = systime_ms();                   // 当前时间
  x" R+ v# Q# k9 g0 E5 o7 D, _8 z5 y) b6 p: _" O. U: T9 d
#if 0   /* 缺陷:有溢出风险 */
+ i- \5 a  P$ m- t" ~        if (time >= task[i].timer) {                        // 任务间隔时间到
- L: |" I1 J7 P5 F( q4 W            task[i].timer = time + task[i].interval;        // 定时重置
3 b. C" k: e$ ^            task[i].run = 1;( x0 t7 G9 W0 n" B. M
        }: U: s" d/ _" u
#else
) s4 m: |" F$ l5 f% u7 S        if (task[i].suspend) {              // 设置挂起,跳至处理下一任务
5 E, W- m3 f7 T. @            continue;
* U5 f& ?1 q9 s        }
3 ^3 |7 U( m. K8 I& D        if (firstRun[i] == 0) {             // 首次运行,判断首次运行时间
7 r7 w6 v3 Q; P  g  i            if (time < task[i].timer) {
, Y2 K( ~+ ~3 s1 t9 o- r                continue;
0 N& }+ U6 }2 \  l2 a% B            } else {
: b, D' C- n0 O* F8 c% y. O# d4 f                firstRun[i] = 1;
5 B. G4 q7 f% R: l                task[i].run = 1;( @# A3 f( g( S" e9 p% C+ y  b
                task[i].timer = time;  V: Y4 E! F( k6 E; b+ X( I; `- N/ p
            }  c5 `: Y% U7 T9 g' s1 v4 \- \
        }
' \. w& q$ Y7 P" R# o        if ((time - task[i].timer) >= task[i].interval) {
. V% k# I: C& Q            task[i].timer = time;  t! U: I6 `* F
            task[i].run = 1;
& |7 ^: d( q/ v7 |% _0 ~, r( ?        }
' z7 V4 }7 E3 k4 p$ u5 U#endif7 z/ X0 s, h0 O, k9 e
        if (task[i].run) {
' T/ n5 e# b# C6 l. j! F            if (task[i].taskHook != NULL) {
- f1 E- V, u  o4 h+ D* K+ X  U                task[i].taskHook();                          // 运行任务/ R3 o" v# A2 x% m3 g
                task[i].count++;" G, o" S$ n1 u% x0 V7 f  @
            }- f7 _' Z. w7 n5 M8 k, t
            task[i].run = 0;                                 // 标志清0
+ V* h! q. B8 O8 J        }/ b/ o1 H+ t5 J! W, Z. j! ?
    }
4 c0 U! Z$ R( E+ d! V; ]}9 o, a! j1 J3 m3 f  b- B

0 O4 `0 ]% l. e3 a' X, t) j! V3 Q#endif: t5 S$ B6 C0 b8 @$ c

! ~8 U3 N% P! x/ }$ K) c% ^/**9 |" P: U5 ~  p- `7 d+ o
* 改变任务运行周期
+ F7 F$ [4 {1 W */
; J: C: p5 u* s2 K' F3 a6 U# ?7 ivoid task_chang_runcycle (taskList_e n, uint32_t interval)
% P, i" M  T- C{+ m# w" b3 {9 U( H
    if (n < TASKS_MAX) {
* x1 `& ~7 _1 ^3 Z, ?        task[n].interval = interval;
( B( }! Q5 E& n    }: p& e2 x2 Z: e4 h
}- Z! k( K" C; y4 }

! b- \7 `# i! P! o$ A, E' Z4 a/*
! B2 ^" D2 ~6 W, z0 b/ B3 i * 任务挂起 / 恢复2 `0 G( W  v& A
*/
- l0 E  B! L& Z* H1 B5 r* ~void task_suspend (taskList_e n, uint8_t en)
& L3 \, c9 @$ b5 Y0 \1 i1 y6 B{# Z% r& k8 j! Y9 p9 R+ T
    if (n >= TASKS_MAX) {  G3 V/ S% f; v/ S
        return;! }9 g3 P+ h0 V/ j2 A' j- V, e
    }
4 \+ @8 ?5 b# l- T/ h1 x8 m1 Z9 t& @) G
    if (en) {                           // 挂起
# E: n: u. D! k4 \! y        task[n].run = 0;& M% f9 u# @3 P( Z: Y* X
        task[n].suspend = 1;& R  i2 A4 a5 u5 P# d: t! f  ]
    } else {                            // 恢复
# o2 K3 m1 H) p        task[n].suspend = 0;/ Y8 v6 a4 o4 e5 N
    }
. w, B& s9 C6 P* e( x: }}" }3 f5 H9 ~  y$ `
1 k- t; O/ [) M
赞 收藏 评论1 发布时间:2018-4-13 17:27

举报

1个回答
zero99 回答时间:2018-4-17 13:37:26
没有任何描述性的文字,不知道是啥
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版