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);

浙公网安备 33010602011771号