ESP8266 RTOS 上打印 task 堆栈使用情况 - 节省内存

本文介绍了如何使用freeRTOS的vTaskList接口来检查ESP8266上的任务堆栈使用情况,以达到节省内存的目的。通过示例代码展示了vTaskList的使用方法,以及如何根据任务状态和剩余内存调整堆栈大小,以优化资源利用率。

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

vTaskList 使用

vTaskList 是 freeRTOS 提供的接口, 可用来查看每个 task 信息, ESP8266 上测试程序如下:

注意:
编译前需使能 FreeRTOSConfig.h 中下面两个宏:

#define configUSE_TRACE_FACILITY	1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1

测试代码如下:

#include <stdio.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"

void test_task(void* param)
{
    char* pbuffer = (char*) malloc(2048);
    memset(pbuffer, 0x0, 2048);
    while(1) {
        printf("-------------------- heap:%u --------------------------\r\n", esp_get_free_heap_size());
        vTaskList(pbuffer);
        printf("%s", pbuffer);
        printf("----------------------------------------------\r\n");
        vTaskDelay(3000 / portTICK_RATE_MS);
    }
    free(pbuffer);
}

xTaskCreate(test_task, "test_task", 1024, NULL, 5, NULL);
</
### ESP32 使用 FreeRTOS 进行开发 #### 任务管理 在ESP32上使用FreeRTOS进行开发时,任务是核心概念之一。实时应用程序可被构建为一组独立的任务,每个任务在其自身的上下文中执行,不依赖于系统内其他任务或RTOS调度器本身[^2]。 创建新任务可以通过`xTaskCreate()`函数完成: ```c void TaskCode(void *parameter){ // task code here } // 创建任务 xTaskCreate(TaskCode, "task_name", stack_depth, NULL, priority, &handle); ``` 其中参数分别代表任务入口函数、任务名称、堆栈深度、传递给任务的参数指针、任务优先级以及指向返回的任务句柄的指针。 #### 消息队列 消息队列用于不同任务间的数据交换。通过调用API如`xQueueCreate()`, `xQueueSendToBack()`, 和`xQueueReceive()`来操作队列对象。 初始化一个队列并发送接收数据的例子如下所示: ```c QueueHandle_t queue; queue = xQueueCreate(QUEUE_LENGTH, sizeof(message)); if (queue != NULL) { message msg; // 发送一条消息到队列 if(xQueueSend(queue, ( void * )&msg, portMAX_DELAY)){ // 成功发送处理逻辑... } // 接收来自队列的消息 if(pdPASS == xQueueReceive(queue, &(msg), portMAX_DELAY)) { // 收到消息后的处理逻辑... } } ``` #### 同步机制 对于同步需求,FreeRTOS提供了多种工具,其中包括事件组(Event Groups),这允许等待多个二进制条件的同时发生;还有互斥量(Mutexes)[^1],用来保护共享资源免受并发访问的影响。 下面是一个简单的例子展示如何利用事件组实现两个任务之间的通信: ```c EventGroupHandle_t event_group; event_group = xEventGroupCreate(); // 设置某个位 xEventGroupSetBits(event_group, BIT0); // 清除某些位 xEventGroupClearBits(event_group, BIT0 | BIT1); // 等待特定组合的位设置 EventBits_t bits = xEventGroupWaitBits( event_group, BIT0 | BIT1, /* 所需的位 */ pdTRUE, /* 自动清除匹配的位 */ pdFALSE, /* 只要有一个指定的bit置位即可返回 */ portMAX_DELAY ); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值