从0开始的IMX6ULL学习篇——裸机篇之分析粗略IMX6ULL与架构

news2025/5/14 14:15:44

目录

简单的说一下Cortex-A7架构

讨论ARMv7a-cortex系列的运行模式

寄存器

后言


让我们到NXP的官网上扫一眼。

i.MX 6ULL应用处理器_Arm® Cortex®-A7单核,频率为900 MHz | NXP 半导体

我们先看CPU Platform,这个是我们的核心。

这里我们的芯片是基于Arm Cortex-A7核心,这是一种高效能的处理器核心,适用于嵌入式应用。它支持32KB的指令缓存(I-Cache)和数据缓存(D-Cache),以及128KB的二级缓存(L2-Cache),这些缓存有助于提高数据处理速度。关于Cortex-A7手册可以自行到ARM架构的官网上找ARMv7a的手册慢慢看,

多媒体上,我们的这个芯片架构是支持24位并行CSI(摄像头接口)和LCD接口,以及S/PDIF Tx/Rx(数字音频接口)。至少,看,听,说交互是可行的。这一点在我们的上一篇介绍外设的时候就体现出来了。

外设连接上,支持:8个UART接口、4个SPI接口、2个FlexCAN接口、2个10/100以太网接口(ENET)、2个USB 2.0 OTG接口(带有PHY)、1个双通道Quad SPI接口和3个FS/SAI接口。显然这些常见的协议支持可以让我们玩很久很久的外设了(

电源管理上:系统包含LDO(低压差稳压器)和温度监控功能,有助于优化电源使用和系统稳定性。

安全性笔者不理解,这里就请出Deepseek帮我说:系统集成了多种安全功能,如AES-128加密、安全JTAG、安全RTC和随机数生成器(RNG)。这些功能有助于保护系统免受未经授权的访问和数据泄露。

外部存储器上,我们的系统支持非常的多的外部存储器接口,如eMMC 4.5、NAND控制器、并行NOR闪存和16位LP-DDR2/DDR3/DDR3L内存。内部存储器包括96KB ROM和128KB RAM,为系统提供了足够的存储空间。

当然,其他部分就是可编程处理引擎、多个定时器、看门狗定时器、PWM输出、GPIO接口、ADC(模数转换器)和ASRC(异步采样率转换器)。这些功能增强了系统的灵活性和可配置性,适用于多种应用场景。

可见芯片功能还是非常的NB的。

简单的说一下Cortex-A7架构

我们的IMX6ULL本身还是使用的是Armv7-A在嵌入式中特化的低功耗(或者说高功耗利用率)的架构。在我们的Cortex-A7技术手册中的第一小节About the Cortex-A7 MPCore processor中,就简单的介绍了一下这个架构的一些涉及理念。

可以看到,多个处理器拥有自己的私有的指令缓存和数据缓存。缓存我们知道,就是减少了处理器访问内存拿取数据的次数。这样,我们节约的时间将会有效的减少流水线堵塞时间。

这个架构的诞生之初起始是ARM想要设计一个大小核的处理器,大核,也就是A15用于做高性能,A7则是小核,处理那些低功耗就能完成的任务。

你马上就会发问了:每一个处理器都是只有私有的数据和指令缓存。假设我一个任务:第一次部署的时候发给了CPU1,CPU2等跑,且需要共享一部分内存的数据,之后我们其中一个CPU向共享数据里写了数据,其他的没有,那么,这不就出现了缓存不一致,我们咋保证程序的运行结果是确定的呢?

答案就是下半部分的Snoop Control Unit(SCU,侦听控制单元),它是计算机体系结构中的一个重要组件,主要用于多核处理器系统中,管理多个处理器核心之间的缓存一致性(Cache Coherency)。在多核系统中,每个核心通常都有自己的缓存(Cache),当多个核心访问共享内存时,可能会出现缓存不一致的问题。SCU的作用就是确保所有核心的缓存数据保持一致。

熟悉架构的朋友马上就想到了一个经典的协议:MESI协议:Modified, Exclusive, Shared, Invalid,我们这里不去做太详细的说明,知道这个协议保证了“缓存一致性”,这样无论如何都不会在架构层次出现数据不统一的问题。

SCU的可以实现这个功能,依赖于侦听(Snooping):SCU会监听总线上的所有内存访问请求。当某个核心试图修改共享数据时,SCU会通知其他核心,使它们更新或无效化相关的缓存数据。就是这样的原理!

讨论ARMv7a-cortex系列的运行模式

我们回忆一下,Intel的老式处理器是分为了四个运行模式:分别是特权级0~3。在不同的特权级下,处理器可以执行不同的代码。

ARM的就显得非常的丰富多彩了,我们给不同场景分配了非常多的模式。

ModeEncodingFunctionSecurity statePrivilege level
User (USR)10000Unprivileged mode in which most applications runBothPL0
FIQ10001Entered on an FIQ interrupt exceptionBothPL1
IRQ10010Entered on an IRQ interrupt exceptionBothPL1
Supervisor (SVC)10011Entered on reset or when a Supervisor Call instruction (SVC) is executedBothPL1
Monitor (MON)10110Implemented with Security Extensions. See Chapter 21Secure onlyPL1
Abort (ABT)10111Entered on a memory access exceptionBothPL1
Hyp (HYP)11010Implemented with Virtualization Extensions. See Chapter 22Non-securePL2
Under (UND)11011Entered when an undefined instruction executedBothPL1
System (SYS)11111Privileged mode, sharing the register view with User modeBothPL1
模式编码功能安全状态特权级别
用户 (USR)10000大多数应用程序运行的无特权模式两者PL0
FIQ10001在FIQ中断异常时进入两者PL1
IRQ10010在IRQ中断异常时进入两者PL1
超级用户 (SVC)10011在复位或执行超级用户调用指令 (SVC) 时进入两者PL1
监视器 (MON)10110使用安全扩展实现。仅安全PL1
中止 (ABT)10111在内存访问异常时进入两者PL1
Hyp (HYP)11010使用虚拟化扩展实现非安全PL2
未定义 (UND)11011在执行未定义指令时进入两者PL1
系统 (SYS)11111特权模式,与用户模式共享寄存器视图两者PL1

除了 User(USR)用户模式以外,其它8 种运行模式都是特权模式。这几个 运行模式可以通过软件进行任意切换,也可以通过中断或者异常来进行切换。大多数的程序都运行在用户模式,用户模式下是不能访问系统所有资源的,有些资源是受限的,要想访问这些 受限的资源就必须进行模式切换。但是用户模式是不能直接进行切换的用户模式下需要借助异常来完成模式切换,当要切换模式的时候,应用程序可以产生异常,在异常的处理过程中完 成处理器模式切换。 当中断或者异常发生以后,处理器就会进入到相应的异常模式,每一种模式都有一组寄 存器供异常处理程序使用,这样的目的是为了保证在进入异常模式以后,用户模式下的寄存器 不会被破坏。(这一点,Intel的80386架构是通过压栈和弹栈实现的)

寄存器

回忆我们学习Intel架构的时候,我们肯定会去学寄存器,经典的x86的寄存器实在是相当可怜的少,只有8个寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP和ESP。对比看来,ARM架构简直就是富豪

寄存器名称/功能描述
R0通用寄存器
R1通用寄存器
R2通用寄存器
R3通用寄存器
R4通用寄存器
R5通用寄存器
R6通用寄存器
R7通用寄存器
R8通用寄存器
R9通用寄存器
R10通用寄存器
R11通用寄存器
R12通用寄存器
R13 (SP)堆栈指针
R14 (LR)链接寄存器
R15 (PC)程序计数器
CPSR当前程序状态寄存器
SPSR备份程序状态寄存器(有些运行模式下没有)

注意到的是:每一个模式下都是一个独立的寄存器的视图。这个视图下,蓝色部分的是这个模式独有的。FIQ 模式下 R8~R14 是独立的物理寄 存器。假如某个程序在 FIQ 模式下访问 R13 寄存器,那它实际访问的是寄存器 R13_fiq,如果 程序处于 SVC 模式下访问 R13 寄存器,那它实际访问的是寄存器 R13_svc。

所有的处理器模式都共用一个 CPSR 物理寄存器,因此 CPSR 可以在任何模式下被访问。CPSR 是当前程序状态寄存器,该寄存器包含了条件标志位、中断禁止位、当前处理器模式标志 等一些状态位以及一些控制位。

所有的处理器模式都共用一个 CPSR 必然会导致冲突,为此, 除了 User 和Sys 这两个模式以外,其他7 个模式每个都配备了一个专用的物理状态寄存器,叫 做 SPSR(备份程序状态寄存器),当特定的异常中断发生时,SPSR 寄存器用来保存当前程序状 态寄存器(CPSR)的值,当异常退出以后可以用 SPSR 中保存的值来恢复 CPSR。 因为 User 和 Sys 这两个模式不是异常模式,所以并没有配备 SPSR,因此不能在 User 和 Sys 模式下访问 SPSR,会导致不可预知的结果。由于 SPSR 是 CPSR 的备份,因此 SPSR 和 CPSR 的寄存器结构相同

位范围位名称描述
31N负标志位(Negative flag)。当结果为负数时置1。
30Z零标志位(Zero flag)。当结果为零时置1。
29C进位标志位(Carry flag)。当操作产生进位时置1。
28V溢出标志位(Overflow flag)。当操作产生溢出时置1。
27Q饱和标志位(Saturation flag)。当发生饱和时置1。
26-25IT[1:0]If-Then 状态位的一部分,用于Thumb指令集的条件执行。(此位通常和T(bit5)位一起表示当前所使用的指令集)
24JJazelle 状态位。用于指示处理器是否处于Jazelle状态。
23-20Reserved保留位,未使用。
19-16GE[3:0]大于或等于标志位(Greater than or Equal flags)。用于SIMD指令集。
15-10IT[7:2]If-Then 状态位的剩余部分,用于Thumb指令集的条件执行。
9E端序控制位(Endianness bit)。0表示小端序,1表示大端序。
8A异步中止屏蔽位(Asynchronous abort mask bit)。
7IIRQ 中断屏蔽位(IRQ interrupt mask bit)。
6FFIQ 中断屏蔽位(FIQ interrupt mask bit)。
5T状态位(State bit)。0表示ARM状态,1表示Thumb状态。
4-0M[4:0]模式位(Mode bits)。用于指示当前处理器模式。

后言

对了,这里必须说一下,我们马上进行裸机编程要,所以,就不得不理解一下,IMX6ULL是如何完成对寄存器命名的,不然我们连找寄存器都没地方找。

简单的说:SW_MUX_CTL_PAD_*负责设置管脚使用什么复用功能,SW_PAD_CTL_PAD_*用来设置管脚的属性,比如在输出时什么属性,输入时什么属性。

比如说我们的SW_MUX_CTL_PAD_BOOT_MODE0寄存器表达了实际上的外设功能。比如说这里就是一个BOOT0模式的选择。我们注意到还有一个SW_PAD_CTL_PAD_BOOT_MODE0。这个更有意思,他是控制我们的SW_MUX_CTL_PAD_BOOT_MODE0的行为的。所以说,实际上我们每一个逻辑寄存器几乎都被分成两个物理寄存器。一个做事,一个管做事的咋做事。

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

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

相关文章

面向实时性的超轻量级动态感知视觉SLAM系统

一、重构后的技术架构设计(基于ROS1 ORB-SLAM2增强) #mermaid-svg-JEJte8kZd7qlnq3E {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JEJte8kZd7qlnq3E .error-icon{fill:#552222;}#mermaid-svg-JEJte8kZd7qlnq3E .…

C#贪心算法

贪心算法:生活与代码中的 “最优选择大师” 在生活里,我们常常面临各种选择,都希望能做出最有利的决策。比如在超市大促销时,面对琳琅满目的商品,你总想用有限的预算买到价值最高的东西。贪心算法,就像是一…

SQL命令详解之数据的查询操作

目录 1 简介 2 基础查询 2.1 基础查询语法 2.2 基础查询练习 3 条件查询 3.1 条件查询语法 3.2 条件查询练习 4 排序查询 4.1 排序查询语法 4.2 排序查询练习 5 聚合函数 5.1 一般语法: 5.2 聚合函数练习 6 分组查询 6.1 分组查询语法 6.2 分组查询…

序列化选型:字节流抑或字符串

序列化既可以将对象转换为字节流,也可以转换为字符串,具体取决于使用的序列化方式和场景。 转换为字节流 常见工具及原理:在许多编程语言中,都有将对象序列化为字节流的机制。例如 Python 中的 pickle 模块、Java 中的对象序列化…

使用C#控制台调用本地部署的DeepSeek

1、背景 春节期间大火的deepseek,在医疗圈也是火的不要不要的。北京这边的医院也都在搞“deepseek竞赛”。友谊、北医三院等都已经上了,真是迅速啊! C#也是可以进行对接,并且非常简单。 2、具体实现 1、使用Ollama部署DeepSeek…

Windows对比MacOS

Windows对比MacOS 文章目录 Windows对比MacOS1-环境变量1-Windows添加环境变量示例步骤 1:打开环境变量设置窗口步骤 2:添加系统环境变量 2-Mac 系统添加环境变量示例步骤 1:打开终端步骤 2:编辑环境变量配置文件步骤 3&#xff1…

开源绝版经典小游戏合集

随着生活节奏的日益加快,我们常常需要一些小游戏来缓解疲惫的身心。过去,Windows 7自带的扫雷、蜘蛛纸牌等小游戏深受大家喜爱,但随着系统的更新换代,这些经典游戏逐渐淡出了人们的视野。我也曾花费不少时间寻找这些游戏&#xff…

给虚拟机配置IP

虚拟机IP这里一共有三个地方要设置,具体说明如下: (1)配置vm虚拟机网段 如果不进行设置,每次启动机器时都可能是随机的IP,不方便我们后续操作。具体操作是:点击编辑→虚拟网络编辑器 选择VMne…

YOLOv12以注意力机制为核心的架构:主要特点、创新点、使用方法

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

GD32F450 使用

GB32F450使用 1. 相关知识2. 烧写程序3. SPI3.1 spi基础3.2 spi代码 4. 串口4.1 串口引脚4.2 串口通信代码 问题记录1. 修改晶振频率 注意:GD32F450 总共有三种封装形式,本文所述的相关代码和知识,均为 GD32F450IX 系列。 1. 相关知识 参数配…

Linux 动静态库和_make_进度条(一)

文章目录 一、如何理解条件编译二、动静态库1. 理论2. 实践3. 解决普通用户的sudo问题4. 技术上理解库 三、make和make_file 一、如何理解条件编译 1. gcc code.c -o code -DM 命令行级别的宏定义预处理的本质就是修改编辑我们的文本代码 头文件展开到源文件中去注释宏替换条…

Android 图片压缩详解

在 Android 开发中,图片压缩是一个重要的优化手段,旨在提升用户体验、减少网络传输量以及降低存储空间占用。以下是几种主流的图片压缩方法,结合原理、使用场景和优缺点进行详细解析。 效果演示 直接先给大家对比几种图片压缩的效果 质量压缩 质量压缩:根据传递进去的质…

LLM中的Benchmark是什么

LLM中的Benchmark是什么 “DeepSeek推动价值重估Benchmark” DeepSeek这家公司或其相关技术的发展,促使Benchmark这家机构对相关资产或企业的价值进行重新评估。“Benchmark”在这里是一家研究机构或金融分析机构。 “Benchmark”常见的意思是“基准;水准点,基准点”,作…

梯度下降法(Gradient Descent) -- 现代机器学习的血液

梯度下降法(Gradient Descent) – 现代机器学习的血液 梯度下降法是现代机器学习最核心的优化引擎。本文从数学原理、算法变种、应用场景到实践技巧,用三维可视化案例和代码实现揭示其内在逻辑,为你构建完整的认知体系。 优化算法 一、梯度下降法的定义…

微服务学习(2):实现SpringAMQP对RabbitMQ的消息收发

目录 SpringAMQP是什么 为什么采用SpringAMQP SpringAMQP应用 准备springBoot工程 实现消息发送 SpringAMQP是什么 Spring AMQP是Spring框架下用于简化AMQP(高级消息队列协议)应用开发的一套工具集,主要针对RabbitMQ等消息中间件的集成…

StarRocks 在爱奇艺大数据场景的实践

作者:林豪,爱奇艺大数据 OLAP 服务负责人 小编导读: 本文整理自爱奇艺工程师在 StarRocks 年度峰会的分享,介绍了爱奇艺 OLAP 引擎演化及引入 StarRocks 后的效果。 在广告业务中,StarRocks 替换 ImpalaKudu 后&#x…

JAVA入门——IO流

一、了解File类 这个类里面提供了一些文件相关的方法,了解即可,方法有很多,不好背下面这个是最常用的只能对文件本身操作,不能读取数据 public File[] listFiles();//获取当前路径下的所有内容 注意:如果是需要权限才…

Spring Boot 流式响应豆包大模型对话能力

当Spring Boot遇见豆包大模型:一场流式响应的"魔法吟唱"仪式 一、前言:关于流式响应的奇妙比喻 想象一下你正在火锅店点单,如果服务员必须等所有菜品都备齐才一次性端上来,你可能会饿得把菜单都啃了。而流式响应就像贴…

【多模态】Magma多模态AI Agent

1. 前言 微软杨建伟团队,最近在AI Agent方面动作连连,前两天开源了OmniParser V2,2月26日又开源了Magma,OmniParser专注在对GUI的识别解析,而Magma则是基于多模态技术,能够同时应对GUI和物理世界的交互&…

DeepSeek掘金——DeepSeek R1驱动的PDF机器人

DeepSeek掘金——DeepSeek R1驱动的PDF机器人 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人。逐步学习如何增强AI检索能力,并创建一个能够高效处理和响应文档查询的智能聊天机器人。 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人…