ARM
文章平均质量分 87
tilblackout
score til you black out.
展开
-
位置无关码PIC详解:原理、动态链接库、代码重定位
本文解释了什么是位置无关代码,以及它如何帮助创建具有可共享只读文本段的共享库。位置无关代码(PIC)通过引入全局偏移表(GOT)和过程链接表(PLT)实现,解决了共享库加载时的重定位问题。GOT提供了数据和函数的间接引用,PLT实现了懒绑定,推迟函数地址的解析。当然这也伴随额外的内存加载和寄存器使用成本,但在权衡之下,现代的编译器都更倾向于使用PIC。原创 2024-01-23 07:00:00 · 3455 阅读 · 0 评论 -
ARM Cortex-A学习(3):MMU内存管理单元
本文大概地介绍了一下ARM中MMU的概念,主要是了解一下在Cortex-A核中有这样一个内存管理单元,它可以将虚拟地址转化为物理地址。对于具体地,内存是如何映射的,TLB表格是如何缓存的等知识,都与操作系统的实现有关,后续我们学到Linux再介绍。原创 2024-01-04 07:00:00 · 1741 阅读 · 1 评论 -
ARM Cortex-A学习(2):协处理器CP15详解
C0-C15,每组寄存器都包含多个寄存器。前面看到读写CP15寄存器有很多的参数,我们就可以通过提供不同的控制寄存器编号和操作码,来读取不同寄存器组下的不同寄存器。Functionc0c1c2c3Faultsc5/c6c7c8/c10c9L2 Controlc9c11Interruptsc12Process IDc13c15对于不同的Cortex-A核的不同ARM架构,CP15所包括的寄存器都会有一些区别,所以具体请查阅相关的ARM版本参考手册。下载地址。原创 2023-12-27 07:00:00 · 3014 阅读 · 0 评论 -
ARM Cortex-A学习(1):GIC(通用中断控制器)详解
GIC(通用中断控制器,)是一种用于处理中断的硬件组件,它的主要功能是协调和管理系统中的中断请求,确保它们被正确地传递给相应的处理器核心。原创 2023-12-26 07:00:00 · 2130 阅读 · 0 评论 -
ARM进阶:内存屏障(DMB/DSB/ISB)的20个使用例子详解
在ARM体系架构中,内存屏障是一种用来确保程序在多核或多线程环境下按照预期顺序执行的机制。ARM定义了三种内存屏障指令,分别是DMB(数据内存屏障)、DSB(数据同步屏障)和ISB(指令同步屏障)。DMB指令用于确保内存访问的顺序性。在多核处理器中,不同核的缓存可能会引起数据一致性的问题,DMB指令在多核之间添加屏障,确保指令的执行顺序与内存访问的顺序一致,避免数据的读写乱序。DSB指令用于确保指令的完成和数据的同步。它保证在DSB指令之前的所有指令都已经完成执行,然后再执行DSB指令之后的指令。原创 2023-08-04 00:25:45 · 4082 阅读 · 0 评论 -
ARM基础(6):内存屏障指令之DMB、DSB和ISB详解
本文详细说明了DMB、DSB和ISB三个指令的含义和使用时机。但大多数简单处理器不会对内存传输进行重新排序,因此,体系结构的需求和处理器的实现需求是不同的。例如,大多数应用程序可以在现有的Cortex-M处理器上正确运行,而无需使用任何内存屏障指令。原创 2023-07-30 22:59:34 · 9935 阅读 · 2 评论 -
ARM基础(5):内存屏障的必要性、内存类型和内存排序
Cortex-M处理器相对于指令流程从不执行乱序内存访问,当然,未来不一定会有改变。因此,针对ARMv7-M的代码如果要在ARMv7-AR处理器(如Cortex-A9)上可移植,必须已经考虑了上面的排序模型。在Cortex-M处理器中,内存类型与内存映射相关联。定义了一些体系结构区域,并为每个区域定义了预定义的内存类型。当实现了MPU时,还可以通过编程来更改一些内存类型的定义。在Cortex-M处理器上,可以使用MPU将SRAM定义为Device或。原创 2023-07-16 23:42:50 · 1135 阅读 · 0 评论 -
ARM基础(4):L1 Cache之I-Cache和D-cache详解
在上一篇文章中,我介绍了MPU,我们知道MPU允许按区域修改一级Cache的属性,这个Cache一般为L1 Cache,它位于CPU的内部,用来加快指令和数据的访问速度。同时,CPU在处理共享数据时需要确保CPU和主存之间的数据一致性。这篇文章就来详细介绍一下L1 Cache的概念和用法。原创 2023-06-12 01:58:14 · 6668 阅读 · 0 评论 -
ARM基础(3):MPU内存保护单元详解及例子
MPU是ARM处理器中的一个特性,它提供了内存保护和访问控制的功能,通常用于实现操作系统的内存隔离和保护。比如我们可以设置所有的RAM为不可执行,这样就可以避免代码注入攻击。最近做项目过程中,使用的几个Cortex核都用到了MPU,我发现MPU不仅仅起到一个内存保护的作用,它还和Cache有关,还能加快外接存储设备的访问速度。所以这篇文章就来详细地介绍一下MPU。原创 2023-06-11 16:23:32 · 6380 阅读 · 0 评论 -
FreeRTOS开启任务调度函数xPortStartScheduler详解
比如系统正在执行一个受FreeRTOS管理的中断且正在对一个信号量进行操作,此时产生了一个不受FreeRTOS管理的中断,在中断中也调用FreeRTOS信号量函数,那么有可能会使得之前中断保存的上下文并不是实际的上下文,从而产生错误。所以,上面的代码就是取出中断优先级为0的,即第一个用户中断优先级配置寄存器,然后往里面写0xFF来测试8位优先级是几位有效的。如果设置不对,可能导致本不能调用FreeRTOS函数的某优先级的中断可以调用FreeRTOS函数,从而导致某些错误,如信号量的不统一。原创 2023-05-16 22:03:55 · 2517 阅读 · 0 评论 -
FreeRTOS第一个任务的创建和调度详解(SVC异常)
在上一篇文章中,我详细分析了FreeRTOS中上下文切换:基于Cortex-M的RTOS上下文切换详解及FreeRTOS实例但是第一个任务没有上下文,它是怎么运行的呢?如果我们没有创建任务的话,系统也有一个空闲任务用来调度,这里不对这个进行分析。首先,我们知道指向当前运行任务的TCB,所以我们先看看哪里设置了,流程如下的大概逻辑如下:也就是说如果为空,则直接将新创建的任务赋值给,如果不为空且还没有开始任务调度,则判断当前创建任务的优先级是否比中任务的优先级高,若是则更改。接着就是任务调度了,来看看上电后原创 2022-12-07 11:44:30 · 2475 阅读 · 0 评论 -
基于Cortex-M的RTOS上下文切换详解及FreeRTOS实例
在了解上下文切换之前,肯定需要先了解MCU的架构才能知道如何实现上下文切换的功能,这里以Cortex-M为例进行分析。当MCU运行于异常处理回调函数,如ISR中时,MCU处于;其它时候MCU都处于。 系统内核可以在特权/非特权模式下运行,有一些特定的指令和操作只能在特权模式下运行。比如在非特权模式下,用户无法访问NVIC寄存器,而在下,内核总是处于特权模式;而在下,程序可以在特权/非特权模式下切换。只有当程序处于时,才能将中的非特权模式切换为特权模式。()定义的寄存器如下:(1) (Intr原创 2022-12-06 17:21:43 · 3854 阅读 · 1 评论 -
ARM基础(2):模式和特权等级(User/Thread mode和Privileged level)
Cortex-M3处理器支持两种模式和两种特权级别。如下图所示,当处理器运行于时,它可以处于或级别;而下,只能处于级别。当处理器复位完毕后,处于。在级别()下,访问系统控制区域(配置寄存器和调试组件)是阻塞的,对特殊寄存器的访问(如使用指令)也是不允许的(访问寄存器除外),否则会产生一个错误异常。处于级别时,软件可以通过寄存器将程序切换到级别。当产生一个异常时,处理器会切换到状态,而退出异常时,则会恢复进入异常之前的状态。用户程序不能直接通过写寄存器将状态切换为状态,而必须通过异常处理程序更改寄存器,原创 2022-12-06 10:43:26 · 2032 阅读 · 0 评论 -
ARM基础(1):Cortex-M3的核心寄存器和特殊寄存器
Cortex-M3处理器的寄存器包括R0~R15和一些特殊的寄存器。其中R0到R12是通用寄存器,但是一些16位的Thumb指令只能访问R0到R7(低寄存器),而32位的Thumb-2指令则可以访问所有这些寄存器。特殊寄存器只能通过特殊访问指令访问。所有的寄存器如下图所示:()定义的寄存器如下:这里主要介绍R13~R15寄存器是堆栈指针,在CM3中,有两个独立的堆栈内存,用户只能访问当前的堆栈,如果要访问另一个需要用特殊寄存器的和指令来进行操作。两种堆栈分别为:并不是两个堆栈都必须同时使用,对于简单的应用原创 2022-12-06 00:45:40 · 5952 阅读 · 1 评论 -
ARM异常处理(4):SVC和PendSV的作用详解
SVC和PendSV是针对软件和操作系统的两个异常。SVC用于生成系统函数调用,例如,用户程序不允许直接访问硬件,操作系统可以通过SVC提供对硬件的访问。因此,当用户程序想要使用某些硬件时,可以使用SVC指令,然后执行操作系统中的软件异常处理程序,并提供用户应用程序请求的服务。通过这种方式,对硬件的访问由操作系统控制,操作系统可以阻止用户应用程序直接访问硬件,从而提供更可靠的系统。SVC还可以使软件更具可移植性,因为用户程序不需要知道硬件的编程细节。用户程序只需要知道应用程序编程接口(API)函数I原创 2022-12-05 18:32:45 · 10678 阅读 · 4 评论 -
ARM异常处理(3):Bus faults、Memory management faults、Usage faults、Hard faults详解
之前介绍了了ARM异常处理(1):异常类型、优先级分组和异常向量表,里面有很多异常类型,其中有几个异常在错误处理中非常有用:当在AHB接口上传输期间收到错误响应时,就会产生。它可能发生在以下几个阶段:在Cortex-M3中,出现下面几种情况也会产生:如果没有使能的处理程序或总线错误发生在其它的比优先级高的异常的异常处理程序时,的中断处理函数会取代执行。如果在处理的过程中产生了另一个,则内核将会进入锁定状态。导致AHB错误响应的常见原因1、如何使能的处理程序?设置NVIC中的的位,在此之前,需要保证在中断向原创 2022-12-05 17:26:11 · 6871 阅读 · 0 评论 -
ARM异常处理(2):中断的输入和挂起的6种情况分析
本节将描述中断输入和挂起的分析,这也同样适用于NMI输入,NMI在大多数情况下都将立即执行,除非:已经在执行NMI中断处理程序、由调试器暂停或由于一些严重的系统错误导致芯片锁定。1、当一个中断输入时,它将被挂起,然后被置于等待处理器处理请求的状态,此时即使失能该中断源,挂起的中断最后仍会触发其相应的中断处理程序,而一旦中断处理程序开始执行,该挂起状态将被自动清除。2、但是,如果挂起状态在处理器开始响应挂起中断之前被清除(例如,因为/被设置为1,中断没有被立即执行,且挂起状态需要通过软件写NVIC中断原创 2022-12-05 14:14:43 · 991 阅读 · 0 评论 -
ARM异常处理(1):异常类型、优先级分组和异常向量表
Cortex-M3提供了一个功能丰富的异常体系结构,它支持很多系统异常和外部中断。异常编号1-15表示系统异常,16及以上表示外部中断输入。大多数异常具有可编程优先级,少数具有固定优先级。当前正在运行的异常可以通过特殊寄存器或者中的字段来查看。当一个使能的异常产生但不能被立即执行的时候(比如有一个更高优先级的中断服务程序正在处理),它会被挂起。原创 2022-12-05 13:40:23 · 2351 阅读 · 0 评论 -
ARM常用汇编指令
1、常用指令(1)LDR、STR、MOVLDR R0,[R1] #R0 = *R1,读取R1指向内存区域中的内容,存入R0STR R0,[R1] #*R1 = R0,将R0写入R1指向的内存区域MOV R0,R1 #R0 = R1MOV R0,#0X10 #R0 = 0x10LDR R0,=0X12345678 #R0 = 0x12345678 #没有等号的话就是将0x12345678指向内存的值取出放入R0 伪指令,所有指令是32位,但MOV不能一次赋32位的原创 2022-03-11 10:32:46 · 5065 阅读 · 0 评论 -
ARMv7和ARMv8架构比较
架构 处理器家族 芯片型号(三星) ARMv3 ARM6、ARM7 S3C44B0 ARMv4 StrongARM、ARM7TDMI、ARM9TDMI S3C2440/S3C2410 ARMv5 ARM7EJ、ARM9E、ARM10E、XScale ARMv6 ARM11、Cotex-M S3C6440 ARMv7 Cortex-M、Cortex-A、Cortex-R ARMv8 Corte..原创 2021-03-24 16:43:30 · 5054 阅读 · 0 评论