STM32 堆栈空间分布

news2024/11/25 0:22:24

参考

  1. 运行时访问__initial_sp__heap_base

无RTOS时的情况

在这里插入图片描述
在以上配置的情况下,生成工程。在工程的startup.s文件中,由如下代码:

Stack_Size		EQU     0x400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
__Stack_top		; 自己添加
Stack_Mem       SPACE   Stack_Size
__initial_sp

IF      :DEF:__MICROLIB           
	EXPORT  __initial_sp
	EXPORT  __heap_base
	EXPORT  __heap_limit
	EXPORT  __Stack_top	; 自己添加
ELSE
	IMPORT  __use_two_region_memory
	EXPORT  __user_initial_stackheap
__user_initial_stackheap
	LDR     R0, =  Heap_Mem
	LDR     R1, =(Stack_Mem + Stack_Size)
	LDR     R2, = (Heap_Mem +  Heap_Size)
	LDR     R3, = Stack_Mem
	BX      LR
	ALIGN
ENDIF

通过以上代码可以看出,需要使能MicroLib才会默认导出__initial_sp,__Stack_top,__heap_base,__heap_limit这几个变量。(如果不使能MicroLib,则需要在上面代码的ELSE下面也添加EXPORT语句将这几个变量导出)。
然后在main.c中添加如下代码,查看以上这些变量的值:

  extern uint32_t __heap_base, __heap_limit;
  extern uint32_t __Stack_top, __initial_sp;
  extern uint32_t __Vectors, __Vectors_End, __Vectors_Size;
  while (1)
  {
  	// 0x200013A8 ~ 0x200015A8  size:0x200  RAM
    printf("heapS[0x%08x], heapE[0x%08x]\r\n", (uint32_t)&__heap_base, (uint32_t)&__heap_limit);
      
    // 0x200019A8 ~ 0x200015A8  size:0x400  RAM
    printf("stackS[0x%08x], stackE[0x%08x]\r\n", (uint32_t)&__initial_sp, (uint32_t)&__Stack_top); 

	// 0x08000000 ~ 0x080000EC  ROM
	printf("VectS[0x%08x], VectE[0x%08x], VectSize[0x%x]\r\n\r\n", (uint32_t)&__Vectors, (uint32_t)&__Vectors_End, (uint32_t)&__Vectors_Size);
  }

从上可以看到,__Stack_top__heap_limit是一样的,说明这里分配的堆和栈是紧邻的。而且地址刚好也和我们在cubeMx中定义的一致。堆和栈是在RAM中,而中断向量表是在Flash中。

添加FreeRTOS

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从以上三张图中,可以发现,我们给FreeRTOS总共分配了3072(0xC00) Bytes HEAP空间。而我们定义了一个defaultTask并分配了256 * 4 = 1024 Bytes,但是在最后的FreeRTOS Heap Usage页面看到,defaultTask实际使用了1144 Bytes,剩余3072 - 1144 = 1928 Bytes。(除了defaultTask多使用的1144 - 1024 = 120 Bytes外,其余都是可以对上的。)
生成工程后,我们还是将之前的那些堆栈指针地址打印出来,看一下MCU是如何进行地址分配的。只是这里还需要添加FreeRTOS中的堆栈信息了。首先通过追踪configTOTAL_HEAP_SIZE可以发现,堆空间定义为了一个数组:

	static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    uint8_t* osHeapPoint = ucHeap;		// 由于以上变量是 static 类型,所有这里再定义一个指针指向这个 Heap 地址,以便在外部访问它;

然后我们就可以在defaultTask任务里面添加输出以上变量地址的代码了:

  extern uint32_t __heap_base, __heap_limit;
  extern uint32_t __Stack_top, __initial_sp;
  extern uint32_t __Vectors, __Vectors_End, __Vectors_Size;
  extern uint8_t* osHeapPoint;
  
  for(;;) {
  	// 0x20002CF8 ~ 0x20002EF8  size:0x200  RAM
  	printf("HeapS[0x%08x], HeapE[0x%08x]\r\n", (uint32_t)&__heap_base, (uint32_t)&__heap_limit);
	
	// 0x200032F8 ~ 0x20002EF8  size:0x400  RAM
	printf("StackS[0x%08x], StackE[0x%08x]\r\n", (uint32_t)&__initial_sp, (uint32_t)&__Stack_top);

	// 0x200020F8   size: 3072 Bytes(0xC00)
	printf("OsHeapPoint[0x%08x]\r\n\r\n", (uint32_t)osHeapPoint);
	
	// 0x08000000 ~ 0x080000EC  ROM
	printf("VectS[0x%08x], VectE[0x%08x], VectSize[0x%x]\r\n", (uint32_t)&__Vectors, (uint32_t)&__Vectors_End, (uint32_t)&__Vectors_Size);
  }

freeRTOS中调用malloc()动态分配空间时,这个空间是属于哪个堆呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1183939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql数据库 10.SQL语言 储存过程 中 流程控制

存储过程中的流程控制 在存储过程中支持流程控制语句用于实现逻辑的控制 一、分支语句 语法:if-then-else 1.单分支语句 语法 if conditions then ——SQL end if; if conditions then——SQLend if; ——如果参数a的值为1,则添加一条班级信息 …

windows系统远程桌面连接centos7系统

1. 安装 GNOME 桌面环境(如果尚未安装) yum groupinstall "GNOME Desktop" 2. 安装 VNC Server yum install tigervnc-server 3. 设置 vnc 账号密码 vncpasswd root root 是账号,接下会提示两次输入密码 4. 安装 xrdp 检查…

Java智慧工地云平台监控管理系统源码

随着科技的发展,让人们也愈发了解可视化操作所带来的优势。智慧工地的诞生,相当于为建筑施工带来了一套较为完整的数字化流程,能够完善施工环节中的各部分内容。 智慧工地是指利用先进的信息技术,将传感器、互联网、人工智能等技术…

<a>标签的download属性部分浏览器无法自动识别文件后缀

问题 最近开发中遇到的问题,文件名中含有点和逗号字符,当使用a标签的download属性下载内容时,如果不指定后缀,部分浏览器无法自动识别文件后缀。如下图所示: 定义用法 download 属性定义了下载链接的地址。 href 属性…

注册虾皮买家号需要哪些资料?

注册虾皮买家号其实是很简单的,使用相应国家的手机号及对应的环境就可以注册了的,如果想要账号更方便使用,也可以绑定邮箱进行认证。 而如果想要使用shopee买家通系统进行自动化的注册,那么对于资料就有一定的要求了。 1、手机号…

vue上传宝塔退出页面404

当我们将vue上传到服务器上点击退出时出现页面404时。 如何解决: 1.如果是element plus框架时: 找到layouts文件里面的components文件下Avatar中的index.vue. 2.添加重新加载:location.reload(); 如果是其他的框架同上 。

Spring Boot中使用Spring Data JPA访问MySQL

Spring Data JPA是Spring框架提供的用于简化JPA(Java Persistence API)开发的数据访问层框架。它通过提供一组便捷的API和工具,简化了对JPA数据访问的操作,同时也提供了一些额外的功能,比如动态查询、分页、排序等。 …

C#,数值计算——偏微分方程,谱方法的微分矩阵的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 谱方法的微分矩阵 /// Differentiation matrix for spectral methods /// </summary> public class Weights { public Weights() { …

单调栈及其应用

1. 单调栈 应用场景&#xff1a;求解下一个更大/小的数原理&#xff1a;空间换时间&#xff0c;暴力解法O&#xff08;n&#xff09;单调栈作用&#xff1a;记录遍历过的元素&#xff0c;与当前元素进行对比 模板:求解左边比它更小的元素 单调递增的栈&#xff08;底——》顶…

Python的asyncio库:掌握异步编程的利器

目录 一、引言 二、异步编程概述 三、asyncio库的使用方法 1、导入asyncio库 2、创建异步函数 3、创建事件循环 4、运行异步任务 5、关闭事件循环 四、asyncio库的高级用法 1、异步上下文管理器 2、协程函数和协程变量的共享状态 五、注意事项 六、总结 一、引言 …

数字孪生技术助力水务行业实现智能化

在当今数字化时代&#xff0c;水务行业也积极迎接变革&#xff0c;数字孪生技术正成为该行业的一项重要助力。数字孪生不仅帮助水务行业实现智能化发展&#xff0c;还提供了许多重要的优势&#xff0c;为水资源管理、供水系统运营和环境保护等方面带来了巨大的改变。水务行业面…

阿里云服务器云盘性能IOPS和吞吐量说明SSD、ESSD和高效

阿里云服务器系统盘或数据盘支持多种云盘类型&#xff0c;如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等&#xff0c;阿里云百科aliyunbaike.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延等性…

PHP分类信息网站源码系统 电脑+手机+微信端三合一 带完整前后端部署教程

大家好啊&#xff01;今天源码小编来给大家分享一款PHP分类信息网站类源码系统。这款源码系统是一套专业的信息发布类网站综合管理系统&#xff0c;适合各类地方信息和行业分类站点建站。随着这几年我们国家网民爆炸式的增 长&#xff0c;网络信息也随之越来越庞大&#xff0c;…

全国5米高程DEM数据及衍生的全国地形起伏度数据

地表起伏度&#xff0c;也有称为地势起伏度、地形起伏度&#xff0c;是指某点在其确定面积的域内的最高点与最低点之间的高差。地表起伏度概念的核心在于如何确定该点的计算域。在统计意义上&#xff0c;随着计算域范围的增大&#xff0c;地表起伏度将逐渐增大。 因此&#xff…

【Python自学笔记】Flask调教方法Internel Server Error

收到老师的小组作业任务说是写一个自动报告程序&#xff0c;用PythonSQLiteHTML实现&#xff0c;好吧。 前面没什么问题&#xff0c;打开VSCode&#xff0c;连数据库读数据处理可视化模板拼凑&#xff0c;最后调用Flask框架出网页报告的时候总报错连接不了。 但换了jinjia2的渲…

水利部加快推进小型水库除险加固,大坝安全监测是重点

国务院常务会议明确到2025年前&#xff0c;完成新出现病险水库的除险加固&#xff0c;配套完善重点小型水库雨水情和安全监测设施&#xff0c;实现水库安全鉴定和除险加固常态化。 为加快推进小型水库除险加固前期工作&#xff0c;水利部协调财政部提前下达了2023年度中央补助…

事业单位如何完成新闻宣传发稿考核任务

新闻宣传作为事业单位对外展示形象、传达政策、沟通信息的重要手段&#xff0c;其效果直接关系到单位的声誉和形象。许多事业单位会设立新闻宣传考核任务&#xff0c;同样作为单位宣传口的公务人员面临考核&#xff0c;也关系到机关事业单位的年度绩效和排名。 首先需要确保清楚…

【亚马逊云科技产品测评】活动征文|10分钟拥有一台AWS Linux系统

前言 在数字化时代&#xff0c;AWS云服务扮演着至关重要的角色。AWS&#xff08;Amazon Web Services&#xff09;是亚马逊公司旗下的云计算服务平台&#xff0c;为全球各地的企业、组织和个人开发者提供了一系列广泛而深入的云服务。 在AWS云服务中&#xff0c;计算、存储、数…

idea 模板参数注释 {@link}

1. 新增组 2. 设置方法注释及变量 增加模板文本 ** * $param$ * return {link $return$} */3. 设置变量表达式 勾选跳过param 参数表达式 groovyScript("def result ;def params \"${_1}\".replaceAll([\\\\[|\\\\]|\\\\s], ).split(,).toList();def param…

迅睿cms前台页面的会员登入和退出

迅睿cms前台页面的会员登入和退出 前端代码&#xff1a; {if $member} 登录用户名&#xff1a;{$member.username} {else} 没有登录 <a href"{dr_member_url(register/index)}" class"btn dark btn-outline btn-xs">用户注册</a> <…