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