【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):

  1. 1000 表示1000毫秒(即1秒)

  2. 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秒)

为什么要这样写

这样写法的好处是:

  1. 代码可读性高 - 直接看出要延时1000ms(1秒)

  2. 可移植性强 - 自动适应不同的系统时钟节拍配置

  3. 精确性 - 确保无论系统时钟节拍如何配置,都能正确延时1秒

注意事项

  1. vTaskDelay() 是相对延时,从调用时刻开始计算

  2. 如果需要绝对时间延时,应使用 vTaskDelayUntil()

  3. 延时期间任务处于阻塞状态,CPU可以运行其他任务

  4. 实际延时可能会有1个tick的误差

这种写法是FreeRTOS中处理任务延时的标准做法,确保了代码在不同配置下的正确性和可移植性。

 

 

参考文章        

作者:飘雪冰峰               

原文链接:https://blog.csdn.net/weixin_37127273/article/details/121933818

posted @ 2025-04-25 00:00  FBshark  阅读(95)  评论(0)    收藏  举报