c
#include <stdio.h>
/* 任务结构 */
typedef struct _TASK_COMPONENTS
{
unsigned char Run; /* 程序运行标记:0-不运行,1运行 */
unsigned int Timer; /* 计时器 */
unsigned int ItvTim; /* 任务运行间隔时间 */
void (*TaskHook)(void); /* 要运行的任务函数 */
} TASK_COMPONENTS; /* 任务定义 */
void Task1(void);
void Task2(void);
void Task3(void);
static TASK_COMPONENTS TaskComps[] =
{
{0, 10, 10, Task1},
{0, 20, 20, Task2},
{0, 40, 40, Task3}
};
#define TASKS_MAX (sizeof(TaskComps) / sizeof(TaskComps[0]))
/***********************************************************************
* FunctionName : TaskRemarks()
* Description : 任务标志处理
* EntryParameter : None
* ReturnValue : None
***********************************************************************/
void TaskRemarks(void)
{
unsigned char i;
for (i = 0; i < TASKS_MAX; i++) /* 逐个任务时间处理 */
{
if (TaskComps[i].Timer) /* 时间不为0 */
{
TaskComps[i].Timer--; /* 减去一个节拍 */
if (TaskComps[i].Timer == 0) /* 时间减完了 */
{
TaskComps[i].Timer = TaskComps[i].ItvTime; /* 恢复计时器值,从新下一次 */
TaskComps[i].Run = 1; /* 任务可以运行 */
}
}
}
}
void Task1(void)
{
printf("Task1 Running...\n");
}
void Task2(void)
{
printf("Task2 Running...\n");
}
void Task3(void)
{
printf("Task3 Running...\n");
}
/***********************************************************************
* FunctionName : TaskProcess()
* Description : 任务处理
* EntryParameter : None
* ReturnValue : None
***********************************************************************/
void TaskProcess(void)
{
unsigned char i;
for (i = 0; i < TASKS_MAX; i++) /* 逐个任务时间处理 */
{
if (TaskComps[i].Run) /* 程序运行标记为运行 */
{
TaskComps[i].TaskHook(); /* 运行任务 */
TaskComps[i].Run = 0; /* 标志清0 */
}
}
}
c
void SysTick_Handler(void)
{
TaskRemarks();
}
c
#include "stm32f1xx_hal.h"
extern void TaskProcess(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
while (1)
{
/* USER CODE END WHILE */
TaskProcess();
/* USER CODE BEGIN 3 */
}
}