惊落一身雪 发表于 2025-4-7 22:50:58

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

目次

简朴的说一下Cortex-A7架构
讨论ARMv7a-cortex系列的运行模式
寄存器
后言
让我们到NXP的官网上扫一眼。
   i.MX 6ULL应用处理器_Arm® Cortex®-A7单核,频率为900 MHz | NXP 半导体
https://i-blog.csdnimg.cn/direct/7df283e74a6b49bdbddb5542092023b9.png
我们先看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中,就简朴的介绍了一下这个架构的一些涉及理念。
https://i-blog.csdnimg.cn/direct/d06e689fb6354f968ede58d145ce3538.png
可以看到,多个处理器拥有自己的私有的指令缓存和数据缓存。缓存我们知道,就是减少了处理器访问内存拿取数据的次数。这样,我们节约的时间将会有效的减少流水线堵塞时间。
这个架构的诞生之初起始是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 levelUser (USR)10000Unprivileged mode in which most applications runBothPL0FIQ10001Entered on an FIQ interrupt exceptionBothPL1IRQ10010Entered on an IRQ interrupt exceptionBothPL1Supervisor (SVC)10011Entered on reset or when a Supervisor Call instruction (SVC) is executedBothPL1Monitor (MON)10110Implemented with Security Extensions. See Chapter 21Secure onlyPL1Abort (ABT)10111Entered on a memory access exceptionBothPL1Hyp (HYP)11010Implemented with Virtualization Extensions. See Chapter 22Non-securePL2Under (UND)11011Entered when an undefined instruction executedBothPL1System (SYS)11111Privileged mode, sharing the register view with User modeBothPL1 模式编码功能安全状态特权级别用户 (USR)10000大多数应用步伐运行的无特权模式两者PL0FIQ10001在FIQ停止非常时进入两者PL1IRQ10010在IRQ停止非常时进入两者PL1超等用户 (SVC)10011在复位或执行超等用户调用指令 (SVC) 时进入两者PL1监视器 (MON)10110使用安全扩展实现。仅安全PL1中止 (ABT)10111在内存访问非常时进入两者PL1Hyp (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架构简直就是富豪
https://i-blog.csdnimg.cn/direct/81b1b5a4f03e45f8a9adb62653e6454e.png
寄存器名称/功能描述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 的寄存器布局类似
https://i-blog.csdnimg.cn/direct/611d4aa12d2644989ef5ccca866378e9.png
位范围位名称描述31N负标志位(Negative flag)。当结果为负数时置1。30Z零标志位(Zero flag)。当结果为零时置1。29C进位标志位(Carry flag)。当操作产生进位时置1。28V溢出标志位(Overflow flag)。当操作产生溢出时置1。27Q饱和标志位(Saturation flag)。当发生饱和时置1。26-25ITIf-Then 状态位的一部门,用于Thumb指令集的条件执行。(此位通常和T(bit5)位一起表示当前所使用的指令集)24JJazelle 状态位。用于指示处理器是否处于Jazelle状态。23-20Reserved保留位,未使用。19-16GE大于或便是标志位(Greater than or Equal flags)。用于SIMD指令集。15-10ITIf-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模式位(Mode bits)。用于指示当前处理器模式。 后言

对了,这里必须说一下,我们立刻进行裸机编程要,所以,就不得不理解一下,IMX6ULL是如何完成对寄存器命名的,不然我们连找寄存器都没地方找。
简朴的说:SW_MUX_CTL_PAD_*负责设置管脚使用什么复用功能,SW_PAD_CTL_PAD_*用来设置管脚的属性,比如在输出时什么属性,输入时什么属性。
https://i-blog.csdnimg.cn/direct/291786be3472483ba21cbd2bd4582945.png
比如说我们的SW_MUX_CTL_PAD_BOOT_MODE0寄存器表达了实际上的外设功能。比如说这里就是一个BOOT0模式的选择。我们留意到还有一个SW_PAD_CTL_PAD_BOOT_MODE0。这个更故意思,他是控制我们的SW_MUX_CTL_PAD_BOOT_MODE0的行为的。所以说,实际上我们每一个逻辑寄存器险些都被分成两个物理寄存器。一个办事,一个管办事的咋办事。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 从0开始的IMX6ULL学习篇——裸机篇之分析粗略IMX6ULL与架构