FreeRTOS系列|任务堆栈

2023-05-16

任务堆栈

运行freertos系统的大部分都是资源有限的MCU,所以对于RAM我们都要考虑尽量的节省,避免资源浪费。下面将会基于Cortex-M3内核的STM32F103型MCU来介绍FreeRTOS任务栈大小的确定方法以及栈溢出检测方法

1. 任务堆栈大小

需要用到堆栈的地方:

  • 函数嵌套:函数局部变量、函数形参、函数返回地址、函数内部状态值
  • 任务切换:任务切换时所有的寄存器都需要入栈
  • 中断:M3内核MCU有8个寄存器是自动入栈的(任务栈),进入中断以后其余寄存器入栈以及可能发生的中断嵌套都是用的系统栈

2. 任务堆栈大小确定方法

2.1 MDK html文件分析

通过查看工程源码中“MDK-ARM”里的工程名文件夹下的html文件可以知道每个被调用函数的最大栈需求以及各个函数之间的调用关系
在这里插入图片描述

2.2 栈溢出检测

栈溢出有两种检测方案

  • 方案一:在任务切换时检测任务栈指针是否过界;
  • 方案二:任务创建的时候将任务栈所有数据初始化为0xa5,任务切换并进行任务栈检测的时候检查末尾的16个字节是否都是0xa5;
/*******************栈溢出检测宏的配置********************/
#define configCHECK_FOR_STACK_OVERFLOW
0, 配置为0,表示不启动栈溢出检测
1, 配置为1,表示启用栈溢出检测方案一
2, 配置为2,表示启用栈溢出检测方案二
/*********************栈溢出回调函数**********************/
函数原型:void vApplicationStackOverflowHook(TaskHandle_t *pxTask,signed char *pcTaskName)
传 入 值:pxTask 堆栈溢出任务的句柄
		 pcTaskName 堆栈溢出任务的名称

2.3 任务状态打印

通过调用vTaskList()函数打印每个任务的详细信息(栈名、栈状态、优先级、栈的剩余空间、任务序号)

/*******************任务状态信息打印宏的配置*******************/
#define configUSE_TRACE_FACILITY  //必须置1
#define configUSE_STATS_FORMATTING_FUNCTIONS  //必须置1
/*********************任务状态信息打函数**********************/
函数原型:void vTaskList(char *pcWriteBuffer)
传 入 值:pcWriteBuffer 缓冲区地址

根据传入的缓冲区(缓冲区要足够大,以容纳生成的报告,每个任务大约需要40个字节)生成字符串,这个字符串包含所有任务信息
在这里插入图片描述

3. 任务堆栈检测应用

以较常用的任务状态打印的堆栈检测方法为例:使用STM32CubeMX配置FreeRTOS,打开任务状态配置,创建如下三个任务:

  • Led_Task:D2指示灯闪烁
  • Usart_Task:每隔1s向串口输出字符串
  • Key_Task:按下K_UP,打印任务状态信息
3.1 STM32CubeMX设置
  • RCC设置外接HSE,时钟设置为72M
  • PC1设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
  • PA0设置为GPIO输入模式、下拉模式;PE2/PE3/PE4设置为GPIO输入模式、上拉模式
  • USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位
  • 激活FreeRTOS,添加任务,设置任务名称、优先级、堆栈大小、函数名称等参数
    在这里插入图片描述在这里插入图片描述
  • 配置宏configUSE_TRACE_FACILITY和configUSE_STATS_FORMATTING_FUNCTIONS为1
    在这里插入图片描述
  • 使用FreeRTOS操作系统,一定要将HAL库的Timebase Source从SysTick改为其他定时器,选好定时器后,系统会自动配置TIM
    在这里插入图片描述
  • 输入工程名,选择路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码
3.2 MDK-ARM软件编程
  • 创建按键驱动文件key.c和key.h,参考按键输入例程
  • 添加Led_Task、Usart_Task和Key_Task任务函数代码
void Led_Task(void const * argument){
  /* USER CODE BEGIN Led_Task */
  /* Infinite loop */
  for(;;){
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_RESET);
    osDelay(500);  //1ms时基
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);
    osDelay(500);  //1ms时基
  }
  /* USER CODE END Led_Task */
}

void Usart_Task(void const * argument){
  /* USER CODE BEGIN Usart_Task */
  /* Infinite loop */
  for(;;){
	printf("UsartTask is Runing!\r\n");
    osDelay(1000);
  }
  /* USER CODE END Usart_Task */
}

uint8_t u8TaskListBuff[400];
void KeyTask(void const * argument){
  /* USER CODE BEGIN KeyTask */
	uint8_t key = 0;	
  /* Infinite loop */
  for(;;){
    key = KEY_Scan(0);	
	switch(key){
		case KEY_UP_PRES:
			memset(u8TaskListBuff, 0, 400);
			vTaskList((char*)u8TaskListBuff);
			printf("Name      State    Priority    Stack   Num\r\n");
			printf("******************************************************\r\n");
			printf("%s",u8TaskListBuff);
			printf("******************************************************\r\n");
			key = 0;
			break;
		case KEY_DOWN_PRES:
			//....
			key = 0;
			break;
	}
	osDelay(10);
  }
  /* USER CODE END KeyTask */
}

3.3 下载验证

编译无误下载到开发板后,D2指示灯闪烁表示程序正常运行。打开串口调试助手,可以看到串口每隔1s输出相应字符;按下K_UP按键,串口打印出每个任务的详细信息
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS系列|任务堆栈 的相关文章

  • 基于HAL库的FREERTOS----------二.任务API函数

    任务API函数览概 CUBEMX对 做了API的封装 很多 的函数没有封装到位 可以用原函数调用 任务API函数分别介绍 1 uxTaskPriorityGet 此函数用来获取指定任务的优先级 要使用此函数的话宏 INCLUDE uxTas
  • FreeRTOS config开始的宏

    FreeRTOSConfig h系统配置文件中可以自定义 FreeRTOS h中定义默认值 configAPPLICATION ALLOCATED HEAP 默认情况下FreeRTOS的堆内存是由编译器来分配的 将宏configAPPLIC
  • FreeRTOS简述和移植文档

    FreeRTOS简述和移植文档 文章目录 FreeRTOS简述和移植文档 1 前言 2 FreeRTOS简述 1 概述 2 实现 3 主要特色 4 支持平台 3 移植FreeRTOS 4 最后 1 前言 目前由于IOT的飞速发展 针对单片机
  • FreeRTOS学习笔记(3、信号量、互斥量的使用)

    FreeRTOS学习笔记 3 信号量 互斥量的使用 前言 往期学习笔记链接 学习工程 信号量 semaphore 两种信号量的对比 信号量的使用 1 创建信号量 2 give 3 take 4 删除信号量 使用计数型信号量实现同步功能 使用
  • 【FreeRTOS】多任务创建

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • 【FreeRTOS开发问题】FreeRTOS内存溢出

    FreeRTOS内存溢出 如下图所示 FreeRTOS编译完成后可以看到 系统提示无法分配内存到堆 Objects Template axf Error L6406E No space in execution regions with A
  • FreeRTOS系列

    1 RTOS简介 RTOS全称为 Real Time Operation System 即实时操作系统 RTOS强调的是实时性 又分为硬实时和软实时 硬实时要求在规定的时间内必须完成操作 不允许超时 而软实时里对处理过程超时的要求则没有很严
  • ZYNQ中FreeRTOS中使用定时器

    使用普通的Timer中断方式时 Timer中断可以正常运行 但是UDP通信进程无法启动 其中TimerIntrHandler是中断服务程序 打印程序运行时间与从BRAM中读取的数据 void SetupInterruptSystem XSc
  • 【FreeRTOS】队列的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS学习笔记<中断>

    中断概念 Cortex M的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽中断 NMI 1个Systick 滴答定时器 定时器中断和多个系统异常 Cortex M处理器有多个用于管中断和异常的可编程寄存器 这些寄存器大多数都在 NV
  • FreeRTOS记录(九、一个裸机工程转FreeRTOS的实例)

    记录一下一个实际项目由裸机程序改成FreeRTOS 以前产品的平台还是C8051单片机上面的程序 硬件平台改成了STM32L051 同时使用STM32CubeMX生成的工程 使用FreeRTOS系统 EEPROM数据存储读取函数修改更新 2
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • freertos————互斥锁

    线程安全 多线程程序处于一个多变的环境 可访问的全局变量和堆数据随时可能被其他的线程改变 多个线程同时访问一个共享数据 可能造成严重的后果 出现问题的是之前移植了一个freemodbus的从站 多个任务访问全局变量保持寄存器区 导致最后读出
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • FreeRTOS学习(三)开关中断

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 背景知识 Cotex M3的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽 NMI 1个Systick 滴答定时器 Cortex M处理
  • Arduino IDE将FreeRTOS用于STM32

    介绍 适用于STM32F103C8的FreeRTOS STM32F103C是一种能够使用FreeRTOS的ARM Cortex M3处理器 我们直接在Arduino IDE中开始使用STM32F103C8的FreeRTOS 我们也可以使用K
  • FreeRTOS死机原因

    1 中断回调函数中没有使用中断级API xxFromISR 函数 xSemaphoreGiveFromISR uart busy HighterTask 正确 xSemaphoreGive uart busy 错误 2 比configMAX
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • 用DD命令制作硬盘镜像

    用DD命令制作硬盘镜像 本文参考http serverfault com questions 4906 using dd for disk cloning写出 xff0c 转载时请说明出处 以下的说明都是针对备份整个硬盘 xff0c 而不是
  • 什么是PID 算法

    PID是工业控制上的一种控制算法 xff0c 其中P表示比例 xff0c I表示积分 xff0c D表示微分 以温度控制的PID程序为例 xff1a P xff08 比例 xff09 表示在温度设定值上下多少度的范围内做比例动作 xff0c
  • html代码向左居右对齐

    刚才居然忘了 现在写出来 lt div align 61 right gt 居右对齐 lt div gt left左 xff0c center中 xff0c right右
  • 出现java.lang.IllegalArgumentException: No configs match configSpec

    模拟器不支持OpenGL ES 2 0 是因为android模拟器不支持OpenGL ES 2 0 xff0c 解决办法 xff1a 创建模拟器时 xff1a GPU emulation选yes xff0c 需要android 4 0以上的
  • [005] [ARM-Cortex-M3/4] 大小端存储

  • Android使用java调用C的方法

    Android使用java调用C的方法 xff1a 要将C语言写的算法需要集成到安卓端 xff0c 因此学习如何从安卓java调用C JNI 1 JNI 提示 Android NDK Android Developers google cn
  • STM32之USART-串口通信(含串口实验详细解析)

    STM32之串口通信 USART xff08 含串口实验详细解析 xff09 开发环境 xff1a Window 10开发工具 xff1a Keil uVision5 MDK硬件 xff1a STM32F103 资料参考 xff1a 正点原
  • 昆仑镜Air530 GPS串口输出

    原理图 Air724UG硬件手册说明 Air724UG模块硬件手册 实际开机后并不是默认打开 pmd手册 LDO VMMC level范围0 15 其中0表示关闭其余值满足下面公式 step 61 9 level 当step大于127时为1
  • 常用bat代码

    清除空文件夹 清理空文件夹 删除空文件夹 64 echo off for f 34 tokens 61 34 i in 39 dir s b ad sort r 39 do rd 34 i 34
  • 如何快速的翻译并阅读外文文献

    本文适用一些想要快速了解文献内容的童鞋 在进行查找文献时 不可避免要查找外文文献 其中以英文居多 当然也有可能涉及到其他语言 像楼主这样学了十几年英语 然而听说读写弱鸡的人 面对英语时 会头痛 要是查到其他语言的文献时 估计要死的心都有了
  • [c/c++ ]字节序与大小端转换

    注明 xff1a 以下内容均为学习内容整理 xff0c 记录 xff0c 便于自己学习 xff0c 并非完全意义上的自产 xff0c 如有感到不适 xff0c 请联系我 一 多字节值及字节序 1 brief 现在有一个数字 65430 xf
  • 5V升压8.4V芯片电路图,5V充电7.4V电池

    两节锂电池串联 xff0c 串联电压相加 xff0c 一般锂电池标称电压3 7V xff0c 3 7V 43 3 7V 61 7 4V xff0c 7 4V锂电池 xff0c 充电充满电压饱和是8 4V 7 4V锂电池放电电压一般是6V 8
  • 浅谈资源加载 -AssetBundleSystem

    AssetBundleSystem Ps 稍微抽点时间写一下这个 xff0c 这个小项目完成度80 左右 xff0c 在年初2月份的时候就完成的差不多了 xff0c 因为各种原因处于半搁浅的阶段 xff0c 现在官方出了Addressabl
  • 地形转网格工具(Terrain2Mesh)

    在游戏开发的制作中可能需要制作地形 xff0c 需要制作的相关的地形工具 xff0c 绝大部分情况下并不会使用unity的terrain xff0c 因为其在移动平台上的表现很差 xff0c 相同顶点甚至更多的mesh性能也比其优秀很多 x
  • Unity-EmojiUI更新

    项目中可能会用到emoji表情 xff0c 所以这几天针对这个模块进行了制作和整理 首先 xff0c 在网上进行简单的搜索查找现成方案 xff0c 主要搜索结果为textmeshpro和github上的一些emoji项目 xff0c 因为闭
  • ZYNQ UltraScale 双核裸跑 / 裸跑 + Linux

    1 背景提出 某项目对中断延迟有很高的要求 xff0c 客户的构架为 xff1a PPC 43 Vxworks 延迟时间大概 xff1a 10us 因硬件设计原因 xff0c 还可以更小 我们在Linu系统下测试中断延迟大概几百us 而且这
  • ZYNQ有两个CPU?(一)——AMP搭建

    ZYNQ有两个CPU xff1f xff08 一 xff09 AMP搭建 罗宾老师 嵌入式教师 码峰社QQ群541931432
  • 一个复杂的nf_conntrack实例全景解析

    本文关注两点 xff0c 一点是细节 xff0c 另外一点是概览 xff1a 细节 xff1a 一个完整的关于nf conntrack和NAT互动的例子概览 xff1a 关于人云亦云的讽刺 近期搜集了一些关于iptables xff0c N
  • python subprocess.Popen的使用

    python中的subprocess Popen xff08 xff09 使用 从python2 4版本开始 可以用subprocess这个模块来产生子进程 并连接到子进程的标准输入 输出 错误中去 xff0c 还可以得到子进程的返回值 s
  • FreeRTOS系列|任务堆栈

    任务堆栈 运行freertos系统的大部分都是资源有限的MCU xff0c 所以对于RAM我们都要考虑尽量的节省 xff0c 避免资源浪费 下面将会基于Cortex M3内核的STM32F103型MCU来介绍FreeRTOS任务栈大小的确定