3.创建多任务

本文介绍了如何在ESP32开发中使用FreeRTOS创建两个任务,包括任务1和任务2,以及如何调整任务2的堆栈大小以避免崩溃。同时展示了GPIO控制LED的代码和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这一章 我们使用函数创建了两个任务

/* Hello World Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "esp_log.h"
#include "driver/gpio.h"

static const char *TAG ="GPIO_BLINK";
#define LED_PIN 2
void gpio_config_init(void);
void gpio_toggle_level(gpio_num_t gpio_num);
void HeartbeatLED(void);


//任务1
static void task1(void* arg)
{
    for(;;){
    printf("TASK1 IS RUNNING!\n");
    HeartbeatLED();
    vTaskDelay(1000 / portTICK_RATE_MS);
    }
    
}


//任务2
 void task2(void *arg)
{
    char i=0;
    for(i=0;i<100;i++){
        printf("[TASK2]NO.%d hello,world\n",i);
        vTaskDelay(600 / portTICK_RATE_MS);
    }
    printf("[TASK2]Good bye i will die\n");
     vTaskDelete(NULL);
}
void app_main()
{
    printf("Hello world!\n");
    ESP_LOGI(TAG,"LED BLINK");
    printf("SDK Version:%s\n",esp_get_idf_version());
    gpio_config_init();
    //创建任务
    xTaskCreate(task1, "task1_test", 512, NULL, 3, NULL);
    xTaskCreate(task2,"task2_test",1024,NULL,5,NULL);
    // xTaskCreate(spi_master_write_slave_task, "spi_master_write_slave_task", 2048, NULL, 3, NULL);
    // gpio_set_level(GPIO_Pin_2,1);

    // while(1)
    // {
        
    //     vTaskDelay(1000 / portTICK_RATE_MS);
    // }
    
}



// void get_boardver(void)
// {
//     printf("SDK Version:%s\n",system_get_sdk_version());
// }


//GPIO 初始化代码
void gpio_config_init(void)
{
    gpio_config_t gpio_conf;

    gpio_conf.mode=GPIO_MODE_OUTPUT;
    gpio_conf.pin_bit_mask=(1ULL << LED_PIN);
    gpio_conf.pull_up_en=0;
    gpio_conf.pull_down_en=0;
    gpio_conf.intr_type=GPIO_INTR_DISABLE;
    gpio_config(&gpio_conf);

    // gpio_set_level(GPIO_Pin_2,1);

}

//GPIO翻转电平代码
void gpio_toggle_level(gpio_num_t gpio_num)
{
    bool gpio_level = gpio_get_level(gpio_num);
    gpio_set_level(gpio_num,!gpio_level);
    printf("get vaal:%d val2:%d\n",gpio_level,(!gpio_level));

}


void HeartbeatLED(void)
{
    gpio_set_level(LED_PIN,0);
    oled_delay_ms(40);
    gpio_set_level(LED_PIN,1);
    oled_delay_ms(70);

    gpio_set_level(LED_PIN,0);
    oled_delay_ms(40);
    gpio_set_level(LED_PIN,1);


}

开始的时候 把任务2 的堆栈设置为512 导致无法运行 总是崩溃 如下所示
image.png
image.png
打印显示 task2有问题 经过多方查询解决 发现是堆栈的空间较小 将创建时任务时的堆栈从512 变成1024 打印正常

心跳灯正常

心跳灯.gif

打印正常
image.png

100次后任务2 会删除
image.png

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值