VSCode ESP-IDF 创建一个任务

该例子来演示一下如何创建一个简单的任务,这里我们创建了一个名为 led4_task() 的任务,任务的作用是让接在 D4 上的 LED 500ms 闪烁一次。

该例子在 https://www.cnblogs.com/xiaotupo/articles/17386809.html 这篇文章中创建的项目基础上修改的。

主要就是在 app_main() 函数中创建一个任务,并让该任务和 app_main() 同时交替运行。

main.c

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h" /* 引入 gpio 外设 */
#include "esp_log.h"
#include "sdkconfig.h"


static const char *TAG = "example";

/**
 * 任务相关定义
*/
TaskHandle_t ledD4_taskHandle = NULL; /* 任务句柄 */

/**
 * 函数声明
*/
void led4_task(void* arg);

uint8_t LED_PORT = GPIO_NUM_2; /* 定义 LED 的引脚,GPIO_NUM_2 是 ESP-IDF 定义好的,代表 io 号*/

uint8_t LED_D4_PORT = GPIO_NUM_4; /* 接在 D4 上的 LED IO口定义 */



void app_main(void)
{
    gpio_reset_pin(LED_PORT);
    gpio_set_direction(LED_PORT, GPIO_MODE_OUTPUT);

    xTaskCreate(led4_task, "LED_D4_Task", 1024 * 2, NULL, 0, &ledD4_taskHandle);


    if (ledD4_taskHandle == NULL)
    {
        ESP_LOGI(TAG, "LED_D4_Task 任务创建失败");
    }

    uint32_t led_flag = 0;
    while(1) {

        ESP_LOGI(TAG, "Hello,World");
        gpio_set_level(LED_PORT, led_flag); /* 设置 gpio 输出高或低 */
        led_flag ^= 1; /* 对 led_flag 异或 1 等于 */
        vTaskDelay(1000/portTICK_PERIOD_MS);
    }
}

void led4_task(void* arg)
{
    uint8_t led_flag = 0;
    gpio_reset_pin(LED_D4_PORT);
    gpio_set_direction(LED_D4_PORT, GPIO_MODE_OUTPUT);
    while(1)
    {
        gpio_set_level(LED_D4_PORT, led_flag); /* 设置 gpio 输出高或低 */
        led_flag ^= 1; /* 对 led_flag 异或 1 等于 */
        vTaskDelay(500/portTICK_PERIOD_MS);
    }
}

创建任务使用 xTaskCreate() 函数,函数原型如下:

BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, 
 						const char * const pcName, 
 						unsigned short usStackDepth, 
 						void *pvParameters, 
 						UBaseType_t uxPriority, 
 						TaskHandle_t *pxCreatedTask );

参数解释:

  • pvTaskCode - 任务函数,如:void led4_task(void* arg);
  • pcName - 给任务起一个名字,类型为字符串
  • usStackDepth - 给任务分配的堆栈大小,单位为字,如:100 则代表 100 * 4 = 400 字节
  • pvParameters - 给任务传递的参数,可以为 NULL
  • uxPriority - 任务优先级,数字越大,优先级越高
  • pxCreatedTask - 任务句柄,可以用来管理该任务
xTaskCreate(led4_task, "LED_D4_Task", 1024 * 2, NULL, 0, &ledD4_taskHandle);
posted @ 2023-05-10 21:39  小土坡  阅读(252)  评论(0)    收藏  举报