从单片机转ARM,ARM架构基础知识小结
从单片机转到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外设,它们是:NVIC,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才可以被正常供应。
ARM和单片机到底有什么区别?
一、软件方面
这是最大的区别, ARM引入了操作系统,使得它具备下列特点:
方便
主要体现在后期开发上,即在操作系统上直接开发应用程序。不像单片机一样一切都要重新写。前期的操作系统移植工作,还要专业人士来做。
安全
这是LINUX的一个特点。LINUX的内核与用户空间的内存管理分开,不会因为用户的单个程序错误而引起系统死掉。这在单片机的软件开发中没见到过。
高效
引入进程的管理调度系统,使系统的运行更加高效。在传统的单片机开发中大多基于中断的前、后台技术,对多任务的管理有局限性。
二、硬件方面
肃然现在的8位单片机技术硬件发展得也非常快,出现了许多功能非常强大的单片机。但是与32ARM相比还是有差距的。ARM芯片大多把SDRAM、LCD等控制器集成到片子中。对于8位机,大多要进行外扩。
总的来说,单片机是微控制器 ,ARM则是微处理器 。
引入嵌入式操作系统之后,可以实现许多单片机系统不能完成的功能。比如,嵌入式Web服务器、Java虚拟机等,这意味着有很多免费的资源可以利用,上面说的这两种服务就是例子。如果在单片机上开发这些功能难度则会很大。
这让小隐想起了一个经典的段子:
联合利华引进了一条香皂包装生产线,结果发现这条生产线有个缺陷:常常会有盒子里没装入香皂。总不能把空盒子卖给顾客啊,只好请了一个学自动化的博士后设计一个方案来分拣空的香皂盒。博士后拉起了一个十几人的科研攻关小组,综合采用了机械、微电子、自动化、X射线探测等技术,花了几十万,成功解决了问题。每当生产线上有空香皂盒通过时,两旁的探测器就会检测到,并且驱动一只机械手把空皂盒推走。
而中国南方有个乡镇企业也买了同样的生产线,老板发现这个问题后,找了个小工来让搞定这件事情。小工果然想出了办法:他在生产线旁边放了台风扇猛吹,空皂盒自然会被吹走。
相关问答
51 单片机通信 有哪些?答51单片机通信主要有以下这些:51单片机与其他单片机或芯片级的通讯有:rs232、iic、spi、并口(i/o)、dma(如msp430、arm);单片机通过电缆与pc或其他设备通讯...
8052 单片机 怎么 通信 ?1、单片机与其他单片机或芯片级的通讯有:RS232、IIC、SPI、并口(I/O)、DMA(如msp430、ARM);2、单片机通过电缆与PC或其他设备通讯有:RS232、RS485、USB、CA....
arm单片机 为什么一定要再linux系统下开发呢?linus是嵌入式可用的操作系统之一,嵌入式开发到后面必须用操作系统,除非你把嵌入式当单片机用,这时候就不需要。当你在嵌入式下用操作系统的时候,可以选择的...
arm单片机与 51单片机学习有区别吗?有区别,而且还是有一些差别的,51单片机其实适合新手入门,他的寄存器少,内存也较小,所以很容易上手。arm则不一样,它是另外一套架构,相对来说比较复杂一些...
ARM 架构的 单片机 是目前性能最高,最早进的吗?如果不是,那么...如果不是,那么目前性能最高的单片机是什么架构?如果是,那么ARM哪个版本性能最高?目前性能最高的单片机是哪个公司的?色带金印典金印典AR讨论回答(4)单片...
设计工业机械手,控制部分用PLC、 单片机 、 ARM 那个好?你好,谢谢邀请!工业机械手的编程很多是用的不是这些语言,他们很多是制造商自己开发了一种语言。这个语言很像汇编语言。但不是汇编语言。你现在学了AVR单片机...
arm单片机 的启动方式?ARM单片机的启动方式主要分为两种:硬件启动和软件启动。硬件启动是通过外部引脚或者复位电路使芯片进入复位状态,然后根据芯片内部的复位向量表执行初始化程...
学完 单片机 ,并且应用做过项目,想学 ARM ,linux应该走怎样的学习路线比较好?...做Linux开发的工作有很多种,总结来说有偏上层应用的,也有偏驱动开发的。做上层应用就需要了解Linux系统不用了解太深,但是应用层的一些扩展要掌握,例如li...
您能更加深入的阐述一下嵌入式系统 与arm 的关系么?简单地讲,嵌入式系统是一种专用计算机系统,大家说的ARM是一种CPU,在嵌入式系统中起核心作用,但嵌入式的CPU并不一定是ARM,有可能是POWERPC、MIPS、单片机、D...
QT编程语言可以嫁接到 单片机 上面运行吗?可以的,以下是关于QT开发平台和arm嵌入式的关系QT包括普通窗口界面下的和嵌入式下的嵌入式QT也叫QT/Embeded,是应用在嵌入式linux系统上的GUI应用程序运行环...