ARM架构与FreeRTOS中的内存管理(flash与SRAM,堆栈)

在ARM架构中,内存的地址空间是如何划分的,内存映射表是怎样的

在Cortex-M7中,存储器一共有4GB的地址空间,4GB的地址空间又被划分为8个区域块,每个块有512M的内存。

Note:4GB的地址空间为 0x0000 0000 - 0xFFFF FFFF,可寻址的512M的地址空间为 0x0000 0000 - 0x1FFF FFFF,可寻址的地址是指处理器可以直接访问和寻址的存储区域,如flash,SRAM,寄存器。

Cortex-M7的4GB的地址空间存储映射:Vendor-specific device 和 Private peripheral bus一共512M

参考 Cortex‐M3 预定义的存储器映射:

在ARM架构中,分段或分片管理和 Section 切换管理是如设计的

在MCU的内存空间,通过链接脚本确定编译时静态内存分配,链接脚本以段(Segment)或片(Section)为单位进行分配,每个段和片在内存中占据连续空间.

Segment通常包含多个具有相似属性的内存区域,粒度较大,Section则描述单个连续的内存区域,粒度较细。

分片管理如下图,堆栈,.bss,.data,.rodata,.text

Section切换管理过程如下:

程序运行过程中,如果需要访问存储在其他Section(如.bss)的数据,需要进行Section级别的切换管理

程序运行过程中,CPU根据PC寄存器的值自动切换到对应的代码Section执行。

如果访问了数据Section,CPU会根据MMU/MPU的配置自动完成地址转换和权限检查。

如果发生内存访问异常,操作系统的异常处理程序会分析异常原因,并采取适当的措施,如切换到正确的Section,例如中断。

在ARM架构中,如何划分他的堆栈

栈是一种数据结构, 它的特点是先进后出(First Input Last Output, FILO)。入栈和出栈都靠栈指针(Stack Pointer, SP) 来维护, SP会随着入栈和出栈在栈顶上下移动。栈顶指的是当前栈指针(Stack Pointer, SP)所指向的内存地址。栈底指的是栈的起始地址,也就是栈区域在内存中的最低地址。链接脚本中_estack表示栈的结束地址,它代表了系统实际分配给栈的最高内存地址,_estack 只是一个符号,表示预留给栈使用的内存范围的上限,并不等同于实际栈使用的最高地址,栈指针(SP)寄存器记录的是当前栈顶的地址,它的值永远不会超过 _estack。

如果栈使用的空间超过了 _estack 所指向的地址,就会发生栈溢出错误。

Cortex‐M7使用的是“向下生长的满栈”模型。

栈指针 SP 指向最后一个被压入堆栈的 32 位数据。

入栈:

出栈:

举例:在MCU链接脚本中,定义堆栈的结束地址,也就是高内存地址,定义他的静态堆栈大小。在ARM-M7中SRAM主要作为使用为堆栈和数据段的内存是128k,也就是DTCM,因为他的访问速度最快。

堆栈的起始地址和之前分配的各种数据段和对齐方式有联系。

在运行FreeRTOS时,特权模式和用户模式如何划分在SRAM中划分堆栈,以及任务之间如何划分堆栈

在Cortex-M7架构中,堆栈通常由两个寄存器来管理:主堆栈指针(MSP)和进程堆栈指针(PSP),MSP是处理器的默认堆栈指针,用于保存中断处理程序的现场,PSP堆栈指针用于保存应用程序现场的。

也就是说如果跑的是裸机程序,他的所有程序都在使用MSP堆栈指针。如果跑操作系统,一般的任务执行和调度使用的是PSP堆栈指针,如果产生中断,中断服务使用的是MSP堆栈指针。

主堆栈(MSP):在系统启动期间,CPU会自动将MSP设置为链接脚本中_estack的值。进程堆栈(PSP):由操作系统或应用程序在运行时进行设置。

在运行FreeRTOS时,内存堆为 ucHeap[] , 大小为 configTOTAL_HEAP_SIZE。当宏 configAPPLICATION_ALLOCATED_HEAP 为 1 的时候需要用户自行定义内存堆,内存的分配方案有五种,heap_1,heap_2,heap_3,heap_4,heap_5,否则的话由编译器来决定,默认都是由编译器来决定的。

如下图所示:操作系统在内存中所占据的地址空间,MSP与PSP都是特指的堆栈指针,如果没有任务,只跑操作系统,那就只应用了MSP堆栈指针,如果有创建任务,就多了PSP堆栈指针,并且初始化和动态创建了任务的堆栈内存。深入理解 STM32 双堆栈机制 - 国际哥的独立博客

任务的内存分配方案有五种,heap_1,heap_2,heap_3,heap_4,heap_5,但FreeRTOS默认的分配是0,在启动时分配一块连续的内存区域作为堆,内存区域的大小由 configTOTAL_HEAP_SIZE 宏来配置,FreeRTOS 会使用这块预分配的内存区域来满足动态内存分配的需求。 configTOTAL_HEAP_SIZE 宏定义的是一个连续的内存空间,任务堆栈的起始地址是随机分配的,不一定是从系统堆栈的最高地址开始。只要有足够的连续空间,FreeRTOS就会从系统堆栈中分配出一块区域作为任务的私有堆栈。

基于MSP的堆栈地址:需要进行8字节对齐,起始地址:0X2000 9208,length=40k=0XA004,结束地址:0X201 3208

configTOTAL_HEAP_SIZE 宏定义的是一个连续的存储任务的内存空间,内存变量是 uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]u8数据类型,

起始地址:0X2000 2CDC,length=19.53k=0X4E20,结束地址:0X2001 3208,刚好接上上图的FreeRTOS的MSP堆栈地址。

ucHeap 代表了FreeRTOS中动态内存分配的堆栈,虽然任务的执行代码存储在flash里,但是里面的静态变量是存在SRAM的堆栈里。

在创建任务的时候,会分配堆栈的内存大小,但是实际使用的时候用不满或溢出,所以要判断实际中使用了多少堆栈可以用函数 uxTaskGetStackHighWaterMark在任务执行的时候区观察运行期间堆栈使用量最大值。

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

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

相关文章

[C++] 深度剖析C_C++内存管理机制

文章目录 内存分布内存分布图解 C语言中动态内存管理方式malloc:callocrealloc C内存管理方式内置类型**自定义类型** operator new & operator deleteoperator new & operator delete函数operator newoperator delete **new T[N]** 与**delete[]** **定位new表达式(pl…

第二章 UI组件【Android基础学习】

第二章 UI组件【Android基础学习】 前言版权推荐开源第二章 UI组件2-1 布局管理器2-1-1 LinearLayout2-1-2 RelativeLayout 2-2 TextView2-3 Button2-4 EditText2-5 RadioButton2-6 复选框CheckBox2-7 ImageView2-8 列表视图 ListView2-9 网格视图 GridView2-10 滚动视图 Scrol…

深入理解Session和Cookie的作用与联系

深入理解Session和Cookie的作用与联系 1、什么是Cookie?1、什么是Session?1、Session和Cookie的联系4、实际应用场景 💖The Begin💖点点关注,收藏不迷路💖 Session和Cookie是两个至关重要的概念&#xff0c…

30.【C语言】详解printf

1.printf&#xff08;print formate&#xff09;输入函数 01.简单使用 调用前要引用头文件 #include <stdio.h> printf("abc"); 默认情况下打印完光标停留在同一行 \n可以换行 printf("abc\n"); ​ printf("ab\nc"); ​ printf(…

leetcode-383.赎金信

题源 383.赎金信 题目描述 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。示例 1&…

Beelzebub过程记录及工具集

文章目录 靶场搭建靶场测试过程安装dirsearch扫描目录wpscan扫描破解 靶场搭建 https://download.vulnhub.com/beelzebub/Beelzebub.zip 下载解压镜像&#xff0c;从vmware打开。 一键式开机即可。 打开后配置网络。 确保网络可达。 靶场测试过程 首先使用nmap扫描网段的存…

SpringBoot项目如何使用自定义Repository

在公司实习的时候&#xff0c;遇到这样一个问题&#xff0c;就是当往数据库添加记录的时候&#xff0c;需要先去查看数据库中的记录数是否超过了最大限制&#xff0c;如果没有超过则进行添加&#xff1b;否则就需要删除先前的记录从而保证数据库中的记录数。这样的话&#xff0…

【EXCELL技巧篇】使用Excel公式,获取当前 Excel的Sheet页的名字

【通知】&#xff1a; 正式跟大家说个难过的消息&#xff0c;本来在「中国朝代史」结束后&#xff0c;开启的下一个专栏「中国近代史」前面几期做的还好好的&#xff0c;可是今天起正式通知审核不过&#xff0c;因为一些原因。 其实我对于历史这一块我还是很感兴趣的&#xff0…

极地生产力自主采样系统的观测:融池比例统计 MEDEA 融池比例数据集

Observations from the Autonomous Polar Productivity Sampling System. 极地生产力自主采样系统的观测结果 简介 该项目是美国国家航空航天局 ICESCAPE 大型项目的一部分&#xff0c;旨在研究浮游植物丰度的长期季节性变化与整个生长季节在波弗特海和楚科奇海测量到的海冰…

从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望

我在2021年底开始使用Polars和DuckDB。我立刻意识到这些库很快就会成为数据科学生态系统的核心。自那时起&#xff0c;这些库的受欢迎程度呈指数级增长。 在这篇文章中&#xff0c;我做出了一些关于未来几年数据科学领域的发展方向和原因的预测。 这篇文章旨在检验我的预测能力…

计算机技术与软件专业技术资格(软考)纸质证书邮寄方法

电子版证书已经有网友指出说明方法了&#xff0c;参考 软考电子证书下载 注意如果下载的PDF文件值无法打开的话&#xff0c;可以选择查看&#xff0c;然后 ctrlp 打印为PDF, 也是另外的一种下载方法&#xff1b; 下面说一下纸质版证书邮寄方法 1&#xff1a;登录网站 中国计…

【保姆级】Python项目部署到Linux生产环境(uwsgi+python+flask+nginx服务器)

1.安装python 我这里是3.9.5版本 安装依赖&#xff1a; yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y 根据自己的需要下载对应的python版本&#xff1a; cd /usr/local wget https://www.python.or…

CyberVadis认证是什么

CyberVadis认证是一项全球性的、权威的、基于云的网络安全性评估和认证项目。它是由Altimeter公司开发的&#xff0c;专门针对云计算服务提供商、数据中心、软件即服务(SaaS)供应商、安全咨询服务公司和内部IT部门而设计的。 CyberVadis认证旨在评估和验证组织在网络安全方面的…

数电基础 - 硬件描述语言

目录 一. 简介 二. Verilog简介和基本程序结构 三. 应用场景 四. Verilog的学习方法 五.调式方法 一. 简介 硬件描述语言&#xff08;Hardware Description Language&#xff0c;HDL&#xff09;是用于描述数字电路和系统的形式化语言。 常见的硬件描述语言包括 VHDL&…

邮箱表单系统源码

邮箱表单简介 我们的邮箱表单系统是一个简洁高效的工具&#xff0c;旨在为用户提供一种便捷的方式来提交他们的邮箱地址。该系统可以用于订阅新闻通讯、注册活动、获取用户反馈等多种场景。 功能特点&#xff1a; 用户友好的界面&#xff1a; 表单设计简洁直观&#xff0c;用…

成功适配!极验设备指纹HarmonyOS 鸿蒙版官方下载

近日&#xff0c;华为开发者大会&#xff08;HDC 2024&#xff09;在东莞召开。在大会开幕日的首场主题演讲中&#xff0c;华为宣布当前已有TOP5000应用成为鸿蒙原生应用&#xff0c;350&#xff0b;SDK已适配HarmonyOS NEXT版本。其中&#xff0c;极验作为其重要伙伴&#xff…

AI自动生成PPT哪个软件好?高效制作PPT优选这4个

7.15初伏的到来&#xff0c;也宣告三伏天的酷热正式拉开序幕~在这个传统的节气里&#xff0c;人们以各种方式避暑纳凉&#xff0c;享受夏日的悠闲时光。 而除了传统的避暑活动&#xff0c;我们还可以用一种新颖的方式记录和分享这份夏日的清凉——那就是通过PPT的方式将这一传…

02 Git环境搭建

第2章&#xff1a;Git环境搭建 一、Git下载和安装 ​ 官网&#xff1a;Git (git-scm.com) 一&#xff09;安装主程序 ​ 准备安装包&#xff0c;双击安装 ​ 开始安装 ​ 选择安装位置 ​ 选择需要安装的组件&#xff08;默认&#xff09; ​ 选择文件夹菜单 ​ 选择编辑器&…

自适应巡航控制中的Stop Go功能详解

自适应巡航控制中的跟车行驶功能详解 文章目录 1. 背景介绍2. 功能定义3. 功能原理4. 传感器架构5. 实际应用案例6. 总结与展望 1. 背景介绍 自适应巡航控制&#xff08;Adaptive Cruise Control, ACC&#xff09;系统中的Stop & Go功能是提升驾驶舒适性和安全性的重要子…

Visual Studio2022中使用.Net 8 在 Windows 下使用 Worker Service 创建守护进程

Visual Studio2022中使用.Net 8 在 Windows 下创建 Worker Service 1 什么是 .NET Core Worker Service1.1 确认Visual Studio中安装了 ASP.NET和Web开发2 创建 WorkerService项目2.1 新建一个WorkerService项目2.2 项目结构说明3 将应用转换成 Windows 服务3.1 安装Microsoft.…