当前位置: 首页 > article >正文

stm32 rtx操作系统 堆(heap) 栈(stack) keil在线监测

STM32内存分为3块区域:全局/静态变量区、栈区、堆区
其中全局/静态变量区用于存放全局/静态变量(包括指针变量),
栈区用于存放当前运行的函数及其中定义的局部变量和程序指针等,
堆区用于存放动态申请的内存,即malloc的内存。

操作环境

Keil MDK 5.38a
Arm Compiler v6.16
cubemx 生成的工程文件
rtx操作系统
H743VIT6芯片

keil中的堆栈设置

修改启动文件,选择下面的Configuration选项卡
在这里插入图片描述
操作系统在生产线程时主要分配stack空间,所以这里stack要多留一点

操作系统线程的stack

在RTX_Config.h里面,定义了生成线程时默认的stack大小

//   <o>Default Thread Stack size [bytes] <96-1073741824:8>
//   <i> Defines stack size for threads with zero stack size specified.
//   <i> Default: 3072
#ifndef OS_STACK_SIZE
#define OS_STACK_SIZE               8192
#endif

生成线程时,要指定参数来初始化stack大小,否则就用上面默认值

/// Attributes structure for thread.
typedef struct {
  const char                   *name;   ///< name of the thread
  uint32_t                 attr_bits;   ///< attribute bits
  void                      *cb_mem;    ///< memory for control block
  uint32_t                   cb_size;   ///< size of provided memory for control block
  void                   *stack_mem;    ///< memory for stack
  uint32_t                stack_size;   ///< size of stack
  osPriority_t              priority;   ///< initial thread priority (default: osPriorityNormal)
  TZ_ModuleId_t            tz_module;   ///< TrustZone module identifier
  uint32_t                  reserved;   ///< reserved (must be 0)
} osThreadAttr_t;

其中stack_size就是初始化的栈空间

线程变量在堆/栈中的区分

一般会写一个函数main_thread()来作为线程的主函数

如果在这个函数内定义了局部变量,就占用分配的stack栈空间;
如果在这个函数外,同一文件内写了变量,不占用这个函数的stack栈空间;
如果函数内写了个static并赋值,也不占用stack栈空间。

keil监视RTOS运行情况

进入调试模式
在这里插入图片描述
如果写两个极大的局部变量:
在这里插入图片描述
可以看到stack基本就满了
如果把一个拿出去声明,占用的是heap,就省去很多stack栈空间
在这里插入图片描述
如果不合理分配堆栈空间,可能会

  1. 线程根本跑不起来
  2. 线程跑起来了,里面的变量乱变(也可能初始化后是好的,放一会就变了)
  3. 根本编译不过去

有几篇文章写的挺好,参考了一下:
STM32 堆、栈、内存分配-精华详解
STM32堆栈的大小及内存四(五)区的分析
【方法齐全|原创】MDK使用CMSIS RTX5调试窗口提示 ‘os_Info‘: ‘osRtxInfo‘ not found 解决方法


http://www.kler.cn/news/351002.html

相关文章:

  • 光伏电站折旧率的计算
  • 前端学习---(5)js基础--3
  • AIGC实战——世界模型(World Model)
  • 给已经写好的裸机程序移植freeRTOS操作系统
  • 正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 5427(unattended-upgr)持有
  • 免费开源AI助手,颠覆你的数字生活体验
  • 模板匹配的交通标志识别系统MATLAB
  • AI-基本概念-训练集、验证集、测试集
  • 前端vue部署网站
  • 卷积神经网络(CNN)-Padding介绍
  • 每日OJ题_牛客_小乐乐改数字_模拟_C++_Java
  • 护眼台灯横评:书客、柏曼、明基哪款使用体验好,又能护眼?
  • 【安当产品应用案例100集】023-企业内部对Oracle数据库动态凭据的管理
  • golang一个轻量级基于内存的kv存储或缓存
  • USB驱动程序知识介绍
  • es kibana .logstash离线集群安装
  • 总结ES6—ES13新特性
  • java导出带图形的word
  • BP8523D非隔离5V100MA输出SOP7贴片AC-DC电源芯片
  • 【开源】第三期:数字货币程序化交易终端开源
  • 产品更新|DuoPlus云手机APP预装、批量管理功能新上线!
  • 微信小程序启动相机功能
  • 如何用示波器检测次级点火系统(一)
  • HttpClient的基本使用【IDEA版】
  • ES6新特性2- Promise的介绍和使用,map和set集合,ES6-新增对象方法, async和await
  • Wed前端入门——HTML、CSS