【esp32 pico】ESP32-PICO-D4 使用FreeRTOS进程和双核
#include <Arduino.h>
#define CONFIG_POWER_EN_PIN 21
#define CONFIG_RUN_LED_PIN 32
// 创建打印任务
TaskHandle_t handleTaskprint;
void Taskprint(void* parameter)
{
int i=0;
while(1)
{
Serial.println(xTaskGetAffinity(handleTaskprint));
Serial.print("task run");
Serial.println(i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
i++;
if(i>600)
{
digitalWrite(CONFIG_POWER_EN_PIN, LOW); // 关机测试
}
}
vTaskDelete(NULL);
}
TaskHandle_t handleTaskrunled;
void TaskRunled(void *parameter)
{
while(1)
{
digitalWrite(CONFIG_RUN_LED_PIN, HIGH);
vTaskDelay(1000 / portTICK_PERIOD_MS);
digitalWrite(CONFIG_RUN_LED_PIN, LOW);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
vTaskDelete(NULL);
}
void setup() {
//上电开机
pinMode(CONFIG_POWER_EN_PIN, OUTPUT);
digitalWrite(CONFIG_POWER_EN_PIN, HIGH);
pinMode(CONFIG_RUN_LED_PIN, OUTPUT);
Serial.begin(115200);
Serial.println("Power: ON");
// esp32 将任务绑定到不同的核心上面
xTaskCreatePinnedToCore(&Taskprint, "PrintThread", configMINIMAL_STACK_SIZE, NULL, 20, &handleTaskprint,0);
xTaskCreatePinnedToCore(&TaskRunled, "Runled", configMINIMAL_STACK_SIZE, NULL,6, &handleTaskrunled,1);
}
void loop() {
Serial.print("Taskprint Affinity : ");
Serial.println(xTaskGetAffinity(handleTaskprint));
Serial.print("Taskrunled Affinity : ");
Serial.print(xTaskGetAffinity(handleTaskrunled));
delay(5000);
}
扩展:解读 vTaskDelay(1000 / portTICK_PERIOD_MS)
这行代码是FreeRTOS实时操作系统中常见的任务延时函数调用,我来详细解释它的含义和工作原理:
函数功能
vTaskDelay() 是FreeRTOS提供的任务延时函数,它会使当前任务进入阻塞状态指定的时间长度。
参数解析
1000 / portTICK_PERIOD_MS 这个表达式计算的是延时多少个系统时钟节拍(tick):
-
1000表示1000毫秒(即1秒) -
portTICK_PERIOD_MS是FreeRTOS的一个宏,表示每个系统时钟节拍对应的毫秒数
实际意义
假设 portTICK_PERIOD_MS 的典型值为1(表示每个tick为1ms),那么:
-
1000 / portTICK_PERIOD_MS=1000 / 1= 1000个tick -
即延时1000个系统时钟节拍,也就是1000ms(1秒)
如果 portTICK_PERIOD_MS 为10(每个tick为10ms),则:
-
1000 / 10= 100个tick -
100个tick × 10ms/tick = 1000ms(仍然是1秒)
为什么要这样写
这样写法的好处是:
-
代码可读性高 - 直接看出要延时1000ms(1秒)
-
可移植性强 - 自动适应不同的系统时钟节拍配置
-
精确性 - 确保无论系统时钟节拍如何配置,都能正确延时1秒
注意事项
-
vTaskDelay()是相对延时,从调用时刻开始计算 -
如果需要绝对时间延时,应使用
vTaskDelayUntil() -
延时期间任务处于阻塞状态,CPU可以运行其他任务
-
实际延时可能会有1个tick的误差
这种写法是FreeRTOS中处理任务延时的标准做法,确保了代码在不同配置下的正确性和可移植性。
参考文章
作者:飘雪冰峰
原文链接:https://blog.csdn.net/weixin_37127273/article/details/121933818

浙公网安备 33010602011771号