ESP32多任务笔记

esp32是双核开发板,多任务基于FreeRTOS,当多线程来看似乎也没太大问题。

以下用例代码使用Arduino IDE编译上传

//开发板 ESP32 Dev Moudle
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#include "driver/dac.h"

TaskHandle_t *task1;

void loop(){/* 留空 */}
void setup() {
	Serial.begin(115200);
	Serial.print("core count:");
	Serial.println(portNUM_PROCESSORS);//输出可用的核心数量,应是2
	
	dac_output_enable(DAC_CHANNEL_2);//启用2号DAC输出引脚(GPIO26),上面插了个led

	//创建任务
	//指定在核心0上执行Task1_blink任务
	xTaskCreatePinnedToCore(
		Task1_blink,		//任务对应的函数
		"blink",			//任务名
		1024,				//栈大小。(This stack size can be checked & adjusted by reading the Stack Highwater)
		NULL,				//传给任务函数的参数
		2,					//任务优先级。(Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.)
		task1,				//用来返回任务handle
		0					//指定CPU核心,tskNO_AFFINITY表示不指定,数字代表核心ID
	);
	//指定在核心1上执行Task2_print任务
	xTaskCreatePinnedToCore(Task2_print,"print",1024,NULL,1,NULL ,1);
	//不指定核心执行Task3_Print任务
	xTaskCreatePinnedToCore(Task3_Print,"print2",1024,NULL,2,NULL ,tskNO_AFFINITY);
	//一个核心上也可以设置多个任务
	//不指定核心等同于直接使用xTaskCreate来创建任务,如下
	// xTaskCreate(Task3_Print,"print2",1024,NULL,2,NULL);
	
}


/*---------------------- 定义任务 ---------------------*/
void Task1_blink(void *pvParameters)  // This is a task.
{
	static float i=0;
	for (;;) //任务不能自己执行结束,否则会造成崩溃,需要在任务中调用vTaskDelete删除
	{
		double level=177.0+sin(i++/180.0)*77.0;//计算一个亮度
		dac_output_voltage(DAC_CHANNEL_2, level);//从DAC引脚输出电压来调整灯的亮度
		vTaskDelay(5);//任务内延时,单位毫秒,不会影响同核心的其他任务
		if(i==1000){//任务执行1000次后删除(差不多是一个亮暗周期),灯将保持熄灭
			 vTaskDelete(task1);  //删除任务,参数为NULL时表示删除当前执行的任务
		}
	}
}
void Task2_print(void *pvParameters){
	for (;;){
		Serial.println("task2");
		vTaskDelay(500);//延时半秒,即使一个任务不延时似乎也并不会阻塞同核心的其它任务
		// delay(500);//我试了一下,直接用delay效果是一样的
	}
}
void Task3_Print(void *pvParameters){
	for (;;){
		Serial.println(xPortGetCoreID());//输出当前任务所在核心的id
		vTaskDelay(100);//延时100ms
	}
}

总结

  • 创建任务:xTaskCreate
  • 创建任务到指定核心:xTaskCreatePinnedToCore
  • 删除任务:vTaskDelete


本文发布于 https://luojia.me

本站文章未经文下加注授权不得拷贝发布。

0 0 投票数
打分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论