从0开始的IMX6ULL学习篇——裸机篇之分析粗略IMX6ULL与架构
目录
简单的说一下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的就显得非常的丰富多彩了,我们给不同场景分配了非常多的模式。
| Mode | Encoding | Function | Security state | Privilege level |
|---|---|---|---|---|
| User (USR) | 10000 | Unprivileged mode in which most applications run | Both | PL0 |
| FIQ | 10001 | Entered on an FIQ interrupt exception | Both | PL1 |
| IRQ | 10010 | Entered on an IRQ interrupt exception | Both | PL1 |
| Supervisor (SVC) | 10011 | Entered on reset or when a Supervisor Call instruction (SVC) is executed | Both | PL1 |
| Monitor (MON) | 10110 | Implemented with Security Extensions. See Chapter 21 | Secure only | PL1 |
| Abort (ABT) | 10111 | Entered on a memory access exception | Both | PL1 |
| Hyp (HYP) | 11010 | Implemented with Virtualization Extensions. See Chapter 22 | Non-secure | PL2 |
| Under (UND) | 11011 | Entered when an undefined instruction executed | Both | PL1 |
| System (SYS) | 11111 | Privileged mode, sharing the register view with User mode | Both | PL1 |
| 模式 | 编码 | 功能 | 安全状态 | 特权级别 |
|---|---|---|---|---|
| 用户 (USR) | 10000 | 大多数应用程序运行的无特权模式 | 两者 | PL0 |
| FIQ | 10001 | 在FIQ中断异常时进入 | 两者 | PL1 |
| IRQ | 10010 | 在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 的寄存器结构相同

| 位范围 | 位名称 | 描述 |
|---|---|---|
| 31 | N | 负标志位(Negative flag)。当结果为负数时置1。 |
| 30 | Z | 零标志位(Zero flag)。当结果为零时置1。 |
| 29 | C | 进位标志位(Carry flag)。当操作产生进位时置1。 |
| 28 | V | 溢出标志位(Overflow flag)。当操作产生溢出时置1。 |
| 27 | Q | 饱和标志位(Saturation flag)。当发生饱和时置1。 |
| 26-25 | IT[1:0] | If-Then 状态位的一部分,用于Thumb指令集的条件执行。(此位通常和T(bit5)位一起表示当前所使用的指令集) |
| 24 | J | Jazelle 状态位。用于指示处理器是否处于Jazelle状态。 |
| 23-20 | Reserved | 保留位,未使用。 |
| 19-16 | GE[3:0] | 大于或等于标志位(Greater than or Equal flags)。用于SIMD指令集。 |
| 15-10 | IT[7:2] | If-Then 状态位的剩余部分,用于Thumb指令集的条件执行。 |
| 9 | E | 端序控制位(Endianness bit)。0表示小端序,1表示大端序。 |
| 8 | A | 异步中止屏蔽位(Asynchronous abort mask bit)。 |
| 7 | I | IRQ 中断屏蔽位(IRQ interrupt mask bit)。 |
| 6 | F | FIQ 中断屏蔽位(FIQ interrupt mask bit)。 |
| 5 | T | 状态位(State bit)。0表示ARM状态,1表示Thumb状态。 |
| 4-0 | M[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的行为的。所以说,实际上我们每一个逻辑寄存器几乎都被分成两个物理寄存器。一个做事,一个管做事的咋做事。
相关文章:
从0开始的IMX6ULL学习篇——裸机篇之分析粗略IMX6ULL与架构
目录 简单的说一下Cortex-A7架构 讨论ARMv7a-cortex系列的运行模式 寄存器 后言 让我们到NXP的官网上扫一眼。 i.MX 6ULL应用处理器_Arm Cortex-A7单核,频率为900 MHz | NXP 半导体 我们先看CPU Platform,这个是我们的核心。 这里我们的芯片是基于Ar…...
面向实时性的超轻量级动态感知视觉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 .…...
Hue UI展示中文
个人博客地址:Hue UI展示中文 | 一张假钞的真实世界 如果使用开发分支代码如master分支)编译安装,需要自己编译语言文件。例如Hue安装目录为“/opt/hue”,则安装后执行以下命令: $ cd /opt/hue $ make locales 如果…...
C#贪心算法
贪心算法:生活与代码中的 “最优选择大师” 在生活里,我们常常面临各种选择,都希望能做出最有利的决策。比如在超市大促销时,面对琳琅满目的商品,你总想用有限的预算买到价值最高的东西。贪心算法,就像是一…...
【新人系列】Python 入门专栏合集
✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…...
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…...
Linux环境安装Nginx及版本升级指南
Linux环境安装Nginx及版本升级指南 一、安装Nginx 1. 安装前准备 # 更新系统软件包(Ubuntu/Debian) sudo apt update && sudo apt upgrade -y# CentOS/RHEL sudo yum update -y2. 安装依赖库 # Ubuntu/Debian sudo apt install -y curl wget…...
选开源CMS建站系统时,插件越多越好吗?
在选择开源CMS建站系统时,插件数量并不是唯一的衡量标准,更不能简单地说“插件越多就越好”,还是需要综合评估来考虑选择结果,以下是有关选择开源CMS系统时对插件数量的考量。 插件数量的优势插件数量可能带来的问题功能丰富性&a…...
Windows对比MacOS
Windows对比MacOS 文章目录 Windows对比MacOS1-环境变量1-Windows添加环境变量示例步骤 1:打开环境变量设置窗口步骤 2:添加系统环境变量 2-Mac 系统添加环境变量示例步骤 1:打开终端步骤 2:编辑环境变量配置文件步骤 3࿱…...
使用 Python 实现基于 AGA8 GERG - 2008 方程计算掺氢天然气压缩因子的示例代码
AGA8 GERG - 2008 方程是用于计算天然气混合物热力学性质的一种方法,下面是一个使用 Python 实现基于 AGA8 GERG - 2008 方程计算掺氢天然气压缩因子的示例代码。需要注意的是,AGA8 GERG - 2008 方程非常复杂,完整实现需要大量的系数和详细的…...
开源绝版经典小游戏合集
随着生活节奏的日益加快,我们常常需要一些小游戏来缓解疲惫的身心。过去,Windows 7自带的扫雷、蜘蛛纸牌等小游戏深受大家喜爱,但随着系统的更新换代,这些经典游戏逐渐淡出了人们的视野。我也曾花费不少时间寻找这些游戏ÿ…...
给虚拟机配置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 开发中,图片压缩是一个重要的优化手段,旨在提升用户体验、减少网络传输量以及降低存储空间占用。以下是几种主流的图片压缩方法,结合原理、使用场景和优缺点进行详细解析。 效果演示 直接先给大家对比几种图片压缩的效果 质量压缩 质量压缩:根据传递进去的质…...
C# 牵手DeepSeek:打造本地AI超能力
一、引言 在人工智能飞速发展的当下,大语言模型如 DeepSeek 正掀起新一轮的技术变革浪潮,为自然语言处理领域带来了诸多创新应用。随着数据隐私和安全意识的提升,以及对模型部署灵活性的追求,本地部署 DeepSeek 成为众多开发者和…...
普通人高效使用DeepSeek指南?
李升伟 整理 DeepSeek(深度求索)作为一款智能搜索引擎或AI工具,普通人可以通过以下方式高效利用它,提升学习、工作和生活效率: --- ### **一、基础功能:精准搜索** 1. **明确需求提问** 用自然语言…...
卢卡斯定理判断组合数奇偶(Codeforces Round 1006 (Div. 3)——F)
文章目录 组合数奇偶判断题意思路综上 组合数奇偶判断 【用杨辉三角阐释Lucas定理】https://www.bilibili.com/video/BV14F411P7ES?vd_source67186f29c3efb728bcff34035cf5aba2 这个视频可以简单的领会一下精神,卢卡斯定理也就是用于组合数取模。 奇偶性通过对2…...
ECharts组件封装教程:Vue3中的实践与探索
在日常的前端开发中,ECharts 作为一款强大且易用的图表库,被广泛应用于数据可视化场景。为了更好地在 Vue3 项目中复用 ECharts 功能,我们可以将其封装成一个组件。本文将带大家一步步实现 ECharts 的 Vue3 组件封装,并演示如何在父组件中调用和使用。 一、封装 ECharts 组…...
LLM中的Benchmark是什么
LLM中的Benchmark是什么 “DeepSeek推动价值重估Benchmark” DeepSeek这家公司或其相关技术的发展,促使Benchmark这家机构对相关资产或企业的价值进行重新评估。“Benchmark”在这里是一家研究机构或金融分析机构。 “Benchmark”常见的意思是“基准;水准点,基准点”,作…...
【新加坡】软件工程师工签政策、求职指南
文章目录 关键要点就业准证要求求职平台注意事项详细报告就业准证(EP)要求求职平台与投递渠道注意事项与求职建议表格:求职平台对比额外考虑关键引用 关键要点 去新加坡工作需要申请就业准证(EP),通常要求…...
梯度下降法(Gradient Descent) -- 现代机器学习的血液
梯度下降法(Gradient Descent) – 现代机器学习的血液 梯度下降法是现代机器学习最核心的优化引擎。本文从数学原理、算法变种、应用场景到实践技巧,用三维可视化案例和代码实现揭示其内在逻辑,为你构建完整的认知体系。 优化算法 一、梯度下降法的定义…...
CMake宏定义管理:如何优雅处理第三方库的宏冲突
在C/C项目开发中,我们常常会遇到这样的困境: 当引入一个功能强大的第三方库时,却发现它定义的某个宏与我们的项目产生冲突。比如: 库定义了 BUFFER_SIZE 1024,而我们需要 BUFFER_SIZE 2048库内部使用 DEBUG 宏控制日志…...
【计算机网络】常见tcp/udp对应的应用层协议,端口
TCP 和 UDP 对应的常见应用层协议 📌 基于 TCP 的应用层协议 协议全称用途默认端口HTTPHyperText Transfer Protocol超文本传输协议80HTTPSHTTP Secure加密的超文本传输协议443FTPFile Transfer Protocol文件传输协议(20 传输数据,21 控制连…...
微服务学习(2):实现SpringAMQP对RabbitMQ的消息收发
目录 SpringAMQP是什么 为什么采用SpringAMQP SpringAMQP应用 准备springBoot工程 实现消息发送 SpringAMQP是什么 Spring AMQP是Spring框架下用于简化AMQP(高级消息队列协议)应用开发的一套工具集,主要针对RabbitMQ等消息中间件的集成…...
《操作系统 - 清华大学》 9 -2:进程调度:调度原则
进程调度策略:原则、指标与权衡 在计算机系统中,进程调度策略至关重要。我们讲的就是有不同的这种调度策略,那么调度的原则是什么呢?原则就是选择某一个进程执行的依据,即要基于什么样的标准来挑选最合适的进程去执行…...
CSS—选择器详解:5分钟动手掌握选择器
个人博客:haichenyi.com。感谢关注 1. 目录 1–目录2–引言3–种类4–优先级 引言 什么是选择器? CSS选择器是CSS(层叠样式表)中的一种规则,用于指定要应用样式的HTML元素。它们就像是指向网页中特定元素的指针&#…...
