5 存储器映射和寄存器

news2024/11/16 7:30:52

文章目录

  • 5.3 芯片内核
    • 5.3.1 ICache
    • 5.3.2 DCache
    • 5.3.3 FlexRAM
  • 5.4 存储器映射
    • 5.4.1 存储器功能划分
      • 5.4.1.1 存储器 Block0 内部区域功能划分
      • 5.4.1.2 储存器 Block1 内部区域功能划分
      • 5.4.1.3 储存器 Block2 内部区域功能划分
  • 5.5 寄存器映射
    • 5.5.1 GPIO1的输出数据寄存器

5.3 芯片内核

RT1052 采用的是 Cortex-M7 内核,内核即 CPU,由 ARM 公司设计。
在这里插入图片描述

  • 芯片内核和外设之间通过各种总线连接
  • 内核通过 TCM 总线访问芯片内部的 SRAM 存储器,从中加载代码指令执行
  • 内核通过 AHBP 总线跟芯片上的 GPIO、UART 等外设进行交互
  • 另外内核还可以通过 AXIM 总线接口连接芯片外部的存储器,扩展存储空间。

该芯片并没有像传统的 MCU 一样集成内部 FLASH 存储器,因此该芯片必须依靠一个外部 FLASH 长期保存程序代码。

  • 在芯片上电后,它可以直接执行在外部 FLASH 中的代码

5.3.1 ICache

Instruction Cache 指令缓存,i.MX RT 系列芯片中其大小为32KB,内核访问该存储器有着极高的速度。

  • 作用是缓存要执行的指令
  • 内核根据代码的运行情况,预先从其它存储器(如外部 Flash,外部 SDRAM 等)加载可能会被执行的代码存储至 ICache
  • 据官方统计,ICache 指令缓存的命中率能达到 98% 以上,这就是为什么 i.MX RT 系列芯片代码存储在外部的 FLASH,运行速度依然这么快。

5.3.2 DCache

Data Cache 数据缓存,在 i.MX RT 系列芯片中其大小为 32KB,它与 ICache 的功能类似,起到缓存的作用,区别只是 ICache 专用于存储指令,DCache 专用于存储数据。

5.3.3 FlexRAM

灵活RAM。在 i.MX RT 系列芯片中其大小为 512KB,可以把它理解成传统MCU 的内部 SRAM 存储器。

  • 它附加了可划分功能区域的配置,分别可以把这内部 SRAM分为专用于存储指令的 ITCM,专用于存储数据的 DTCM 以及通用功能的 OCRAM。

内核使用不同的总线访问这些不同的存储器,因而访问速度有差异:
在这里插入图片描述
ICache 和 DCache 是内核自动使用,用户无法访问的。而 ITCM、DTCM 及 OCRAM 是用户可根据具体地址进行访问,开发程序时应根据它们的特性加以利用。

5.4 存储器映射

SRAM、片上外设及外部存储器,这些功能部件共同排列在一个4GB 的地址空间内。

  • 存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射

Cortex-M7 存储器映射:
在这里插入图片描述

5.4.1 存储器功能划分

在这 4GB 的地址空间中,ARM 已经粗线条的平均分成了 8 个块,,每个块也都规定了用途
在这里插入图片描述大部分块的大小都有 512MB 以上,显然这是非常大的。在这 8 个 Block 里面,有这 3 个块非常重要

  • Block0 主要用于存储程序代码,一般采用 FLASH 存储器
  • Block1 主要用于运行时的内存,一般采用 SRAM 存储器,
  • Block2 用来设计成片上的外设,内核通过相应的地址访问片上外设。

5.4.1.1 存储器 Block0 内部区域功能划分

根据 ARM 内核的设计,Block0 主要用于存储程序代码,在 i.MX RT1052 芯片内部又把这部分划分了几个类型。
在这里插入图片描述ITCM 是 Instruction Tightly-Coupled Memory 的缩写,译为指令紧耦合内存。所谓紧耦合是指该内存与内核连接紧密,有非常高的访问速度。

  • 该内存专用于缓存指令。
  • 希望有着极高执行速度的代码,可以要求内核上电后把相应的代码从外部 FLASH 加载至 ITCM

ROMCP,这是一小段 ROM 空间,用于存储芯片启动时的加载代码,即 bootloader,bootloader 负责把指令从外部存储器加载至 ITCM。

SEMC 及 FlexSPI 是 RT1052 可用于控制外部并行及串行 NorFlash 的两个外设,此处把它们映射到此代码空间,是为了支持 XIP 功能(即指令直接在 NorFlash 上运行,不需要加载到内部的 ITCM)。

5.4.1.2 储存器 Block1 内部区域功能划分

Block1 用于设计片内的 SRAM,也就是芯片运行时的内存,在 i.MX RT1052 芯片内部把这部分划分了两种 RAM 类型
在这里插入图片描述第一种类型为 DTCM,是 Data Tightly-Coupled Memory 的缩写,译为数据紧耦合内存,它跟 ITCM类似,有着极高的访问速度,不过它是专门用来存储程序数据的,即代码中变量的存储位置。
第二种类型为 OCRAM,它是 On-chip RAM 的缩写,即片上内存,可以完全把它理解为传统 MCU的内部 SRAM,它没有像 ITCM 和 DTCM 的专用限制,可用于存储指令和数据(通用目的)。

  • ITCM、DTCM 及 OCRAM 地址范围均分配了 512KB,但这并不是说这三种存储器都有 512KB 大小。
  • 实际上这三种存储器共享内部 FlexRAM 的空间,而这个内部 FlexRAM 空间在 RT1052 芯片中为 512KB,在 RT1060 芯片中为 1MB。
  • 这三种存储器的空间是可以动态调整的。T1052 中,默认 ITCM 和 DTCM 各占 128KB,OCRAM占 256KB。
  • 一共有 16 种配置方式,具体可参考《Using the i.MX RT FlexRAM》文档。

5.4.1.3 储存器 Block2 内部区域功能划分

Block2 用于设计片内的外设,在 RT1052 芯片中,它的外设使用 4 条总线与内核进行连接:
AIPS 是 ARM IP Bus 的缩写,它一边与内核 AHB 总线连接,另一边与片上的各种外设连接

  • AIPS1~4 即连接了各种各样的外设,此处每条总线划分的地址范围各为 1MB,内核根据地址可以访问相应总线下的外设

在这里插入图片描述最右一栏是挂载在 AIPS-2 总线上的外设名称。
阴影处为例,它表示一个名为 GPIO1 的外设的内存地址分配情况

  • GPIO1 外设下又包含了 RT1052 芯片中 32 个相关的引脚
  • 被分配的内存地址为 0x401B8000~0x401BBFFF
  • 通过访问这些地址就可以控制这 32 个引脚了

5.5 寄存器映射

在上述存储器 Block2 这块区域,设计的是片上外设。

  • 在相应的地址空间内它们以四个字节为一个单元,共 32bit
  • 每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作

我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元。

  • 以功能为名给这个内存单元取一个别名,这个别名对应的内存区就是我们经常说的寄存器。
  • 给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

5.5.1 GPIO1的输出数据寄存器

GPIO1 端口的输出数据寄存器 DR 的地址是 0x401B 8000。

  • DR 寄存器是 32bit,对应着 32 个外部 IO

C语言访问:

// GPIO1 端口全部输出 高电平
*(unsigned int*)(0x401B8000) = 0xFFFFFFFF;
  • 0x401B 8000 在我们看来是 GPIO1 端口数据输出寄存器 DR 的地址,但是在编译器看来,这只是一个普通的变量,是一个立即数
  • 要想让编译器也认为是指针,我们得进行强制类型转换,把它转换成指针,即 (unsigned int *)0x401B 8000
  • 再对这个指针进行 * 操作

寄存器访问:

// GPIO1 端口全部输出 高电平
#define GPIO1_DR (unsigned int*)(0x401B8000)
*GPIOF_DR = 0xFFFFFFFF;

为了方便操作,我们干脆把指针操作“*”也定义到寄存器别名里面

// GPIO1 端口全部输出 高电平
#define GPIO1_DR *(unsigned int*)(0x401B8000)
GPIOF_DR = 0xFFFFFFFF;

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

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

相关文章

上海线下活动 | LLM 时代的 AI 编译器实践与创新

今年 3 月份, 2023 Meet TVM 系列首次线下活动从上海出发,跨越多个城市,致力于为各地关注 AI 编译器的工程师提供一个学习、交流的平台。 12 月 16 日 2023 Meet TVM 年终聚会将重返上海,这一次我们不仅邀请了 4 位资深的 AI 编…

2021年6月3日 Go生态洞察:Fuzzing技术的Beta测试

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

BUUCTF john-in-the-middle 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 注意:得到的 flag 请包上 flag{} 提交 密文: 下载附件,解压得到john-in-the-middle.pcap文件。 解题思路: 1、双击文件,打开wireshark。 看到很多http流…

Jmeter+ant+jenkins实现持续集成看这一篇就搞定了!

jmeterantjenkins持续集成 一、下载并配置jmeter 首先下载jmeter工具,并配置好环境变量;参考:https://www.cnblogs.com/YouJeffrey/p/16029894.html jmeter默认保存的是.jtl格式的文件,要设置一下bin/jmeter.properties,文件内容…

leetCode 78.子集 + 回溯算法 + 图解

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集 示例 1: 输入:nums [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1…

金石工程项目管理系统 SQL注入漏洞复现

0x01 产品简介 金石工程项目管理软件是一款工程项目管理软件,专门针对建筑工程项目开发,可以用于各种工地的项目管理。 0x02 漏洞概述 金石工程项目管理系统TianBaoJiLu.aspx接口处存在SQL注入漏洞,攻击者可通过该漏洞获取数据库中的信息(例如&#xff…

Linux中的fork()函数的面试题目

1.面试题目1 (1)fork 以后,父进程打开的文件指针位置在子进程里面是否一样?(先open再fork) (2)能否用代码简单的验证一下? (3)先fork再打开文件父子进程是否共享偏移量?父进程打开的文件指针位置在子进程里面是否一样?能否用代码简单验证一…

解决:ValueError: the first two maketrans arguments must have equal length

解决:ValueError: the first two maketrans arguments must have equal length 文章目录 解决:ValueError: the first two maketrans arguments must have equal length背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在…

Jmeter进阶使用:BeanShell实现接口前置和后置操作!

一、背景 我们使用Jmeter做压力测试或者接口测试时,除了最简单的直接对接口发起请求,很多时候需要对接口进行一些前置操作:比如提前生成测试数据,以及一些后置操作:比如提取接口响应内容中的某个字段的值。举个最常用…

L1-008:求整数段和

题目描述 给定两个整数A和B,输出从A到B的所有整数以及这些数的和。 输入格式: 输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。 输出格式: 首先顺序输出从A到B的所有整数,每5个数字占一…

保存规则、nat、自定义链

目录 一、保存防火墙的规则 1、保存规则 二、nat 一、SNAT和DNAT 1.SNAT 2 DNAT 三、自定义链 1.添加自定义链 2.设置自定义链并生效 3.删除自定义链 一、保存防火墙的规则 1、保存规则 [rootlocalhost ~]# iptables -A INPUT -s 172.16.114.30 -p tcp -m multiport…

echarts 地图

效果图 业务组件 <template><mapEcharts :itemStyle"mapProps.itemStyle" :emphasisLabelStyle"mapProps.emphasisLabelStyle":emphasisItemStyle"mapProps.emphasisItemStyle" :labelInfo"mapProps.labelInfo":rippleEffec…

leetCode 93.复原 IP 地址 + 回溯算法 + 图解 + 笔记

93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1…

信贷销售经理简历模板

这份简历内容&#xff0c;以信贷销售经理招聘需求为背景&#xff0c;我们制作了1份全面、专业且具有参考价值的简历案例&#xff0c;大家可以灵活借鉴。 信贷销售经理简历模板在线编辑下载&#xff1a;百度幻主简历 求职意向 求职类型&#xff1a;全职 意向岗位&#xff…

【隐私计算】VOLE (Vector Oblivious Linear Evaluation)学习笔记

近年来&#xff0c;VOLE&#xff08;向量不经意线性评估&#xff09;被用于构造各种高效安全多方计算协议&#xff0c;具有较低的通信复杂度。最近的CipherGPT则是基于VOLE对线性层进行计算。 1 VOLE总体设计 VOLE的功能如下&#xff0c;VOLE发送 Δ \Delta Δ和 b b b给send…

王者小游戏

游戏里的经验动物 Bear package beast; import sxt.GameFrame; public class Bear extends Beast {public Bear(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\辛欣\\OneDrive\\桌面\\王者荣耀图片(1)\\王者荣耀图片\\beast\\bear.jp…

从物理机到K8S:应用系统部署方式的演进及其影响

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 概述 随着科技的进步&#xff0c;软件系统的部署架构也在不断演进&#xff0c;从以前传统的物理机到虚拟机、Docker和Kubernetes&#xff0c;我们经历了一系列变化。 这些技术的引入…

liunx java 生成图片 中文显示不出来

使用java 生成图片,在图片上打的文字水印显示为一个方框,这种情况的原因,一般是liunx系统或者docker容器内,没有你在打文字水印时选择的字体 解决办法,先找一个免费的字体,比如 Alibaba-PuHuiTi-Regular.otf 然后使用字体 File newFileT new File("Alibaba-PuHuiTi-Re…

OSPF的8种状态机总结,小白必看!

OSPF概述 在OSPF网络中&#xff0c;为了交换路由信息&#xff0c;邻居设备之间首先要建立邻接关系&#xff0c;邻居&#xff08;Neighbors&#xff09;关系和邻接&#xff08;Adjacencies&#xff09;关系是两个不同的概念。 邻居关系 OSPF设备启动后&#xff0c;会通过OSPF…

Python streamlit指南,构建令人惊叹的可视化Web界面!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在当今数据驱动的世界中&#xff0c;构建交互式、美观且高效的数据可视化应用变得至关重要。而Streamlit&#xff0c;作为Python生态系统中为开发者提供了轻松创建Web应用的利器。 本文将深入探讨Streamlit的方…