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();