利用FreeRTOS在STM32中进行多线程操作(HAL库)

一、当我们移植了FreeRTOS之后,接下来就是该如何使用操作系统给我们带来的神奇操作了,首先我使用了四个线程,同时进行串口打印,按键操作以及温湿度的打印。

第一步,线程的创建,可以在main.c中直接创建,但我习惯新建一个文件夹,我在新建的creatTask.c文件中创建了这些线程

DHT11_Data_TypeDef DHT11_Measure;

TaskHandle_t  xHandleTask1;
TaskHandle_t  xHandleTask2;
TaskHandle_t  xHandleTask3;
TaskHandle_t  xHandleTask4;
	
void Task1Function(void *param)
{
	while(1)
	{
		printf("11111");
	  //HAL_Delay(2000);
		vTaskDelay(2000);
	}
}
void Task2Function(void *param)
{ 
	
	while(1)
	{
		if(key_scan(1)==1)
		{
			printf("按键操作");
			vTaskDelay(2000);
		}
		else{
			printf("无按键操作");
			vTaskDelay(2000);
		}
	}
	
}

void Task3Function(void *param)
{
  
	//printf("333");
	
	if(DHT11_Init())          
	{
		
		printf("DHT11 Init ERROR");
	}
	
	while(1)
	{
	
		if(DHT11_Get_TemperAndHumi(&DHT11_Measure) == 1)
			{	
				printf("\r\nDHT11: 温度%d℃,湿度: %d%%\r\n",DHT11_Measure.temp_int,DHT11_Measure.humi_int);
			  vTaskDelay(2000);
			}
	}
	
}

void Task4Function(void *param)
{ 
	
	while(1)
	{
		printf("444");
		vTaskDelay(2000);
	}
	
}

第二步,在主函数,main.c中调用我们编译好的线程

HAL_Init();
  SystemClock_Config();
	USART1_Init(115200,NULL,NULL);
	MX_GPIO_Init();
	MX_ADC1_Init();
  ADC_init();
	
	xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);
	xTaskCreate(Task2Function,"Task2",100,NULL,1,&xHandleTask2);
	xTaskCreate(Task3Function,"Task3",100,NULL,1,&xHandleTask3);
  xTaskCreate(Task4Function,"Task4",100,NULL,1,&xHandleTask4);
	
	vTaskStartScheduler();

我们在创建线程中,函数名可以自定义,例如Task1Function这些,但是创建的线程名,要和调用的函数中的参数名对应,xTaskCreate();其中的各个参数名要对应,该函数中的第五个参数表示的该线程的优先级,数字越大,优先级越高。

我们在创建具体的线程工作内容时,不能直接使用HAL库自带的延时,例如HAL_Delay(),使用这个会造成线程的阻塞,当多个线程同时工作时,会出现问题,那么我们在线程操作中的延时,我们用的是vTaskDelay();这个函数和HAL_Delay(),的功能几乎一样,具体的实现过程我们不必深究。

实验结果:

利用FreeRTOS在STM32中进行多线程操作(HAL库)_第1张图片

我们利用多线程的目的,是将单片机内部的资源高效的利用起来,采用了时间片轮转的方法,让我们感觉到有多个任务同时运行,就比如我们创建的线程都是在while()循环中运行,若我们仅用裸机开发去写,那我的四个操作,需要同时放到一个while()中,这样每个任务都需要等前一个任务完成之后才能运行之后的。

具体的FreeRtos的移植大家可以去看我的上一篇博客

FreeRTOS的移植到STM32的多种方法_研究如何轻松学习的博客-CSDN博客

你可能感兴趣的:(stm32,嵌入式硬件,单片机)