首页 > 其他分享 >Freertos学习06-任务堆栈

Freertos学习06-任务堆栈

时间:2023-06-27 12:13:41浏览次数:37  
标签:06 Freertos FreeRTOS 大小 任务 堆栈 include 溢出

一、前言

  在FreeRTOS中,每个任务都有自己的堆栈,用于存储任务执行期间使用的局部变量和函数调用。堆栈的大小在任务创建时指定,如果任务使用的堆栈空间超过了指定的大小,就会发生堆栈溢出错误。

二、介绍

1.堆栈分配

image
xTaskCreate()为任务分配堆栈大小,但是需要注意的是,usStackDepth并不是以字为单位,而是以堆栈宽度为单位,例如在该系统中堆栈宽度为4 byte,我们为任务分配100堆栈空间,那么最后的堆栈大小为400byte(4*100)。如果我们分配的内存过少,可能会导致堆栈溢出,单片机会出现无限重启的情况。
具体介绍如下:
image

2.函数介绍

uxTaskGetStackHighWaterMark()是FreeRTOS中的一个函数,用于获取任务堆栈的高水位标记。即任务堆栈中未使用的空间大小。通过调用该函数,可以确定任务堆栈使用的最大空间,以便在创建任务时指定正确的堆栈大小,从而避免堆栈溢出错误。
image

三、代码测试

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "driver/gpio.h"

#define LED1_IO 12
#define LED1_IO_PIN (1ULL << 12)

void blinke_slow(void *pvparam)
{
	while (1)
	{
		gpio_set_level(LED1_IO, 1); // 高低电平
		printf("靓仔\n");
		vTaskDelay(1000 / portTICK_PERIOD_MS); // 延时
		gpio_set_level(LED1_IO, 0);			   // 高低电平
		vTaskDelay(1000 / portTICK_PERIOD_MS); // 延时
	}
}

void app_main(void)
{
	gpio_config_t LED_cof;
	// 设置配置IO为12
	LED_cof.pin_bit_mask = LED1_IO_PIN;
	// 设置为输出模式
	LED_cof.mode = GPIO_MODE_OUTPUT;
	// 禁止上拉
	LED_cof.pull_up_en = 0;
	// 禁止下拉
	LED_cof.pull_down_en = 0;
	// 禁用中断
	LED_cof.intr_type = 0;
	// 将配置写入
	gpio_config(&LED_cof);

	TaskHandle_t xHandle = NULL;
	xTaskCreate(blinke_slow, "mytask1", 1024, NULL, 1, &xHandle);

	UBaseType_t iStack;
	while (1)
	{
		iStack = uxTaskGetStackHighWaterMark(xHandle);
		printf("task1 istack = %d\n", iStack);

		vTaskDelay(3000 / portTICK_PERIOD_MS); // 延时
	}
}

测试结果:可见剩余堆栈从848减少至524.
image

THE END!

标签:06,Freertos,FreeRTOS,大小,任务,堆栈,include,溢出
From: https://www.cnblogs.com/seekwhale13/p/17508333.html

相关文章

  • B0626 模拟赛题解
    原题链接前言重庆一位金牌大佬出的。感受:除了最后一题,感觉难度不如C组,甚至没之前D组题难?T1浪费2.5h,最后还是打表秒了。T2想出正解,但发现是数据结构题,最后40min怒打100行,差点打出正解。T3花20min打出20分部分分,赛后发现XD秒了(tql)。T4看题浪费5min......
  • 【FreeRTOS复盘】3-FreeRTOS系统的时钟节拍和延时函数
    参考文章1:《FreeRTOS的学习(六)——系统时钟》参考文章2:【FreeRTOS】04系统的时钟节拍和延时函数 原理reeRTOS使用裸机自带的滴答定时器中断,使用其主频或者外部频率作为时钟基准。由于定时器的功能作为FreeRTOS的核心,所以正常情况下必须是一个一直运行着的中断,那么就意味着Fre......
  • SSO2.0 15-20230626
                     ......
  • 0626
    A方法一:考虑观察,能否放置只和当前放置块的下表面和底座的上表面是否契合有关。所以我们考虑记录每个块的所有下表面,发现我们可以用前一个位置和后一个的差来唯一的形容下表面。所以我们对底座做差分,然后对当前方块的四个面的差分序列进行搜索。本题数据范围较小,可以使用暴力搜索......
  • Freertos学习05-Task状态打印
    一、前言TaskList()是FreeRTOS中的一个函数,它可以列出所有当前正在运行的任务。这个函数可以用于调试和监视系统中的任务。它返回一个指向任务列表的指针,其中包含每个任务的名称、状态、优先级和堆栈使用情况等信息。二、函数介绍该函数的输入参数为数据缓存区的地址,可......
  • 06、07 | 全局锁、表锁和行锁
    06、07|全局锁、表锁和行锁MySQL中的锁大致分为全局锁、表锁和行锁。全局锁全局锁就是对整个数据库实例加锁。加全局锁命令:Flushtableswithreadlock(FTWRL),执行该命令会让整个库处于只读状态。Flushtableswithreadlock;使用场景:做全库逻辑备份。有了MVCC的支......
  • Freertos学习03-Task状态
    一、前言FreeRTOS是一个流行的实时操作系统,它支持多任务处理。在FreeRTOS中,任务有不同的状态,这些状态反映了任务在系统中的行为。二、状态特点任务可以存在于以下状态中:运行当任务实际执行时,它被称为处于运行状态。任务当前正在使用处理器。如果运行RTOS的处理器只......
  • SAP BTP 平台 ABAP 编程环境如何维护自定义 Unit Of Measure 数据库表 T006
    在ABAPOn-Premises系统下,我们可以轻易在SAPGUI里对UnitofMeasure数据库表即T006进行维护:[图片]ABAP数据库表T006是SAP系统中的一个重要数据表,它用于存储与度量单位相关的信息。在SAP系统中,度量单位用于表示各种物料、服务和计量单位。这些信息对于物料管理、......
  • Hugging News #0626: 音频课程更新、在线体验 baichuan-7B 模型、ChatGLM2-6B 重磅发
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」,本期HuggingNews有哪些有趣的消息,快来看看吧!重要更新最新音频课程现已发布近期,我们......
  • Freertos学习03-Task优先级
    一、前言FreeRTOS是一个流行的实时操作系统,它允许用户创建多个任务并在它们之间共享处理器时间。在FreeRTOS中,任务的优先级别是非常重要的,因为它决定了任务在系统中的执行顺序。二、任务优先级特点FreeRTOS中的任务优先级别是一个整数,范围从0到configMAX_PRIORITIES-1,其......