本章介绍使用stm32单片机实现时间任务上的轮询切换
- 开启定时器,使用cube配置好定时器的定时间,开启定时器中断。
HAL_TIM_Base_Start_IT(&htim2);
- 初始化结构体及全局变量
typedef struct task {
uint16_t period; // 任务定时时间
uint16_t elapsedTime; // 任务当前时间
uint8_t flag; // 任务标志位
void (*TickFct)(void); // 任务执行函数
} task;
task tasks[2];
uint8_t processingRdyTasks = 0;
const uint8_t tasksNum = 2; // 任务数量
- 线程函数初始化
// 线程1
void Thread1()
{
printf("thread1\r\n");
}
// 线程2
void Thread2()
{
printf("thread2\r\n");
}
// 线程初始化
void Thread_Init(void)
{
// 任务1
tasks[0].period = 5000;
tasks[0].elapsedTime = 0;
tasks[0].TickFct = &Thread1;
tasks[0].flag = 0;
// 任务2
tasks[1].period = 2000;
tasks[1].elapsedTime = 0;
tasks[1].TickFct = &Thread2;
tasks[1].flag = 0;
}
要是增加更多线程按照上面的形式添加即可
- 检查执行线程函数
// 检查线程
void Check_Thread(void)
{
static uint8_t i=0;
for(i=0;i<tasksNum;++i)
{
if(tasks[i].flag)
{
tasks[i].TickFct();
tasks[i].flag = 0;
}
}
}
- 定时器回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint8_t i;
if (htim == (&htim2))
{
for(i=0;i<tasksNum;i++)
{
if(tasks[i].elapsedTime>=tasks[i].period)
{
tasks[i].flag = 1;
tasks[i].elapsedTime = 0;
}
else
{
tasks[i].elapsedTime += 1;
}
}
}
}
- 主函数
while(1)
{
Check_Thread();
}