第2章Cortex-M3内核原理1_第1页
第2章Cortex-M3内核原理1_第2页
第2章Cortex-M3内核原理1_第3页
第2章Cortex-M3内核原理1_第4页
第2章Cortex-M3内核原理1_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章Cortex-M3内核原理

(1)概述Cortex-M3是ARM公司推出的新一代32位低成本、高性能通用微控制器内核;它为实现MCU的需要提供了低成本的平台、缩减的管脚数目、降低的系统功耗,同时提供卓越的计算性能和先进的中断系统响应;出色地平衡了强计算能力、低功耗和低成本之间的矛盾,广泛应用于工业控制等各个领域,代表了目前微控制器内核发展的趋势。内核基于最新的ARMv7架构,采用Thumb-2指令集,集成了分支预测,单周期乘法,硬件除法等众多功能。IntroductiontoCortex-M3ProcessorCortex-M3ArchitectureHarvardbusarchitecture3-stagepipelinewithbranchspeculationIntegratedbusmatrixConfigurablenestedvectoredinterruptcontroller(NVIC)AdvancedconfigurabledebugandtracecomponentsOptionalcomponentsforspecificmarketrequirements:MemoryProtectionUnit(MPU)EmbeddedTraceMacrocell(ETM)FaultRobustInterface主要内容2.1Cortex-M3体系结构2.2寄存器2.3存储器系统--存储器区域分配;

--外设访问的存储器映射;

--存储器保护单元。2.4位带操作:原理、用途2.5工作模式2.6异常与中断2.7堆栈及其操作2.8Cortex-M3内核的其他主要特性2.9Thumb-2指令系统2.1Cortex-M3体系结构Cortex-M3体系结构图P29Cortex-M3

体系结构介绍Cortex-M3处理器主要由两大部分组成:Cortex-M3内核;中央处理器核心(Cortex-M3Core嵌套向量中断控制器(NVIC)系统时钟(SYSTICK)

存储器保护单元(MPU)总线调试系统。①

Cortex-M3内核主要包括:中央处理器核心(Cortex-M3Core)

即通常所说的CPU,包括指令提取单元(InstructionFetchUnit)、译码单元(Decoder)、寄存器组(RegisterBank)和ALU(ArithmeticLogicUnit)等。嵌套向量中断控制器(NVIC)

NVIC是一个在Cortex-M3中内建的中断控制器,与CPU核心紧密耦合。包含众多控制寄存器,支持中断嵌套模式,提供向量中断处理机制等功能。中断发生时,自动获得服务例程入口地址并直接调用,大大缩短中断延时。

系统时钟(SYSTICK)

由Cortex-M3内核提供的一个24位倒计时计数器,可产生定时中断,作为系统定时器用。所有CortexM3处理器均有该计数器,因此系统级移植时不必修改系统定时器相关代码,移植效率高。特别注意的是,即使系统处于睡眠模式,该计数器也能正常工作。

存储器保护单元(MPU)可选单元。可以视为一个简化的存储器管理单元(MMU,MemoryManagementUnit),但重点在于存储器保护。即通过将存储器划分成存储区域块,并设置其存取特性(是否缓冲、是否读写、是否执行、是否共享等)对存储区域块进行访问保护。例如,设置某存储区域块在用户级下变成只读,从而阻止一些用户程序破坏该区域的关键数据。

总线矩阵

总线矩阵是Cortex-M3内部总线系统的核心。它是一个32位的AMBA(AdvancedMicrocontrollerBusArchitecture)

AHBLite总线互连网络,通过该网络把处理器内核及调试接口连接到不同类型和功能划分的外部总线。提供数据在不同总线上的并行传输功能。总线:系统总线,ICode指令总线、DCode数据总线、私有外设总线等总线矩阵还提供了附加数据传送功能。如:写缓冲、位带(bitbanding)等,支持非对齐数据访问,以及总线桥(AHBtoAPBBridge),以支持向APB总线的连接。②调试系统主要包括串行线/串口线JTAG调试端口(SW-DP/SWJ-DP)

SW-DP/SWJ-DP两种端口都与AHB访问端口(AHB-AP)协同工作,以使外部调试器可以发起AHB上的数据传送,从而执行调试活动。基于AHB总线的通用调试接口(AHB‐AP)

AHB访问端口通过少量的寄存器,提供了对全部Cortex-M3存储器的访问机能。该功能块由SW-DP/SWJ-DP通过一个通用调试接口(DAP)来控制。当外部调试器需要执行动作的时候,就要通过SW-DP/SWJ-DP来访问AHB-AP,从而产生所需的AHB数据传送。嵌入式跟踪宏单元(ETM)

ETM用于实现实时指令跟踪,但它是一个选配件,所以不是所有的Cortex-M3产品都具有实时指令跟踪能力。ETM的控制寄存器是映射到主地址空间上的,因此调试器可以通过DAP来控制它。数据观察点触发器(DWT)

通过DWT,可以设置数据观察点触发条件,当一个数据地址或数据值匹配观察点条件,触发一次匹配命中并产生一个观察点事件,从而激活调试器以产生数据跟踪信息,或者让ETM联动以跟踪在哪条指令上发生了匹配命中事件。指令跟踪宏单元(ITM)

软件通过控制该模块直接把消息送给TPIU或者让DWT匹配命中事件通过ITM产生数据跟踪包,并把它输出到一个跟踪数据流中。跟踪端口接口单元(TPIU)

TPIU用于和外部的跟踪硬件(如跟踪端口分析仪)交互。Flash重载及断点单元(FPB)

FPB提供flash地址重载和断点功能。Flash地址重载是指:当CPU访问的某条指令匹配到一个特定的flash地址时,将把该地址重映射到SRAM中指定的位置,从而取指后返回的是另外的值。匹配的地址还能用来触发断点事件。配置查找表(ROM表)

提供存储器映射信息的查找表。当调试系统定位各调试组件时,它需要找出相关寄存器在存储器的地址,这些信息由此表给出。总线总线(Bus)是一种内部结构,用于在计算机内部CPU、内存、输入、输出设备等各个部件之间传递信息。按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线。主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。Cortex-M3总线结构AMBA总线ARM公司定义了AMBA(AdvancedMicrocontrollerBusArchitecture)总线规范,它是一组针对基于ARM核的、片上系统之间通信而设计的标准协议。因为ARM处理器的广泛使用而拥有众多第三方支持,被ARM公司90%以上的合作伙伴采用。在AMBA总线规范中,定义了AHB,APB,ASB这3种总线。最初的AMBA总线是ASB和APB。在它的第二个版本中,ARM引入了AHB。AMBA总线(l)AHB:AdvancedHighPerformanceBus,用于高性能系统模块的连接,支持突发模式数据传输和事务(ACID:原子性、一致性、隔离性和持久性)分割;(2)ASB:AdvancedSystemBus,也用于高性能系统模块的连接,支持突发模式数据传输,这是较老的系统总线格式,后来由AHB总线替代;(3)APB:AdvancedPeriPheralBus,用于较低性能外设的简单连接,一般是接在AHB或ASB系统总线上的第二级总线。AMBA总线图1典型的基于AMBA总线的系统存储器管理Cortex-M3微处理器存储器映射Cortex-M3总线结构(续)Cortex-M3采用哈佛结构,数据、指令分别存取。I-Code指令总线

基于AHB‐Lite总线协议的32位总线,默认映射到0x00000000~0x1FFFFFFF内存地址段,主要用于取指操作。取指以字方式操作,即每次取4字节长度指令。即使对16位指令进行取指也是如此。因此CPU内核可以一次取出两条16位的Thumb指令。D-Code数据总线

基于AHB‐Lite总线协议的32位总线,默认映射到0x00000000~0x1FFFFFFF内存地址段,主要用于数据访问操作。尽管Cortex-M3支持非对齐数据访问,但地址总线上总是对齐的地址。然而对于非对齐的数据传送,都将转换成多次的对齐数据传送。系统总线

基于AHB‐Lite总线协议的32位总线,默认映射到0x20000000~0xDFFFFFFF和0xE0100000~0xFFFFFFFF两个内存地址段,用于访问内存和外设,即SRAM,片上外设,片外RAM,片外扩展设备以及系统级存储区。可以根据需要传送指令和数据。和D‐Code总线一样,所有的数据传送都是对齐的。外设总线

基于APB总线协议的32位总线,用于访问私有外设,默认映射到0xE0040000~0xE00FFFFF内存地址段。由于TPIU、ETM以及ROM表占用部分空间,实际可用地址区间为0xE0042000~0xE00FF000。在系统连接结构中,通常借助AHB-APB桥实现内核内部高速总线到外部低速总线的数据缓冲和转换。Cortex-M3体系结构介绍(续)Cortex-M3内核是典型的32位处理器内核:内部数据路径宽度为32位,寄存器宽度为32位,存储器接口宽度也是32位,Cortex-M3内核拥有独立的指令总线和数据总线,其寻址能力均为4G,且共享同一个存储器空间,取指与数据访问可同时进行。P29Cortex-M3广泛采用时钟选通等技术,有效降低能耗,获得优异的能效比。Cortex-M3采取Thumb-2指令集,既获得了传统32位代码的性能,又具有16位代码的高代码密度。2.2Cortex-M3寄存器Cortex-M3RegisterFileR0R1R2R3R4R5R6R7R8R9R10R11R12R13(MSP)R14(LR)PCxPSRR13(PSP)Thread/HandlerThreadCortex-M3RegisterFile:18PhysicalRegistersRegistersetjust18registerscomparedwith38(?)registersfortraditionalARMHelpsreduceareaofCortex-M3CoreEasiertounderstandandrememberSame‘visible’registerfileasanyotherARMarchitecturedeviceAllowingUnifiedAssemblertomimicequivalentARMinstructionsinThumb-2Noshadow(mode)registersTwostackpointers–MainandProcessSupervisorSupervisorUser/SystemARMRegisterFileR0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LR)PCCPSRR13_svcSPSR_svcR13_abtR14_abtSPSR_abtR13_undR14_undSPSR_undR13_irqR14_irqSPSR_irqR8_fiqR9_fiqR10_fiqR11_fiqR12_fiqR13_fiqR14_fiqSPSR_fiqTraditionalARMRegisterFile:38(?37)PhysicalRegistersAbortUndefinedInterruptFastInterruptR14_svcCortex-M3寄存器(续)1.低组寄存器(R0~R7)

所有指令均能访问,字长为32位,复位后的初始值是随机的。绝大多数16位Thumb指令只能访问R0~R7。2.高组寄存器(R8~R12)

只有很少的16位Thumb指令能访问,32位指令则不受限制,复位后的初始值是随机的。3.堆栈寄存器(R13)又称“堆栈指针SP(StackPointer)”.Cortex-M3处理器内核有两个堆栈,但这两个寄存器不会同时生效,根据系统运行状态进行堆栈切换,以保证程序运行的快速性、安全性等要求。主堆栈指针(MSP),或写作SP_main,缺省堆栈指针,它由OS内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。

进程堆栈指针(PSP),或写作SP_process。用于常规的应用程序代码(不处于异常服务例程中时)。Cortex-M3寄存器(续)MSP和PSP都被称为R13,不同时呈现堆栈功能。但在程序中可以通过MRS/MSR指令来指定访问具体的堆栈指针。采用PUSH指令和POP指令进行入栈和出栈操作。PUSH

{R0} ;*(-

-R13)=R0。R13是long*的指针(32位字长)。POP

{R0} ;R0=*R13++。Cortex-M3寄存器(续)Cortex‐M3中的堆栈是“向下生长的满栈”。PUSH和POP还能一次操作多个寄存器:PUSH{R0-R7,R12,R14} ;

保存寄存器列表

… ;

执行处理

POP{R0-R7,R12,R14} ;

恢复寄存器列表

BXR14 ;

返回到主调函数由于R13的最低两位被硬线连接到0,并且总是读出0(ReadAsZero),因此堆栈的PUSH和POP操作永远都是4字节对齐的。Cortex-M3寄存器(续)R14寄存器:又称链接寄存器LR(LinkedRegister)。

main

;主程序

BLfunction1;使用“分支并连接(branchandlink)”指令调用function1

…Function1

;function1的代码

BX

LR

;函数返回Cortex-M3寄存器(续)程序计数寄存器(R15)

又称程序计数器PC(ProgramCounter)

。Cortex-M3中的指令是隶属于Thumb2指令集,且至少是半字对齐的,理论上讲,PC的LSB总是读回0。在编写分支指令时,无论是直接写PC的值还是使用分支指令,都必须保证加载到PC的数值是奇数(即LSB=1),用以表明当前指令在Thumb-2状态下执行。倘若写了0,则视为企图转入ARM模式,Cortex-M3将产生一个fault异常。Cortex-M3内部使用了指令流水线,读取PC内容时返回的值是当前指令的地址+4。例:

0x1000:

MOVR0,PC;R0=0x1004Cortex-M3寄存器(续)三类特殊功能寄存器程序状态寄存器组(ProgramStatusRegister,PSRs)中断屏蔽寄存器组(PRIMASK,FAULTMASK,BASEPRI)控制寄存器(CONTROL)Cortex-M3寄存器(续)特殊功能寄存器,有预定义的功能,只能采用MSR和MRS指令进行访问。指令访问的格式为:MRS<gp_reg>,<special_reg>;读特殊功能寄存器(Special_reg)的值到通用寄存器(gp_reg)MSR<special_reg>,<gp_reg>;写通用寄存器(gp_reg)的值到特殊功能寄存器(Special_reg)Cortex-M3寄存器(续)①程序状态寄存器组(PSRs或xPSR),按位段划分为三个子状态寄存器:

应用程序PSR(APSR):占据第27-31位中断号PSR(IPSR)

:占据第0-8位,只读执行PSR(EPSR):占据第10-15和24-26位,只读当使用三合一的方式访问时,应使用名字“xPSR”或者“PSR”PSR“PSR”。Cortex-M3寄存器(续)Cortex-M3程序状态寄存器的Bits描述符号Bits含义N[31]负Z[30]零C[29]进位/借位V[28]溢出Q[27]置顶饱和标记ICI/IT[26:25],[15:10]中断可持续指令(ICI)位/IF-THEN指令状态位T[24]Thumb-2状态,恒为1ExceptionNumber[9:0]中断(异常)号中断号中断号PSR(IPSR)

:占据第0-8位;ExceptionNumber=0:表示基础级别的线程上下文,无被激活异常。ExceptionNumber=n:表示向量表位置n处的异常发生,例如:n=2表示NMI非屏蔽中端,n=15表示SysTick中断请求,n=16+m表示中断号

INTISR[m])。P53IT/ICI标志位执行PSR(EPSR):占据第10-15和24-26位;IT/ICI标志位:包含IF-THEN指令的基础条件码和支持中断继续执行的相关信息。多寄存器加载(LDM)和存储(STM)操作是可中断的;EPSR的ICI区用来保存从产生中断的点继续执行多寄存器加载和存储操作时所必需的信息;LDM/STM指令可以利用ICI(interrupt-continuableinformation)继续执行被中断的程序。但包含在IT指令块中的LDM/STM指令无此功能,因为IT与ICI域占用相同的比特位。T标志位:指示Thumb工作状态。对于Cortex-M3微处理器T=1恒成立;T=0将引发异常,因为Cortex-M3无法执行ARM指令。PSR的访问与修改EPSR可以使用MRS读取,但只能被间接修改。当使用三合一的方式访问时,应使用名字“xPSR”或者“PSR”。发生异常时,合体后的寄存器xPSR被自动全部压入堆栈。Cortex-M3寄存器(续)中断屏蔽寄存器组(PRIMASK,FAULTMASK和

BASEPRI)名称功能描述PRIMASK这是个只有1个bit的寄存器。当它置1时,就关掉所有可屏蔽的异常(中断)

,只剩下NMI和硬fault可以响应。它的缺省值是0,表示没有关中断。FAULTMASK这是个只有1个bit的寄存器。当它置1时,只有NMI才能响应,所有其它的异常,包括中断和fault,通通失效。它的缺省值也是0,表示没有关异常。BASEPRI这个寄存器最多有9个bits(由优先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关闭(优先级号越大,优先级越低)。但若被设成0,则不关闭任何中断,0也是缺省值。Cortex-M3寄存器(续)只有在特权级下,才允许使用MRS/MSR指令访问PRIMASK、FAULTMASK,以及BASEPRI:MRSR0,BASEPRI ;读取BASEPRI寄存器内容到R0中

MRSR0,FAULTMASK ;读取FAULTMASK寄存器内容到R0中MSRBASEPRI,R0 ;写入R0寄存器内容到BASEPRI中MSRFAULTMASK,R0 ;写入R0寄存器内容到FAULTMASK中MSRPRIMASK,R0 ;写入R0寄存器内容到PRIMASK中为了快速地开关中断,可使用CPS指令:

CPSIDI ;PRIMASK=1,关中断

CPSIEI ;PRIMASK=0,开中断

CPSIDF ;FAULTMASK=1,关异常

CPSIEF ;FAULTMASK=0,

开异常Cortex-M3寄存器(续)PRIMASK、BASEPRI可用于时间关键任务的处理;当某个任务崩溃时,FAULTMASK可被OS用于暂时关闭微处理器FAULT处理功能,以避免任务崩溃时大量的FAULT使得CPU应接不暇。Cortex-M3寄存器(续)控制寄存器(CONTROL),用于定义特权级别,还用于选择当前使用哪个堆栈指针。位功能描述CONTROL[0]仅当在特权级下操作时才允许写该位。一旦进入了用户级,唯一返回特权级的途径,就是触发中断异常,再由中断服务例程改写该位。

0表示特权级的线程模式

1表示用户级的线程模式注意:Handler模式永远都是特权级的CONTROL[1]堆栈指针选择

0表示选择主堆栈指针MSP(复位后缺省值)

1表示选择进程堆栈指针PSP②在handler模式下,只允许使用MSP。在线程或基础级,可以使用PSP。在线程模式中则可以为0(特权级)或1(用户级)。仅当处于特权级的线程模式下,此位才可写。其它场合下禁止写此位。Control寄存器与堆栈、工作模式Cortex-M3寄存器(续)CONTROL寄存器也是通过MRS和MSR指令来操作的:

MRSR0,CONTROLMSRCONTROL,R0Cortex-M3RegisterFileR0R1R2R3R4R5R6R7R8R9R10R11R12R13(MSP)R14(LR)PCxPSRR13(PSP)Thread/HandlerThreadCortex-M3RegisterFile:18PhysicalRegistersRegistersetjust18registerscomparedwith38registersfortraditionalARMHelpsreduceareaofCortex-M3CoreEasiertounderstandandrememberSame‘visible’registerfileasanyotherARMarchitecturedeviceAllowingUnifiedAssemblertomimicequivalentARMinstructionsinThumb-2Noshadow(mode)registersTwostackpointers–MainandProcess2.3存储器系统存储器系统Cortex-M3是一个32位处理器,支持4GB存储空间,与ARM架构相比,有很多优点:预定义存储器映射和总线配置;支持“位带(bit‐band)”操作;支持非对齐访问和互斥访问;支持小端和大端两种存储格式;存储器系统Cortex-M3内核只有一个单一固定的存储器映射,提高内存访问速度,便于软件移植。例如:各款Cortex-M3单片机的NVIC和MPU都在相同的位置布设寄存器,使得它们变得通用;片上外设的寄存器映射到外设区(0x40000000~0x5FFFFFFF)中的某个位置,就可以简单地以访问内存的方式来访问这些外设的寄存器,从而对外设功能进行配置,并施加控制。存储器管理(续)Cortex-M3微处理器存储器映射存储器映射(续)代码区(Code,0x00000000~0x1FFFFFFF,512MB),主要用于存放程序代码。当然,代码也可存放在内部SRAM区以及外部RAM区。因指令总线与数据总线是分开的,为使取指和数据访问各自使用自己的总线,最理想的是把程序放到代码区。内部SRAM区(SRAM,0x20000000~0x3FFFFFFF,512MB),用于让芯片制造商连接片上的SRAM,这个区通过系统总线来访问。该区最底部1MB地址范围是“位带区”(0x20000000~0x200FFFFF),可存放8M个位(bit)变量;与此对应,该内部SRAM区有一个32MB的“位带别名(alias)区”(0x22000000~0x23FFFFFF),用一个字(4字节)来代表每一个位带区的每一个位。这样对每一个字进行读写时,实际上就是对位带区的每一个位进行读写。存储器映射(续)位带操作,只适用于数据访问,不适用于取指。通过位带的功能,可以把多个布尔型数据打包在单一的字中,却依然可以从位带别名区中,像访问普通内存一样地使用它们。位带别名区中的访问操作是原子的,消灭了传统的“读-改-写”三步曲以及由此产生的被中断的可能。该特性可以显著提高位操作的效率和安全性,对许多底层软件开发特别是操作系统和驱动程序具有重要意义。存储器映射(续)片内外设区(Peripheral,0x40000000~0x5FFFFFFF,512MB),用于映射外设芯片的寄存器,主要由片内外设使用。该区也有一个32MB的位带别名,以便于快捷地访问外设寄存器。该外设区内不允许执行指令。外部RAM区(ExternalRam,0x60000000~0x9FFFFFFF,256KB)和外部设备区(ExternalDevice,0xA0000000~0xDFFFFFFF,768KB)。外部RAM区用于连接外部RAM;外部设备区用于连接外部设备。这两个存储区不包含位带。两者的区别在于外部RAM区允许执行指令,而外部设备区则不允许。存储器映射(续)私有外设总线区(0xE0000000~0xE00FFFFF),由两部分组成:内部私有外设总线区(0xE0000000~0xE003FFFF,256KB)外部私有外设总线区(0xE0040000~0xE00FFFFF,768KB)

存储器映射(续)私有外设总线区(0xE0000000~0xE00FFFFF),由两部分组成:内部私有外设总线区(0xE0000000~0xE003FFFF,256KB)AHB私有外设总线,对应于内部私有外设总线区,只用于Cortex-M3内部AHB外设,如NVICFPB(Flash重载和断点单元)DWT(数据观察点触发器)ITM(指令跟踪宏单元)SYSTICK等。其中,NVIC所处的区域叫做“系统控制空间(SCS)”,映射有SysTick、MPU以及代码调试控制所用的寄存器。存储器映射(续)私有外设总线区(0xE0000000~0xE00FFFFF),由两部分组成:外部私有外设总线区(0xE0040000~0xE00FFFFF,768KB)

APB私有外设总线,对应于外部私有外设总线区,用于Cortex-M3内部APB设备,如:1.跟踪端口接口单元(TPIU)2.嵌入式跟踪宏单元(ETM)3.ROM表此外,Cortex-M3允许器件制造商添加其他片上APB外设到APB私有外设总线上,并通过APB接口来访问。存储器映射(续)提供商指定区

未用的存储器区域,由产品提供商指定。提供商指定区通过系统总线来访问,但是不允许在其中执行指令。采取Cortex-M3内核的微控制器芯片制造商,可能会根据具体应用不同,进行些微适当的调整,并提供更详细的存储器映射说明。非对齐数据传送Cortex-M3支持在单一的访问中使用非对齐数据传送;对于字的传送而言,任何一个不能被4整除的地址都是非对齐的。对于半字,任何不能被2整除的地址(也就是奇数地址)都是非对齐的。非对齐数据传送非对齐数据传送的五种常见方式:非对齐数据传送非对齐→对齐,由处理器总线单元来完成,但需要更多的周期;可以通过NVIC编程使之监督地址对齐。P44,图2-18

非对齐数据传送在Cortex-M3中,非对齐数据传送只发生在LDR/LDRH/LDRSH等常规数据传送指令;其他指令不支持,如:批量数据加载/存储指令;堆栈操作PUSH/POP;互斥访问(LDREX/STREX);位带操作。必须对齐!互斥访问多任务共享某一资源,往往存在“竞争”问题。这种因为资源共享而引发的“竞争”问题,解决不好,会带来什么问题?[例1]

铁路订票系统中的一个活动序列①甲售票点(甲事务)读出某车次的车票余额A,设A=16;②乙售票点(乙事务)读出同一车次的车票余额A,也为16;③甲售票点卖出一张车票,修改余额A←A-1,所以A为15,把A写回数据库;④乙售票点也卖出一张车票,修改余额A←A-1,所以A为15,把A写回数据库结果明明卖出两张车票,车票余额只减少1。[例2]死锁a=b+c;c=a+d互斥访问互斥访问互斥体在多任务环境中使用,也在中断服务例程和主程序之间使用,用于共享资源的管理与调度。必须建立“互斥”性检查机制。信号灯(量)常用来分配共享资源。当一个资源正在被一个过程使用时,该信号灯用于指示该共享资源被占用。SWP指令(swap)用于在传统的ARM处理器上进行信号灯操作。互斥访问在传统的ARM处理器中,读/写访问往往使用同一总线,互斥性检查可以通过SWP指令来实现,从而可以避免不同任务“竞争”共享资源而出现的“死锁”或“错误”。然而,在ARMV7架构中,读/写访问各自使用不同的总线,导致SWP无法再保证操作的原子性。Cortex-M微处理器基于ARMV7架构,互斥性检查必须用另外的机制实现。互斥访问在互斥访问操作下,Cortex-M3微处理器允许互斥体所在的地址被其它总线控制器访问,也允许被运行在本机上的其它任务访问,但是能够“驳回”有可能导致竞争条件的互斥写操作。互斥访问分为加载和存储,相应的指令对为LDREX/STREXLDREXH/STREXHLDREXB/STREXB共享资源的互斥控制LDREX/STREX的语法格式为:LDREXRxf,[Rn,#offset]STREXRd,Rxf,[Rn,#offset]EX-------exclusivelockLDREX/STREX成对使用。互斥访问TryInc:LDREXr2,[R0]ADDr2,#1STREXR1,R2,[R0]CMPR1,#1

;检查STREX是否被驳回

BEQTryInc

;如果发现STREX被驳回,则重试。注意:Rd一般由共享资源的当前占有者设定,并能为欲使用该资源的其他任务所读取。数据存储格式数据存储格式:小端模式和大端模式Cortex-M3默认小端模式,见下图:地址,长度Bits31‐24Bits23‐16Bits15‐8Bits7‐00x1000,字D[31:24]D[23:16]D[15:8]D[7:0]0x1000,半字

D[15:8]D[7:0]0x1002,半字D[15:8]D[7:0]

0x1000,字节

D[7:0]0x1001,字节

D[7:0]

0x1002,字节

D[7:0]

0x1003,字节D[7:0]

数据存储格式大端模式地址,长度Bits31‐24Bits23‐16Bits15‐8Bits7‐00x1000,字D[7:0]D[15:8]D[23:16]D[31:24]0x1000,半字D[7:0]D[15:8]

0x1002,半字

D[7:0]D[15:8]0x1000,字节D[7:0]

0x1001,字节

D[7:0]

0x1002,字节

D[7:0]

0x1003,字节

D[7:0]数据存储格式Cortex-M3在复位时确定使用哪种“端模式”,且运行时不得更改,一般默认小端模式。指令预取永远使用小端模式,在配置控制存储空间的访问也永远使用小端模式(包括NVIC,FPB之流)。另外,私有外设总线区0xE000_0000至0xE00F_FFFF也永远使用小端模式。针对采用大端模式工作的外设时,可以使用REV/REVH指令来完成端模式的转换。存储保护单元

MPUMPU可以实施对存储器(主要是内存和外设寄存器)的保护,以使软件更加健壮和可靠。MPU可以提供以下功能:

阻止用户应用程序破坏操作系统使用的数据

阻止一个任务访问其它任务的数据区,从而把任务隔开。

可以把关键数据区设置为只读,从根本上消除了被破坏的可能。

检测意外的存储访问,如堆栈溢出、数组越界。

MPU设置存储器区段的访问属性。

内存的访问属性通常,如果提供了外部内存,芯片制造商还要附加一个内存控制器,它可以根据可否缓存的设置,来管理对片内和片外RAM的访问操作。Cortex-M3片内没有配备缓存,也没有缓存控制器,但是允许在外部添加缓存和控制器。存储器访问许可MPU可以在地址空间中划出若干个存储区段,并为不同的存储区段规定不同的访问许可权限。Cortex-M3的MPU共支持8个存储区段,并允许把每个存储区段进一步划分成更小的子区段。此外,还允许启用一个后台存储区段(即没有MPU时的全部地址空间),不过它是只能由特权级享用。存储器访问许可MPU定义的存储区段可以相互交迭,越段使用。如果某块内存落在多个存储区段中,则访问属性和权限将由编号最大的存储区段来决定。比如,若1号存储区段与4号存储区段交迭,则交迭的部分受4号存储区段控制。存储保护单元MPUCortex-M微处理器,出于数据的安全性需求,可以借助于MPU,可对特权级和用户级数据访问施加不同的访问限制。常见的情况是,由操作系统利用MPU对特权级代码、数据,以及操作系统本身施加保护,以避免被其他用户程序所破坏。存储保护单元MPU当需要阻止用户程序访问特权级的数据和代码时,可以启用MPU。启用MPU后,就不得再访问定义之外的地址区间,也不得访问未经授权的存储区段。否则,将以“违规访问”处理,触发MemoryManagefault。存储保护单元MPUCortex-M3有一个缺省的存储访问许可,它能防止使用户代码访问系统控制存储空间,保护NVIC、MPU等关键部件。缺省访问许可在下列条件时生效:

没有配备MPU配备了MPU,但是MPU被除能存储保护单元MPU缺省的存储器访问许可权限如下:地址范围缓存?缓冲?可执行?访问(读写)?代码区

00000000~1FFFFFFFWT(writethrough)可执行,缓冲无限制片内SRAM20000000~3FFFFFFFWB-WA(WriteBack,WriteAllocated)可执行,缓冲无限制片上外设

40000000~5FFFFFFF非缓存非缓冲无限制外部RAM60000000~7FFFFFFFWB-WA可执行无限制外部RAM80000000~9FFFFFFFWT可执行无限制外部外设

A0000000~DFFFFFFF非缓冲,不可执行无限制ITME0000000~E0000FFF非缓存非缓冲,不可执行可以读。对于写操作,除了用户级下允许时的stimulus端口外,全部忽略

DWTE0001000~E0001FFF非缓存非缓冲,不可执行阻止访问,访问会引发一个总线faultFPBE0002000~E0003FFF非缓存非缓冲,不可执行阻止访问,访问会引发一个总线faultNVICE000E000~E000EFFF非缓存非缓冲,不可执行阻止访问,访问会引发一个总线fault。但有个例外:软件触发中断寄存器可以被编程为允许用户级访问。内部PPBE000F000~E003FFFF非缓存非缓冲,不可执行阻止访问,访问会引发一个总线faultTPIUE0040000~E0040FFF非缓存非缓冲,不可执行阻止访问,访问会引发一个总线faultETME0041000~E0041FFF非缓存非缓冲,不可执行阻止访问,访问会引发一个总线fault外部PPBE0042000~E0042FFF非缓存非缓冲,不可执行阻止访问,访问会引发一个总线faultROM表

E00FF000~E00FFFFF非缓存非缓冲,不可执行阻止访问,访问会引发一个总线fault供应商指定

E0100000~FFFFFFFF非缓存非缓冲,不可执行无限制加载时域&运行时域

程序从ROM或RAM中加载后运行,加载位置(运行前的位置)与运行时的位置,可能相同,也可能不同。加载时域:程序的加载时域就是指程序烧入Flash中或写入RAM中的状态运行时域:

运行时域是指程序执行时的状态Scatter文件:对加载时域和运行时域进行描述。例1:一个加载时域,3个连续运行时域RW属性的输出段RO属性的输出段0x0RAM加载时地址映射关系(b)运行时地址映射关系0x8000RW属性的输出段RO属性的输出段0x0RAM0x8000单一加载时域ZI属性的输出段RO属性的运行时域RW属性的运行时域ZI属性的运行时域

映像文件包括1个加载时域、3个运行时域(ZI:ZeroinitializedR/WData;RW:R/WData;RO:Code+ROData),加载地址与运行地址相同,无须进行数据移动加载时地址映射关系(b)运行时地址映射关系0x40000RW属性的输出段RO属性的输出段0x00x8000ZI属性的输出段RO属性的运行时域RW属性的运行时域ZI属性的运行时域例2:一个加载时域,3个不连续运行时域

映像文件包括1个加载时域、3个不连续运行时域

RO属性的输出段,加载地址与运行地址相同,运行时不需进行数据移动RW属性的输出段,加载地址与运行地址不同,运行时需要进行数据移动RW属性的输出段RO属性的输出段0x0RAM0x8000单一加载时域ROM0x40000RAMROM0x40000RW属性的输出段RO属性的输出段0x0RAM加载时地址映射关系(b)运行时地址映射关系0x80000x40000RW属性的输出段RO属性的输出段0x0RAM0x8000第2个加载时域第1个加载时域ZI属性的输出段RO属性的运行时域RW属性的运行时域ZI属性的运行时域例3:两个加载时域,3个不连续运行时域

映像文件包括2个加载时域、3个运行时域

RO、RW属性的输出段,加载地址与运行地址相同,运行时不需进行数据移动加载时域与运行时域一个映像文件需要指定一个初始入口点(initialentrypoint)初始入口点必须位于一个固定域中,即加载地址必须与运行地址相同。初始入口地址,一般应(可)由开发人员确定。由于嵌入式微控制器采取物理地址进行代码和数据的存放,因此入口地址的确定应确保代码的正确、可靠运行。2.4位带操作位带操作Cortex-M3存储器包括两个位带区,分别为SRAM和外设存储区域中的最低的1MB。SRAM别名区和外设别名区的一个字分别被映射为相应的bit-band区的一个位,即通过映射实现绑定。位段区的偏移值范围为0x0~0xFFFFF,SRAM位带别名区的偏移值范围则为0x22000000~0x23FFFFFF,外设存储别名区的偏移值范围则为0x42000000~0x43FFFFFF。位带操作(续)所谓“位带操作”,就是:(1)对32MBSRAM别名区的访问映射为对1MBSRAM的bit-band区的访问。(2)对32MB外设别名区的访问映射为对1MB外设bit-band区的访问。映射公式:bit_word_addr=bit_band_alias_base+(byte_offset×32)+(bit_number×4)bit_word_addr是别名存储器区中字的地址,它映射到某个目标位。bit_band_alias_base是别名区的基址,即起始地址。byte_offset是包含目标位的字节在位带区里的序号。bit_number是位带区目标位所在字节中的位置(0-7)。位带操作(续)例1:位带区SRAM地址为0x20000300的字节中的位2,其位带别名区的映射地址:?

位带操作(续)例1:位带区SRAM地址为0x20000300的字节中的位2,其位带别名区的映射地址:?=0x22000000+(0x300*32)+(2*4).0x22006008=0x22000000+(0x300*32)+(2*4).对0x22006008地址的写操作和对SRAM中地址0x20000300字节的位2执行“读--改--写”操作有着相同的效果。位带操作(续)例2:

(1)地址

?的别名字映射为0x200FFFFF的bit-band字节的位0:

(2)地址?的别名字映射为0x200FFFFF的bit-band字节的位7:

(3)地址?的别名字映射为0x20000000的bit-band字节的位0:

(4)地址?的别名字映射为0x20000000的bit-band字节的位7:位带操作(续)

例2:

(1)地址0x23FFFFE0的别名字映射为0x200FFFFF的bit-band字节的位0:0x22000000+(0xFFFFF*32)+0*4=0x23FFFFE0

(2)地址0x23FFFFEC的别名字映射为0x200FFFFF的bit-band字节的位7:0x22000000+(0xFFFFF*32)+7*4=0x23FFFFEC

(3)地址0x22000000的别名字映射为0x20000000的bit-band字节的位0:0x22000000+(0*32)+0*4=0x22000000

(4)地址0x220001C的别名字映射为0x20000000的bit-band字节的位7:0x22000000+(0*32)+7*4=0x2200001C位带操作(续)例2图示位带操作(续)怎样利用“位带操作”进行位带区的“读—改—写

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论