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
本站文章未经文下加注授权不得拷贝发布。