STM32 自定义线程

本文档介绍了如何使用STM32单片机通过定时器中断实现多个时间任务的轮询切换。首先,配置定时器并开启中断,然后定义任务结构体和全局变量,初始化线程函数。在定时器中断回调函数中更新每个任务的时间,并在主循环中检查并执行达到执行条件的任务。这种方法允许在单片机上实现简单的多任务调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本章介绍使用stm32单片机实现时间任务上的轮询切换

  1. 开启定时器,使用cube配置好定时器的定时间,开启定时器中断。
	HAL_TIM_Base_Start_IT(&htim2);
  1. 初始化结构体及全局变量
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. 线程函数初始化
// 线程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;
}

要是增加更多线程按照上面的形式添加即可

  1. 检查执行线程函数
// 检查线程
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;
		}
	}
}
  1. 定时器回调函数
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;
					}
				}
    }
}
  1. 主函数
while(1)
{
	Check_Thread();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值