plecs 定时任务实现

plecs 定时任务实现

1、declaration实现

#include <stdio.h>

// 输入定义
#define     INPUT       Input(0)

// 输出定义
#define     OUTPUT_ISR_CNT      Output(0)
#define     OUTPUT_1MS_CNT      Output(1)

// 离散状态变量定义

// 时间定义
#define     SYS_TIME1S_BS12US5      (80000)
#define     TIME1MS_BS12US5         (80000 / 1000)
#define     SYS_TIMER_PRD           SYS_TIME1S_BS12US5

// 非离散全局变量定义
int g_sysTimerCnt;
int g_isrTaskIndex;
// 输入输出量定义
double g_input;
int g_outputForIsrCnt;
int g_outputFor1msCnt;

// 函数定义
inline void SysTimerRun(void)
{
    if (++g_sysTimerCnt >= SYS_TIMER_PRD) {
        g_sysTimerCnt = 0;
    }
}

// 分频中断任务
typedef void (*Fun)(void);

void IsrTask1(void)
{
    g_outputForIsrCnt++;
}

void IsrTask2(void) {}
void IsrTask3(void) {}
void IsrTask4(void) {}
void IsrTask5(void) {}
void IsrTask6(void) {}
void IsrTask7(void) {}
void IsrTask8(void) {}

const Fun g_isrFun[8] = {
    IsrTask1,
    IsrTask2,
    IsrTask3,
    IsrTask4,
    IsrTask5,
    IsrTask6,
    IsrTask7,
    IsrTask8,
};

inline void IsrTaskRun(void)
{
    g_isrFun[g_isrTaskIndex]();
    if (++g_isrTaskIndex >= 8) {
        g_isrTaskIndex = 0;
    }
}

// 后台慢速任务
void TaskRun(void)
{
    static int sysTimerCntFor1msPre = 0;

    int delta = g_sysTimerCnt - sysTimerCntFor1msPre;
    delta = delta < 0 ? delta + SYS_TIMER_PRD : delta;

    if (delta >= TIME1MS_BS12US5) {
        g_outputFor1msCnt++;
        sysTimerCntFor1msPre = g_sysTimerCnt;
    }
}

2、start_function 实现

// 初始化变量
g_sysTimerCnt = 0;
g_isrTaskIndex = 0;
g_outputForIsrCnt = 0;
g_outputFor1msCnt = 0;

3、output_function实现

// 输出
OUTPUT_ISR_CNT = g_outputForIsrCnt;
OUTPUT_1MS_CNT = g_outputFor1msCnt;

4、update_function实现

// 输入量
g_input = INPUT;

SysTimerRun();
IsrTaskRun();
TaskRun();
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东门吹嘘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值