一、当我们移植了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(),的功能几乎一样,具体的实现过程我们不必深究。
实验结果:
我们利用多线程的目的,是将单片机内部的资源高效的利用起来,采用了时间片轮转的方法,让我们感觉到有多个任务同时运行,就比如我们创建的线程都是在while()循环中运行,若我们仅用裸机开发去写,那我的四个操作,需要同时放到一个while()中,这样每个任务都需要等前一个任务完成之后才能运行之后的。
具体的FreeRtos的移植大家可以去看我的上一篇博客