基于ESP32的桌面小屏幕实战[8]:任务创建

调用任务创建必须要添加下面两个头文件:

c 复制代码
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

还要定义一个静态的任务函数

c 复制代码
static void test_task_example(void* arg)
{
    for(;;) {
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        printf("task run \n");
    }
}

创建成功后,每秒打印一个数据。for(;;)表示一个无限循环,for(;;) 等效于 while(1)。任务函数一般是无限循环的,以便系统调度器能够持续执行它们,除非有特殊情况终止。vTaskDelay 是 FreeRTOS 提供的一个延迟函数,使任务进入阻塞状态,等待指定的时间后再继续执行。
1000 / portTICK_PERIOD_MS 将延迟时间设为 1000 毫秒(即 1 秒)。portTICK_PERIOD_MS 是一个系统常量,用于将毫秒转换为系统时钟周期数,以适配不同的时钟速率。

在主函数中创建任务

c 复制代码
xTaskCreate(test_task_example, "test_task_example", 2048, NULL, 10, NULL);
  • test_task_example:指向任务函数的指针,也就是任务的入口函数。创建的任务会在 test_task_example 函数中执行。

  • "test_task_example":任务名称,是一个字符串标识符,用于在调试时识别任务。这个名字可以帮助开发者识别和管理任务,但不会影响任务的实际执行。

  • 2048:任务栈的大小,以字节为单位。栈大小为 2048 字节,意味着此任务可以使用 2048 字节的内存来存储局部变量、函数调用等。栈大小应根据任务的内存需求设置,避免过大或过小。

  • NULL:任务函数的输入参数,这里传递的是 NULL。如果任务需要初始化数据或控制参数,可以在这里传递参数。

  • 10:任务优先级。FreeRTOS 的任务调度基于优先级,数值越高,优先级越高。优先级决定了任务被调度器分配 CPU 时间的优先程度。在此示例中,优先级为 10。

  • NULL:任务句柄(Task Handle)的指针。句柄用于标识任务和与任务交互。此处为 NULL,表示不需要任务句柄,如果需要在其他地方引用或管理此任务,可以传入指向句柄的指针,例如 TaskHandle_t 类型的变量地址。

这行代码会在 FreeRTOS 中创建一个名为 test_task_example 的任务。任务创建成功后,调度器会根据任务的优先级和时间片分配 CPU 时间,运行 test_task_example 函数中的代码。如果任务成功创建,test_task_example 会每隔一秒打印 "task run"。

添加一个分支

sh 复制代码
git checkout -b dev2

按照上述内容修改hello_world_main.c文件

复制代码
vim main/hello_world_main.c

i进入编辑模式,按Esc退出编辑,按:+w+q保存。

添加到库里,并打上标签

复制代码
git add *
git commit -m "add xTaskCreate"

输入git log查看日志,按Q退出。

编译

复制代码
idf.py -p /dev/ttyUSB0 flash monitor

终端中显示:

完整代码

c 复制代码
/* 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 "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "esp_log.h"

static const char *TAG = "MAIN APP";

static void test_task_example(void* arg)
{
    for(;;) {
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        printf("task run \n");
    }
}

void app_main(void)
{
    printf("Hello world!\n");

    /* Print chip information */
    esp_chip_info_t chip_info;
    esp_chip_info(&chip_info);
    printf("This is %s chip with %d CPU core(s), WiFi%s%s, ",
            CONFIG_IDF_TARGET,
            chip_info.cores,
            (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
            (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");

    unsigned major_rev = chip_info.full_revision / 100;
    unsigned minor_rev = chip_info.full_revision % 100;
    printf("silicon revision v%d.%d, ", major_rev, minor_rev);

    printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
            (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    printf("Minimum free heap size: %d bytes\n", esp_get_minimum_free_heap_size());

    ESP_LOGI(TAG, "system init V1.1");//打印日志

    xTaskCreate(test_task_example, "test_task_example", 2048, NULL, 10, NULL);//创建任务

    while(1)
    {
    	printf("system run ...\n");
	vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}
相关推荐
调试优选官2 天前
IoT物联网系统定制落地实践:从设备接入、协议网关、平台分层到业务应用,如何做技术选型、交付验收、责任边界与长期运维成本评估及迁移安排
物联网·iot·成本分析
华允物联-HUAIOT2 天前
工业路由器和DTU在联网方式上的区别
物联网
wuyk5552 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
绿蕉2 天前
配电房的“AI听诊师”:可视化声纹局放智能巡检系统与通讯保障
物联网
chshang19922 天前
工业路由器是什么?浅谈5G工业网络中的IR602
网络·物联网·5g·智能路由器
做萤石二次开发的哈哈2 天前
海康商用音频主机接入萤石蓝海 AIoT:多路拾音、矩阵路由、分区广播、应急广播四类技能,IP 网络广播系统多端开发实战
物联网·音频矩阵·萤石开放平台·ip网络广播·蓝海aiot一站式工作台·aiot开发·公共广播
wuyk5552 天前
【Socket 进阶之路】第 9 章 Linux 网络服务量产稳定性优化|心跳保活、TIME_WAIT、SO_LINGER、内存池、断线重连、完整异常防护框架
linux·服务器·开发语言·网络·物联网
CServer_012 天前
开源!混合存储底座+湖仓一体的AI数据中台
物联网·制造
数字新视界2 天前
数据中心基础设施管理系统的智能监测与运维整合剖析
数据库·物联网·数据中心·数据中心基础设施管理·dcim管理系统