从单片机转到ARM,首要需求学习ARM的架构,ARM比较单片机多了一些外设和总线。在仅仅是裸奔的状况下,假如了解了ARM架构,那么我以为运用任何ARM架构的芯片和用单片机将没有差异。ARM架构之所以更杂乱,当然是为了跑更快以及更好地支撑片上体系,所以在某种程度上来说对片上体系不是很了解的话那关于ARM架构的了解也不会那么深。
通用寄存器
R13一般被用作栈指针,进入反常形式时,能够将需求运用的寄存器保存在R13所指的栈中;当退出反常吹程序时,将保存在R13所指的栈中的寄存器值弹出。
R14又被称为衔接寄存器(LinkRegister,LR),即PC的返回值。
R15又被记作PC。ARM指令是字对齐的,PC的值的第0位和第1位总为0。也便是说是32位对齐。
就Cortex-M3来说,具有R0-R15的寄存器组。其间R13作为仓库指针SP。SP有两个,分别为R13(MSP)和R13(PSP)即主仓库指针(MSP)和进程仓库指针(PSP),但在同一时间只能有一个能够看到,这也便是所谓的“banked”寄存器。这些寄存器都是32位的。
ARM的各个形式
ARM有以下7种形式:
用户形式(User,usr) 正常程序履行的形式
快速间断形式(FIQ,fiq) 用于高速数据传输和通道处理
外部间断形式(IRQ,irq) 用于一般的间断处理
特权形式(Supervisor,svc) 供操作体系运用的一种维护形式
数据拜访间断形式(Abort,abt) 用于虚拟存储及存储维护
未定义指令间断形式(Undefined,und) 用于支撑经过软件政策硬件的协处理器
体系形式(System,sys) 用于运转特权级的操作体系使命
其间除了用户形式之外都称之为特权形式(privileged modes),而在privileged modes中除了体系形式其它都称为反常形式,即exception mode。起先关于反常这个词我的了解有些误差,我以为反常形式便是这个体系出错了,而实际上不是。exception mode的意思是破例,意思是“这形式什么时分会产生不好说……”,比方说来了个外部间断也会进入反常形式,可是此刻体系是运转无缺的。
其间SVC用于在体系刚发动的发动文件BOOT程序中,跳转到kernel之前有必要为SVC,SVC具有最高权限,能够对任何寄存器进行操作。在裸机程序中咱们有时分会一向处于SVC形式下。
关于什么时分会进入用户形式或许体系形式,以下是我的猜想,比方进入linux kernel之后会设置成sys形式,比方使命调度等等都会在sys形式中,而履行用户编写的应用程序时,体系是处于usr形式中。以上猜想需求在linux中找出依据验证。
其间FIQ,IRQ为间断形式,有间断产生时会进入FIQ形式或许IRQ形式,至于到底是进入哪个形式是由开发者设定的。理论上FIQ形式的响应速度比IRQ形式要快。
其间abt形式一般产生于在拜访地址没有对齐时的状况,此刻会跳转到abt所属的间断向量地址中去。und形式应该是取到指令之后发现指令不能用,,此刻会跳转到abt所属的间断向量地址中去。以上两种形式应该是开发过程中呈现BUG才会进入的,也是一种调试手法,在版别发行之前应该消除这些过错(我猜= =)。
发动文件
这一部分只需了解一下协处理器CP15的相关效果以及ARM或许THUMB汇编再看一下网上的例程以及解说应该不难了解。
在发动文件中咱们能够做任何事情,可是一般咱们能够做这些:改动程序巨细端排序,封闭看门狗,屏蔽间断,设置各个时钟,设置从SLEEP或许IDLE发动时的程序,初始化SDRAM,设置各形式指向的仓库,设置好间断向量表,判别是从NOR仍是NAND FLASH发动,将文件拷到SDRAM中,运转Main。
以上也说明晰为什么需求一个汇编写的发动文件,设置各个形式下的SP指针以及初始化间断向量的跳转(ARM的间断较多设置也较灵敏)也只要汇编干比较适宜了。甚至在SOC(片上体系)中每个使命都有自己的仓库,所以改动仓库指针的那一部分程序也是放在汇编里做的。总归了解发动文件是一个非常好的切入点。
MMU相关地址基本概念
关于MMU,由于多种存储设备的物理地址不同以及不连贯性,将其地址安放在合理的接连虚拟地址上是很必要的,所以MMU呈现了。MMU行将不同的地址放在适宜的虚拟地址中,以便调度。比方要跑LINUX有必要要有MMU的支撑才行。
ARM920T中有三种类型的地址:
虚拟地址(VA),改换后的虚拟地址(MVA),物理地址(PA)。
以下是一个当一个指令被恳求时地址所做操作的比如:
1、 指令VA(IVA)被ARM920T宣布
2、 它被ProcID(当时进程地点的进程空间块的编号)转换成指令MVA(IMVA),指令CACHE(ICACHE)和MMU看到的便是IMVA。
3、 假如在IMMU上的维护模块承认IMVA不会被间断,而且IMVA标签也在ICACHE中,指令数据会读出并返回到ARM920T内核中。
4、 假如IMVA tag并不在ICACHE中,那么IMMU会产生出一个指令PA(IPA)。地址会给AMBA总线接口以获取外部数据。
那么VA是怎么被PID转换为MVA的呢?
这有关于CP15中的13,FCSE PID register
R13是fast context switch extension(FCSE 快速上下文切换扩展)processidentifier(PID 进程标识符)寄存器,此寄存器复位时为0。
读R13会得到FCSE PID的值,写R13会更新FCSE PID的值到[31:25]中,位[24:0]应该是零。
怎么运用FCSE PID:
920T内核宣布的地址都是0-32MB的规模,4GB的逆序空间被分成了1238个进程空间块,每个进程空间块巨细为32MB。每个进程空间块中能够包括一个进程。体系128个进程空间块的编号0-127,编号为I的进程空间块中的进程实际运用的虚拟地址空间为(I*0x02000000)到(I*0x02000000+0x01FFFFFF)。
所以VA一般高7位都为0时 MVA = VA | (PID << 25)
当VA高7位不为0时 MVA = VA,这种VA是本进程用于拜访其他进程中的数据和指令的虚拟地址,留意这时被拜访的进程标识符不能为0。
留意:当FCSE_PID为0时,即当时复位,则当时920T和CACHES及MMU之间是平面映射的联系(很奇妙:))。
TLB是什么
TLB即translate look-aside buffer,快表便是存储几个常用的页表,以进步体系运转的速度。在更新页表之前要使其无效,其操作的寄存器为R8,R8为只写寄存器,假如读它则会形成不行估量的结果。
AP赋值表:
而DOMAIN的赋值则是在C3中的,32bit共有16个域,每个域分两个bit,这两个bit操控当时域的权限。而以上四个bit是为了挑选0-15个域的其间一个。
关于C、B赋值:
以上有关于两种写缓存,写通以及写回。写回法是指CPU在履行写操作时,被写的数据只写入cache,不写入主存,仅当需求替换时,才把现已修正的cache块写回到主存中。写通法是指CPU在履行写操作时,有必要把数据一起写入cache和主存。
时钟以及总线概念
FCLK, HCLK, andPCLK
FCLK is used byARM920T.
HCLK is used forAHB bus, which is used by the ARM920T, the memory controller, the interruptcontroller, the LCD controller, the DMA and USB host block.
PCLK is used forAPB bus, which is used by the peripherals such as WDT, IIS, I2C, PWM timer, MMCinterface,ADC, UART, GPIO, RTC and SPI.
What is AHB/APB?
InternalAdvanced Microcontroller Bus Architecture(AMBA)是一种总线规范,以下两项都契合此规范。
AHB(AdvancedHigh performance Bus),首要用于体系高性能、高时速速率模块间通讯。
APB(AdvancedPeripheral Bus),首要用于慢速片上外设与ARM核的通讯。
AHB私有外设总线,只用于CM3内部的AHB外设,它们是:NV%&&&&&%,FPB, DWT和ITM。
APB私有外设总线,既用于CM3内部的APB设备,也用于外部设备(这儿的“外部”是对内核而言)。CM3答应器材制造商再增加一些片上APB外设到APB私有总线上,它们经过APB接口来拜访。
四种耗电形式:
NORMAL,SLOW,IDLE,SLEEP
先装备主PLL MPLL给CPU用。在上电复位的时分PLL是不稳定的,所以在PLLCON在被软件装备之前Fin直接是越过MPll给FCLK,所以不装备PLLCON也是能够正常作业。即便作业在正常状态下,也能够对MPLLCON进行装备,装备之后等候PLL Lock-time往后内部各模块的CLK才能够被正常供给。