第2章Cortex-M3內(nèi)核原理1_第1頁
第2章Cortex-M3內(nèi)核原理1_第2頁
第2章Cortex-M3內(nèi)核原理1_第3頁
第2章Cortex-M3內(nèi)核原理1_第4頁
第2章Cortex-M3內(nèi)核原理1_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第2章Cortex-M3內(nèi)核原理

(1)概述Cortex-M3是ARM公司推出的新一代32位低成本、高性能通用微控制器內(nèi)核;它為實現(xiàn)MCU的需要提供了低成本的平臺、縮減的管腳數(shù)目、降低的系統(tǒng)功耗,同時提供卓越的計算性能和先進的中斷系統(tǒng)響應(yīng);出色地平衡了強計算能力、低功耗和低成本之間的矛盾,廣泛應(yīng)用于工業(yè)控制等各個領(lǐng)域,代表了目前微控制器內(nèi)核發(fā)展的趨勢。內(nèi)核基于最新的ARMv7架構(gòu),采用Thumb-2指令集,集成了分支預(yù)測,單周期乘法,硬件除法等眾多功能。IntroductiontoCortex-M3ProcessorCortex-M3ArchitectureHarvardbusarchitecture3-stagepipelinewithbranchspeculationIntegratedbusmatrixConfigurablenestedvectoredinterruptcontroller(NVIC)AdvancedconfigurabledebugandtracecomponentsOptionalcomponentsforspecificmarketrequirements:MemoryProtectionUnit(MPU)EmbeddedTraceMacrocell(ETM)FaultRobustInterface主要內(nèi)容2.1Cortex-M3體系結(jié)構(gòu)2.2寄存器2.3存儲器系統(tǒng)--存儲器區(qū)域分配;

--外設(shè)訪問的存儲器映射;

--存儲器保護單元。2.4位帶操作:原理、用途2.5工作模式2.6異常與中斷2.7堆棧及其操作2.8Cortex-M3內(nèi)核的其他主要特性2.9Thumb-2指令系統(tǒng)2.1Cortex-M3體系結(jié)構(gòu)Cortex-M3體系結(jié)構(gòu)圖P29Cortex-M3

體系結(jié)構(gòu)介紹Cortex-M3處理器主要由兩大部分組成:Cortex-M3內(nèi)核;中央處理器核心(Cortex-M3Core嵌套向量中斷控制器(NVIC)系統(tǒng)時鐘(SYSTICK)

存儲器保護單元(MPU)總線調(diào)試系統(tǒng)。①

Cortex-M3內(nèi)核主要包括:中央處理器核心(Cortex-M3Core)

即通常所說的CPU,包括指令提取單元(InstructionFetchUnit)、譯碼單元(Decoder)、寄存器組(RegisterBank)和ALU(ArithmeticLogicUnit)等。嵌套向量中斷控制器(NVIC)

NVIC是一個在Cortex-M3中內(nèi)建的中斷控制器,與CPU核心緊密耦合。包含眾多控制寄存器,支持中斷嵌套模式,提供向量中斷處理機制等功能。中斷發(fā)生時,自動獲得服務(wù)例程入口地址并直接調(diào)用,大大縮短中斷延時。

系統(tǒng)時鐘(SYSTICK)

由Cortex-M3內(nèi)核提供的一個24位倒計時計數(shù)器,可產(chǎn)生定時中斷,作為系統(tǒng)定時器用。所有CortexM3處理器均有該計數(shù)器,因此系統(tǒng)級移植時不必修改系統(tǒng)定時器相關(guān)代碼,移植效率高。特別注意的是,即使系統(tǒng)處于睡眠模式,該計數(shù)器也能正常工作。

存儲器保護單元(MPU)可選單元??梢砸暈橐粋€簡化的存儲器管理單元(MMU,MemoryManagementUnit),但重點在于存儲器保護。即通過將存儲器劃分成存儲區(qū)域塊,并設(shè)置其存取特性(是否緩沖、是否讀寫、是否執(zhí)行、是否共享等)對存儲區(qū)域塊進行訪問保護。例如,設(shè)置某存儲區(qū)域塊在用戶級下變成只讀,從而阻止一些用戶程序破壞該區(qū)域的關(guān)鍵數(shù)據(jù)。

總線矩陣

總線矩陣是Cortex-M3內(nèi)部總線系統(tǒng)的核心。它是一個32位的AMBA(AdvancedMicrocontrollerBusArchitecture)

AHBLite總線互連網(wǎng)絡(luò),通過該網(wǎng)絡(luò)把處理器內(nèi)核及調(diào)試接口連接到不同類型和功能劃分的外部總線。提供數(shù)據(jù)在不同總線上的并行傳輸功能。總線:系統(tǒng)總線,ICode指令總線、DCode數(shù)據(jù)總線、私有外設(shè)總線等總線矩陣還提供了附加數(shù)據(jù)傳送功能。如:寫緩沖、位帶(bitbanding)等,支持非對齊數(shù)據(jù)訪問,以及總線橋(AHBtoAPBBridge),以支持向APB總線的連接。②調(diào)試系統(tǒng)主要包括串行線/串口線JTAG調(diào)試端口(SW-DP/SWJ-DP)

SW-DP/SWJ-DP兩種端口都與AHB訪問端口(AHB-AP)協(xié)同工作,以使外部調(diào)試器可以發(fā)起AHB上的數(shù)據(jù)傳送,從而執(zhí)行調(diào)試活動。基于AHB總線的通用調(diào)試接口(AHB‐AP)

AHB訪問端口通過少量的寄存器,提供了對全部Cortex-M3存儲器的訪問機能。該功能塊由SW-DP/SWJ-DP通過一個通用調(diào)試接口(DAP)來控制。當外部調(diào)試器需要執(zhí)行動作的時候,就要通過SW-DP/SWJ-DP來訪問AHB-AP,從而產(chǎn)生所需的AHB數(shù)據(jù)傳送。嵌入式跟蹤宏單元(ETM)

ETM用于實現(xiàn)實時指令跟蹤,但它是一個選配件,所以不是所有的Cortex-M3產(chǎn)品都具有實時指令跟蹤能力。ETM的控制寄存器是映射到主地址空間上的,因此調(diào)試器可以通過DAP來控制它。數(shù)據(jù)觀察點觸發(fā)器(DWT)

通過DWT,可以設(shè)置數(shù)據(jù)觀察點觸發(fā)條件,當一個數(shù)據(jù)地址或數(shù)據(jù)值匹配觀察點條件,觸發(fā)一次匹配命中并產(chǎn)生一個觀察點事件,從而激活調(diào)試器以產(chǎn)生數(shù)據(jù)跟蹤信息,或者讓ETM聯(lián)動以跟蹤在哪條指令上發(fā)生了匹配命中事件。指令跟蹤宏單元(ITM)

軟件通過控制該模塊直接把消息送給TPIU或者讓DWT匹配命中事件通過ITM產(chǎn)生數(shù)據(jù)跟蹤包,并把它輸出到一個跟蹤數(shù)據(jù)流中。跟蹤端口接口單元(TPIU)

TPIU用于和外部的跟蹤硬件(如跟蹤端口分析儀)交互。Flash重載及斷點單元(FPB)

FPB提供flash地址重載和斷點功能。Flash地址重載是指:當CPU訪問的某條指令匹配到一個特定的flash地址時,將把該地址重映射到SRAM中指定的位置,從而取指后返回的是另外的值。匹配的地址還能用來觸發(fā)斷點事件。配置查找表(ROM表)

提供存儲器映射信息的查找表。當調(diào)試系統(tǒng)定位各調(diào)試組件時,它需要找出相關(guān)寄存器在存儲器的地址,這些信息由此表給出。總線總線(Bus)是一種內(nèi)部結(jié)構(gòu),用于在計算機內(nèi)部CPU、內(nèi)存、輸入、輸出設(shè)備等各個部件之間傳遞信息。按照計算機所傳輸?shù)男畔⒎N類,計算機的總線可以劃分為數(shù)據(jù)總線、地址總線和控制總線。主機的各個部件通過總線相連接,外部設(shè)備通過相應(yīng)的接口電路再與總線相連接,從而形成了計算機硬件系統(tǒng)。Cortex-M3總線結(jié)構(gòu)AMBA總線ARM公司定義了AMBA(AdvancedMicrocontrollerBusArchitecture)總線規(guī)范,它是一組針對基于ARM核的、片上系統(tǒng)之間通信而設(shè)計的標準協(xié)議。因為ARM處理器的廣泛使用而擁有眾多第三方支持,被ARM公司90%以上的合作伙伴采用。在AMBA總線規(guī)范中,定義了AHB,APB,ASB這3種總線。最初的AMBA總線是ASB和APB。在它的第二個版本中,ARM引入了AHB。AMBA總線(l)AHB:AdvancedHighPerformanceBus,用于高性能系統(tǒng)模塊的連接,支持突發(fā)模式數(shù)據(jù)傳輸和事務(wù)(ACID:原子性、一致性、隔離性和持久性)分割;(2)ASB:AdvancedSystemBus,也用于高性能系統(tǒng)模塊的連接,支持突發(fā)模式數(shù)據(jù)傳輸,這是較老的系統(tǒng)總線格式,后來由AHB總線替代;(3)APB:AdvancedPeriPheralBus,用于較低性能外設(shè)的簡單連接,一般是接在AHB或ASB系統(tǒng)總線上的第二級總線。AMBA總線圖1典型的基于AMBA總線的系統(tǒng)存儲器管理Cortex-M3微處理器存儲器映射Cortex-M3總線結(jié)構(gòu)(續(xù))Cortex-M3采用哈佛結(jié)構(gòu),數(shù)據(jù)、指令分別存取。I-Code指令總線

基于AHB‐Lite總線協(xié)議的32位總線,默認映射到0x00000000~0x1FFFFFFF內(nèi)存地址段,主要用于取指操作。取指以字方式操作,即每次取4字節(jié)長度指令。即使對16位指令進行取指也是如此。因此CPU內(nèi)核可以一次取出兩條16位的Thumb指令。D-Code數(shù)據(jù)總線

基于AHB‐Lite總線協(xié)議的32位總線,默認映射到0x00000000~0x1FFFFFFF內(nèi)存地址段,主要用于數(shù)據(jù)訪問操作。盡管Cortex-M3支持非對齊數(shù)據(jù)訪問,但地址總線上總是對齊的地址。然而對于非對齊的數(shù)據(jù)傳送,都將轉(zhuǎn)換成多次的對齊數(shù)據(jù)傳送。系統(tǒng)總線

基于AHB‐Lite總線協(xié)議的32位總線,默認映射到0x20000000~0xDFFFFFFF和0xE0100000~0xFFFFFFFF兩個內(nèi)存地址段,用于訪問內(nèi)存和外設(shè),即SRAM,片上外設(shè),片外RAM,片外擴展設(shè)備以及系統(tǒng)級存儲區(qū)??梢愿鶕?jù)需要傳送指令和數(shù)據(jù)。和D‐Code總線一樣,所有的數(shù)據(jù)傳送都是對齊的。外設(shè)總線

基于APB總線協(xié)議的32位總線,用于訪問私有外設(shè),默認映射到0xE0040000~0xE00FFFFF內(nèi)存地址段。由于TPIU、ETM以及ROM表占用部分空間,實際可用地址區(qū)間為0xE0042000~0xE00FF000。在系統(tǒng)連接結(jié)構(gòu)中,通常借助AHB-APB橋?qū)崿F(xiàn)內(nèi)核內(nèi)部高速總線到外部低速總線的數(shù)據(jù)緩沖和轉(zhuǎn)換。Cortex-M3體系結(jié)構(gòu)介紹(續(xù))Cortex-M3內(nèi)核是典型的32位處理器內(nèi)核:內(nèi)部數(shù)據(jù)路徑寬度為32位,寄存器寬度為32位,存儲器接口寬度也是32位,Cortex-M3內(nèi)核擁有獨立的指令總線和數(shù)據(jù)總線,其尋址能力均為4G,且共享同一個存儲器空間,取指與數(shù)據(jù)訪問可同時進行。P29Cortex-M3廣泛采用時鐘選通等技術(shù),有效降低能耗,獲得優(yōu)異的能效比。Cortex-M3采取Thumb-2指令集,既獲得了傳統(tǒng)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寄存器(續(xù))1.低組寄存器(R0~R7)

所有指令均能訪問,字長為32位,復(fù)位后的初始值是隨機的。絕大多數(shù)16位Thumb指令只能訪問R0~R7。2.高組寄存器(R8~R12)

只有很少的16位Thumb指令能訪問,32位指令則不受限制,復(fù)位后的初始值是隨機的。3.堆棧寄存器(R13)又稱“堆棧指針SP(StackPointer)”.Cortex-M3處理器內(nèi)核有兩個堆棧,但這兩個寄存器不會同時生效,根據(jù)系統(tǒng)運行狀態(tài)進行堆棧切換,以保證程序運行的快速性、安全性等要求。主堆棧指針(MSP),或?qū)懽鱏P_main,缺省堆棧指針,它由OS內(nèi)核、異常服務(wù)例程以及所有需要特權(quán)訪問的應(yīng)用程序代碼來使用。

進程堆棧指針(PSP),或?qū)懽鱏P_process。用于常規(guī)的應(yīng)用程序代碼(不處于異常服務(wù)例程中時)。Cortex-M3寄存器(續(xù))MSP和PSP都被稱為R13,不同時呈現(xiàn)堆棧功能。但在程序中可以通過MRS/MSR指令來指定訪問具體的堆棧指針。采用PUSH指令和POP指令進行入棧和出棧操作。PUSH

{R0} ;*(-

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

{R0} ;R0=*R13++。Cortex-M3寄存器(續(xù))Cortex‐M3中的堆棧是“向下生長的滿?!薄USH和POP還能一次操作多個寄存器:PUSH{R0-R7,R12,R14} ;

保存寄存器列表

… ;

執(zhí)行處理

POP{R0-R7,R12,R14} ;

恢復(fù)寄存器列表

BXR14 ;

返回到主調(diào)函數(shù)由于R13的最低兩位被硬線連接到0,并且總是讀出0(ReadAsZero),因此堆棧的PUSH和POP操作永遠都是4字節(jié)對齊的。Cortex-M3寄存器(續(xù))R14寄存器:又稱鏈接寄存器LR(LinkedRegister)。

main

;主程序

BLfunction1;使用“分支并連接(branchandlink)”指令調(diào)用function1

…Function1

;function1的代碼

BX

LR

;函數(shù)返回Cortex-M3寄存器(續(xù))程序計數(shù)寄存器(R15)

又稱程序計數(shù)器PC(ProgramCounter)

。Cortex-M3中的指令是隸屬于Thumb2指令集,且至少是半字對齊的,理論上講,PC的LSB總是讀回0。在編寫分支指令時,無論是直接寫PC的值還是使用分支指令,都必須保證加載到PC的數(shù)值是奇數(shù)(即LSB=1),用以表明當前指令在Thumb-2狀態(tài)下執(zhí)行。倘若寫了0,則視為企圖轉(zhuǎn)入ARM模式,Cortex-M3將產(chǎn)生一個fault異常。Cortex-M3內(nèi)部使用了指令流水線,讀取PC內(nèi)容時返回的值是當前指令的地址+4。例:

0x1000:

MOVR0,PC;R0=0x1004Cortex-M3寄存器(續(xù))三類特殊功能寄存器程序狀態(tài)寄存器組(ProgramStatusRegister,PSRs)中斷屏蔽寄存器組(PRIMASK,FAULTMASK,BASEPRI)控制寄存器(CONTROL)Cortex-M3寄存器(續(xù))特殊功能寄存器,有預(yù)定義的功能,只能采用MSR和MRS指令進行訪問。指令訪問的格式為:MRS<gp_reg>,<special_reg>;讀特殊功能寄存器(Special_reg)的值到通用寄存器(gp_reg)MSR<special_reg>,<gp_reg>;寫通用寄存器(gp_reg)的值到特殊功能寄存器(Special_reg)Cortex-M3寄存器(續(xù))①程序狀態(tài)寄存器組(PSRs或xPSR),按位段劃分為三個子狀態(tài)寄存器:

應(yīng)用程序PSR(APSR):占據(jù)第27-31位中斷號PSR(IPSR)

:占據(jù)第0-8位,只讀執(zhí)行PSR(EPSR):占據(jù)第10-15和24-26位,只讀當使用三合一的方式訪問時,應(yīng)使用名字“xPSR”或者“PSR”PSR“PSR”。Cortex-M3寄存器(續(xù))Cortex-M3程序狀態(tài)寄存器的Bits描述符號Bits含義N[31]負Z[30]零C[29]進位/借位V[28]溢出Q[27]置頂飽和標記ICI/IT[26:25],[15:10]中斷可持續(xù)指令(ICI)位/IF-THEN指令狀態(tài)位T[24]Thumb-2狀態(tài),恒為1ExceptionNumber[9:0]中斷(異常)號中斷號中斷號PSR(IPSR)

:占據(jù)第0-8位;ExceptionNumber=0:表示基礎(chǔ)級別的線程上下文,無被激活異常。ExceptionNumber=n:表示向量表位置n處的異常發(fā)生,例如:n=2表示NMI非屏蔽中端,n=15表示SysTick中斷請求,n=16+m表示中斷號

INTISR[m])。P53IT/ICI標志位執(zhí)行PSR(EPSR):占據(jù)第10-15和24-26位;IT/ICI標志位:包含IF-THEN指令的基礎(chǔ)條件碼和支持中斷繼續(xù)執(zhí)行的相關(guān)信息。多寄存器加載(LDM)和存儲(STM)操作是可中斷的;EPSR的ICI區(qū)用來保存從產(chǎn)生中斷的點繼續(xù)執(zhí)行多寄存器加載和存儲操作時所必需的信息;LDM/STM指令可以利用ICI(interrupt-continuableinformation)繼續(xù)執(zhí)行被中斷的程序。但包含在IT指令塊中的LDM/STM指令無此功能,因為IT與ICI域占用相同的比特位。T標志位:指示Thumb工作狀態(tài)。對于Cortex-M3微處理器T=1恒成立;T=0將引發(fā)異常,因為Cortex-M3無法執(zhí)行ARM指令。PSR的訪問與修改EPSR可以使用MRS讀取,但只能被間接修改。當使用三合一的方式訪問時,應(yīng)使用名字“xPSR”或者“PSR”。發(fā)生異常時,合體后的寄存器xPSR被自動全部壓入堆棧。Cortex-M3寄存器(續(xù))中斷屏蔽寄存器組(PRIMASK,FAULTMASK和

BASEPRI)名稱功能描述PRIMASK這是個只有1個bit的寄存器。當它置1時,就關(guān)掉所有可屏蔽的異常(中斷)

,只剩下NMI和硬fault可以響應(yīng)。它的缺省值是0,表示沒有關(guān)中斷。FAULTMASK這是個只有1個bit的寄存器。當它置1時,只有NMI才能響應(yīng),所有其它的異常,包括中斷和fault,通通失效。它的缺省值也是0,表示沒有關(guān)異常。BASEPRI這個寄存器最多有9個bits(由優(yōu)先級的位數(shù)決定)。它定義了被屏蔽優(yōu)先級的閾值。當它被設(shè)成某個值后,所有優(yōu)先級號大于等于此值的中斷都被關(guān)閉(優(yōu)先級號越大,優(yōu)先級越低)。但若被設(shè)成0,則不關(guān)閉任何中斷,0也是缺省值。Cortex-M3寄存器(續(xù))只有在特權(quán)級下,才允許使用MRS/MSR指令訪問PRIMASK、FAULTMASK,以及BASEPRI:MRSR0,BASEPRI ;讀取BASEPRI寄存器內(nèi)容到R0中

MRSR0,FAULTMASK ;讀取FAULTMASK寄存器內(nèi)容到R0中MSRBASEPRI,R0 ;寫入R0寄存器內(nèi)容到BASEPRI中MSRFAULTMASK,R0 ;寫入R0寄存器內(nèi)容到FAULTMASK中MSRPRIMASK,R0 ;寫入R0寄存器內(nèi)容到PRIMASK中為了快速地開關(guān)中斷,可使用CPS指令:

CPSIDI ;PRIMASK=1,關(guān)中斷

CPSIEI ;PRIMASK=0,開中斷

CPSIDF ;FAULTMASK=1,關(guān)異常

CPSIEF ;FAULTMASK=0,

開異常Cortex-M3寄存器(續(xù))PRIMASK、BASEPRI可用于時間關(guān)鍵任務(wù)的處理;當某個任務(wù)崩潰時,F(xiàn)AULTMASK可被OS用于暫時關(guān)閉微處理器FAULT處理功能,以避免任務(wù)崩潰時大量的FAULT使得CPU應(yīng)接不暇。Cortex-M3寄存器(續(xù))控制寄存器(CONTROL),用于定義特權(quán)級別,還用于選擇當前使用哪個堆棧指針。位功能描述CONTROL[0]僅當在特權(quán)級下操作時才允許寫該位。一旦進入了用戶級,唯一返回特權(quán)級的途徑,就是觸發(fā)中斷異常,再由中斷服務(wù)例程改寫該位。

0表示特權(quán)級的線程模式

1表示用戶級的線程模式注意:Handler模式永遠都是特權(quán)級的CONTROL[1]堆棧指針選擇

0表示選擇主堆棧指針MSP(復(fù)位后缺省值)

1表示選擇進程堆棧指針PSP②在handler模式下,只允許使用MSP。在線程或基礎(chǔ)級,可以使用PSP。在線程模式中則可以為0(特權(quán)級)或1(用戶級)。僅當處于特權(quán)級的線程模式下,此位才可寫。其它場合下禁止寫此位。Control寄存器與堆棧、工作模式Cortex-M3寄存器(續(xù))CONTROL寄存器也是通過MRS和MSR指令來操作的:

MRSR0,CONTROLMSRCONTROL,R0Cortex-M3RegisterFileR0R1R2R3R4R5R6R7R8R9R10R11R12R13(MSP)R14(LR)PCxPSRR13(PSP)Thread/HandlerThreadCortex-M3RegisterFile:18PhysicalRegistersRegistersetjust18registerscomparedwith38registersfortraditionalARMHelpsreduceareaofCortex-M3CoreEasiertounderstandandrememberSame‘visible’registerfileasanyotherARMarchitecturedeviceAllowingUnifiedAssemblertomimicequivalentARMinstructionsinThumb-2Noshadow(mode)registersTwostackpointers–MainandProcess2.3存儲器系統(tǒng)存儲器系統(tǒng)Cortex-M3是一個32位處理器,支持4GB存儲空間,與ARM架構(gòu)相比,有很多優(yōu)點:預(yù)定義存儲器映射和總線配置;支持“位帶(bit‐band)”操作;支持非對齊訪問和互斥訪問;支持小端和大端兩種存儲格式;存儲器系統(tǒng)Cortex-M3內(nèi)核只有一個單一固定的存儲器映射,提高內(nèi)存訪問速度,便于軟件移植。例如:各款Cortex-M3單片機的NVIC和MPU都在相同的位置布設(shè)寄存器,使得它們變得通用;片上外設(shè)的寄存器映射到外設(shè)區(qū)(0x40000000~0x5FFFFFFF)中的某個位置,就可以簡單地以訪問內(nèi)存的方式來訪問這些外設(shè)的寄存器,從而對外設(shè)功能進行配置,并施加控制。存儲器管理(續(xù))Cortex-M3微處理器存儲器映射存儲器映射(續(xù))代碼區(qū)(Code,0x00000000~0x1FFFFFFF,512MB),主要用于存放程序代碼。當然,代碼也可存放在內(nèi)部SRAM區(qū)以及外部RAM區(qū)。因指令總線與數(shù)據(jù)總線是分開的,為使取指和數(shù)據(jù)訪問各自使用自己的總線,最理想的是把程序放到代碼區(qū)。內(nèi)部SRAM區(qū)(SRAM,0x20000000~0x3FFFFFFF,512MB),用于讓芯片制造商連接片上的SRAM,這個區(qū)通過系統(tǒng)總線來訪問。該區(qū)最底部1MB地址范圍是“位帶區(qū)”(0x20000000~0x200FFFFF),可存放8M個位(bit)變量;與此對應(yīng),該內(nèi)部SRAM區(qū)有一個32MB的“位帶別名(alias)區(qū)”(0x22000000~0x23FFFFFF),用一個字(4字節(jié))來代表每一個位帶區(qū)的每一個位。這樣對每一個字進行讀寫時,實際上就是對位帶區(qū)的每一個位進行讀寫。存儲器映射(續(xù))位帶操作,只適用于數(shù)據(jù)訪問,不適用于取指。通過位帶的功能,可以把多個布爾型數(shù)據(jù)打包在單一的字中,卻依然可以從位帶別名區(qū)中,像訪問普通內(nèi)存一樣地使用它們。位帶別名區(qū)中的訪問操作是原子的,消滅了傳統(tǒng)的“讀-改-寫”三步曲以及由此產(chǎn)生的被中斷的可能。該特性可以顯著提高位操作的效率和安全性,對許多底層軟件開發(fā)特別是操作系統(tǒng)和驅(qū)動程序具有重要意義。存儲器映射(續(xù))片內(nèi)外設(shè)區(qū)(Peripheral,0x40000000~0x5FFFFFFF,512MB),用于映射外設(shè)芯片的寄存器,主要由片內(nèi)外設(shè)使用。該區(qū)也有一個32MB的位帶別名,以便于快捷地訪問外設(shè)寄存器。該外設(shè)區(qū)內(nèi)不允許執(zhí)行指令。外部RAM區(qū)(ExternalRam,0x60000000~0x9FFFFFFF,256KB)和外部設(shè)備區(qū)(ExternalDevice,0xA0000000~0xDFFFFFFF,768KB)。外部RAM區(qū)用于連接外部RAM;外部設(shè)備區(qū)用于連接外部設(shè)備。這兩個存儲區(qū)不包含位帶。兩者的區(qū)別在于外部RAM區(qū)允許執(zhí)行指令,而外部設(shè)備區(qū)則不允許。存儲器映射(續(xù))私有外設(shè)總線區(qū)(0xE0000000~0xE00FFFFF),由兩部分組成:內(nèi)部私有外設(shè)總線區(qū)(0xE0000000~0xE003FFFF,256KB)外部私有外設(shè)總線區(qū)(0xE0040000~0xE00FFFFF,768KB)

存儲器映射(續(xù))私有外設(shè)總線區(qū)(0xE0000000~0xE00FFFFF),由兩部分組成:內(nèi)部私有外設(shè)總線區(qū)(0xE0000000~0xE003FFFF,256KB)AHB私有外設(shè)總線,對應(yīng)于內(nèi)部私有外設(shè)總線區(qū),只用于Cortex-M3內(nèi)部AHB外設(shè),如NVICFPB(Flash重載和斷點單元)DWT(數(shù)據(jù)觀察點觸發(fā)器)ITM(指令跟蹤宏單元)SYSTICK等。其中,NVIC所處的區(qū)域叫做“系統(tǒng)控制空間(SCS)”,映射有SysTick、MPU以及代碼調(diào)試控制所用的寄存器。存儲器映射(續(xù))私有外設(shè)總線區(qū)(0xE0000000~0xE00FFFFF),由兩部分組成:外部私有外設(shè)總線區(qū)(0xE0040000~0xE00FFFFF,768KB)

APB私有外設(shè)總線,對應(yīng)于外部私有外設(shè)總線區(qū),用于Cortex-M3內(nèi)部APB設(shè)備,如:1.跟蹤端口接口單元(TPIU)2.嵌入式跟蹤宏單元(ETM)3.ROM表此外,Cortex-M3允許器件制造商添加其他片上APB外設(shè)到APB私有外設(shè)總線上,并通過APB接口來訪問。存儲器映射(續(xù))提供商指定區(qū)

未用的存儲器區(qū)域,由產(chǎn)品提供商指定。提供商指定區(qū)通過系統(tǒng)總線來訪問,但是不允許在其中執(zhí)行指令。采取Cortex-M3內(nèi)核的微控制器芯片制造商,可能會根據(jù)具體應(yīng)用不同,進行些微適當?shù)恼{(diào)整,并提供更詳細的存儲器映射說明。非對齊數(shù)據(jù)傳送Cortex-M3支持在單一的訪問中使用非對齊數(shù)據(jù)傳送;對于字的傳送而言,任何一個不能被4整除的地址都是非對齊的。對于半字,任何不能被2整除的地址(也就是奇數(shù)地址)都是非對齊的。非對齊數(shù)據(jù)傳送非對齊數(shù)據(jù)傳送的五種常見方式:非對齊數(shù)據(jù)傳送非對齊→對齊,由處理器總線單元來完成,但需要更多的周期;可以通過NVIC編程使之監(jiān)督地址對齊。P44,圖2-18

非對齊數(shù)據(jù)傳送在Cortex-M3中,非對齊數(shù)據(jù)傳送只發(fā)生在LDR/LDRH/LDRSH等常規(guī)數(shù)據(jù)傳送指令;其他指令不支持,如:批量數(shù)據(jù)加載/存儲指令;堆棧操作PUSH/POP;互斥訪問(LDREX/STREX);位帶操作。必須對齊!互斥訪問多任務(wù)共享某一資源,往往存在“競爭”問題。這種因為資源共享而引發(fā)的“競爭”問題,解決不好,會帶來什么問題?[例1]

鐵路訂票系統(tǒng)中的一個活動序列①甲售票點(甲事務(wù))讀出某車次的車票余額A,設(shè)A=16;②乙售票點(乙事務(wù))讀出同一車次的車票余額A,也為16;③甲售票點賣出一張車票,修改余額A←A-1,所以A為15,把A寫回數(shù)據(jù)庫;④乙售票點也賣出一張車票,修改余額A←A-1,所以A為15,把A寫回數(shù)據(jù)庫結(jié)果明明賣出兩張車票,車票余額只減少1。[例2]死鎖a=b+c;c=a+d互斥訪問互斥訪問互斥體在多任務(wù)環(huán)境中使用,也在中斷服務(wù)例程和主程序之間使用,用于共享資源的管理與調(diào)度。必須建立“互斥”性檢查機制。信號燈(量)常用來分配共享資源。當一個資源正在被一個過程使用時,該信號燈用于指示該共享資源被占用。SWP指令(swap)用于在傳統(tǒng)的ARM處理器上進行信號燈操作?;コ庠L問在傳統(tǒng)的ARM處理器中,讀/寫訪問往往使用同一總線,互斥性檢查可以通過SWP指令來實現(xiàn),從而可以避免不同任務(wù)“競爭”共享資源而出現(xiàn)的“死鎖”或“錯誤”。然而,在ARMV7架構(gòu)中,讀/寫訪問各自使用不同的總線,導(dǎo)致SWP無法再保證操作的原子性。Cortex-M微處理器基于ARMV7架構(gòu),互斥性檢查必須用另外的機制實現(xiàn)?;コ庠L問在互斥訪問操作下,Cortex-M3微處理器允許互斥體所在的地址被其它總線控制器訪問,也允許被運行在本機上的其它任務(wù)訪問,但是能夠“駁回”有可能導(dǎo)致競爭條件的互斥寫操作?;コ庠L問分為加載和存儲,相應(yīng)的指令對為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

;如果發(fā)現(xiàn)STREX被駁回,則重試。注意:Rd一般由共享資源的當前占有者設(shè)定,并能為欲使用該資源的其他任務(wù)所讀取。數(shù)據(jù)存儲格式數(shù)據(jù)存儲格式:小端模式和大端模式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,字節(jié)

D[7:0]0x1001,字節(jié)

D[7:0]

0x1002,字節(jié)

D[7:0]

0x1003,字節(jié)D[7:0]

數(shù)據(jù)存儲格式大端模式地址,長度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,字節(jié)D[7:0]

0x1001,字節(jié)

D[7:0]

0x1002,字節(jié)

D[7:0]

0x1003,字節(jié)

D[7:0]數(shù)據(jù)存儲格式Cortex-M3在復(fù)位時確定使用哪種“端模式”,且運行時不得更改,一般默認小端模式。指令預(yù)取永遠使用小端模式,在配置控制存儲空間的訪問也永遠使用小端模式(包括NVIC,FPB之流)。另外,私有外設(shè)總線區(qū)0xE000_0000至0xE00F_FFFF也永遠使用小端模式。針對采用大端模式工作的外設(shè)時,可以使用REV/REVH指令來完成端模式的轉(zhuǎn)換。存儲保護單元

MPUMPU可以實施對存儲器(主要是內(nèi)存和外設(shè)寄存器)的保護,以使軟件更加健壯和可靠。MPU可以提供以下功能:

阻止用戶應(yīng)用程序破壞操作系統(tǒng)使用的數(shù)據(jù)

。

阻止一個任務(wù)訪問其它任務(wù)的數(shù)據(jù)區(qū),從而把任務(wù)隔開。

可以把關(guān)鍵數(shù)據(jù)區(qū)設(shè)置為只讀,從根本上消除了被破壞的可能。

檢測意外的存儲訪問,如堆棧溢出、數(shù)組越界。

MPU設(shè)置存儲器區(qū)段的訪問屬性。

內(nèi)存的訪問屬性通常,如果提供了外部內(nèi)存,芯片制造商還要附加一個內(nèi)存控制器,它可以根據(jù)可否緩存的設(shè)置,來管理對片內(nèi)和片外RAM的訪問操作。Cortex-M3片內(nèi)沒有配備緩存,也沒有緩存控制器,但是允許在外部添加緩存和控制器。存儲器訪問許可MPU可以在地址空間中劃出若干個存儲區(qū)段,并為不同的存儲區(qū)段規(guī)定不同的訪問許可權(quán)限。Cortex-M3的MPU共支持8個存儲區(qū)段,并允許把每個存儲區(qū)段進一步劃分成更小的子區(qū)段。此外,還允許啟用一個后臺存儲區(qū)段(即沒有MPU時的全部地址空間),不過它是只能由特權(quán)級享用。存儲器訪問許可MPU定義的存儲區(qū)段可以相互交迭,越段使用。如果某塊內(nèi)存落在多個存儲區(qū)段中,則訪問屬性和權(quán)限將由編號最大的存儲區(qū)段來決定。比如,若1號存儲區(qū)段與4號存儲區(qū)段交迭,則交迭的部分受4號存儲區(qū)段控制。存儲保護單元MPUCortex-M微處理器,出于數(shù)據(jù)的安全性需求,可以借助于MPU,可對特權(quán)級和用戶級數(shù)據(jù)訪問施加不同的訪問限制。常見的情況是,由操作系統(tǒng)利用MPU對特權(quán)級代碼、數(shù)據(jù),以及操作系統(tǒng)本身施加保護,以避免被其他用戶程序所破壞。存儲保護單元MPU當需要阻止用戶程序訪問特權(quán)級的數(shù)據(jù)和代碼時,可以啟用MPU。啟用MPU后,就不得再訪問定義之外的地址區(qū)間,也不得訪問未經(jīng)授權(quán)的存儲區(qū)段。否則,將以“違規(guī)訪問”處理,觸發(fā)MemoryManagefault。存儲保護單元MPUCortex-M3有一個缺省的存儲訪問許可,它能防止使用戶代碼訪問系統(tǒng)控制存儲空間,保護NVIC、MPU等關(guān)鍵部件。缺省訪問許可在下列條件時生效:

沒有配備MPU配備了MPU,但是MPU被除能存儲保護單元MPU缺省的存儲器訪問許可權(quán)限如下:地址范圍緩存?緩沖?可執(zhí)行?訪問(讀寫)?代碼區(qū)

00000000~1FFFFFFFWT(writethrough)可執(zhí)行,緩沖無限制片內(nèi)SRAM20000000~3FFFFFFFWB-WA(WriteBack,WriteAllocated)可執(zhí)行,緩沖無限制片上外設(shè)

40000000~5FFFFFFF非緩存非緩沖無限制外部RAM60000000~7FFFFFFFWB-WA可執(zhí)行無限制外部RAM80000000~9FFFFFFFWT可執(zhí)行無限制外部外設(shè)

A0000000~DFFFFFFF非緩沖,不可執(zhí)行無限制ITME0000000~E0000FFF非緩存非緩沖,不可執(zhí)行可以讀。對于寫操作,除了用戶級下允許時的stimulus端口外,全部忽略

DWTE0001000~E0001FFF非緩存非緩沖,不可執(zhí)行阻止訪問,訪問會引發(fā)一個總線faultFPBE0002000~E0003FFF非緩存非緩沖,不可執(zhí)行阻止訪問,訪問會引發(fā)一個總線faultNVICE000E000~E000EFFF非緩存非緩沖,不可執(zhí)行阻止訪問,訪問會引發(fā)一個總線fault。但有個例外:軟件觸發(fā)中斷寄存器可以被編程為允許用戶級訪問。內(nèi)部PPBE000F000~E003FFFF非緩存非緩沖,不可執(zhí)行阻止訪問,訪問會引發(fā)一個總線faultTPIUE0040000~E0040FFF非緩存非緩沖,不可執(zhí)行阻止訪問,訪問會引發(fā)一個總線faultETME0041000~E0041FFF非緩存非緩沖,不可執(zhí)行阻止訪問,訪問會引發(fā)一個總線fault外部PPBE0042000~E0042FFF非緩存非緩沖,不可執(zhí)行阻止訪問,訪問會引發(fā)一個總線faultROM表

E00FF000~E00FFFFF非緩存非緩沖,不可執(zhí)行阻止訪問,訪問會引發(fā)一個總線fault供應(yīng)商指定

E0100000~FFFFFFFF非緩存非緩沖,不可執(zhí)行無限制加載時域&運行時域

程序從ROM或RAM中加載后運行,加載位置(運行前的位置)與運行時的位置,可能相同,也可能不同。加載時域:程序的加載時域就是指程序燒入Flash中或?qū)懭隦AM中的狀態(tài)運行時域:

運行時域是指程序執(zhí)行時的狀態(tài)Scatter文件:對加載時域和運行時域進行描述。例1:一個加載時域,3個連續(xù)運行時域RW屬性的輸出段RO屬性的輸出段0x0RAM加載時地址映射關(guān)系(b)運行時地址映射關(guān)系0x8000RW屬性的輸出段RO屬性的輸出段0x0RAM0x8000單一加載時域ZI屬性的輸出段RO屬性的運行時域RW屬性的運行時域ZI屬性的運行時域

映像文件包括1個加載時域、3個運行時域(ZI:ZeroinitializedR/WData;RW:R/WData;RO:Code+ROData),加載地址與運行地址相同,無須進行數(shù)據(jù)移動加載時地址映射關(guān)系(b)運行時地址映射關(guān)系0x40000RW屬性的輸出段RO屬性的輸出段0x00x8000ZI屬性的輸出段RO屬性的運行時域RW屬性的運行時域ZI屬性的運行時域例2:一個加載時域,3個不連續(xù)運行時域

映像文件包括1個加載時域、3個不連續(xù)運行時域

RO屬性的輸出段,加載地址與運行地址相同,運行時不需進行數(shù)據(jù)移動RW屬性的輸出段,加載地址與運行地址不同,運行時需要進行數(shù)據(jù)移動RW屬性的輸出段RO屬性的輸出段0x0RAM0x8000單一加載時域ROM0x40000RAMROM0x40000RW屬性的輸出段RO屬性的輸出段0x0RAM加載時地址映射關(guān)系(b)運行時地址映射關(guān)系0x80000x40000RW屬性的輸出段RO屬性的輸出段0x0RAM0x8000第2個加載時域第1個加載時域ZI屬性的輸出段RO屬性的運行時域RW屬性的運行時域ZI屬性的運行時域例3:兩個加載時域,3個不連續(xù)運行時域

映像文件包括2個加載時域、3個運行時域

RO、RW屬性的輸出段,加載地址與運行地址相同,運行時不需進行數(shù)據(jù)移動加載時域與運行時域一個映像文件需要指定一個初始入口點(initialentrypoint)初始入口點必須位于一個固定域中,即加載地址必須與運行地址相同。初始入口地址,一般應(yīng)(可)由開發(fā)人員確定。由于嵌入式微控制器采取物理地址進行代碼和數(shù)據(jù)的存放,因此入口地址的確定應(yīng)確保代碼的正確、可靠運行。2.4位帶操作位帶操作Cortex-M3存儲器包括兩個位帶區(qū),分別為SRAM和外設(shè)存儲區(qū)域中的最低的1MB。SRAM別名區(qū)和外設(shè)別名區(qū)的一個字分別被映射為相應(yīng)的bit-band區(qū)的一個位,即通過映射實現(xiàn)綁定。位段區(qū)的偏移值范圍為0x0~0xFFFFF,SRAM位帶別名區(qū)的偏移值范圍則為0x22000000~0x23FFFFFF,外設(shè)存儲別名區(qū)的偏移值范圍則為0x42000000~0x43FFFFFF。位帶操作(續(xù))所謂“位帶操作”,就是:(1)對32MBSRAM別名區(qū)的訪問映射為對1MBSRAM的bit-band區(qū)的訪問。(2)對32MB外設(shè)別名區(qū)的訪問映射為對1MB外設(shè)bit-band區(qū)的訪問。映射公式:bit_word_addr=bit_band_alias_base+(byte_offset×32)+(bit_number×4)bit_word_addr是別名存儲器區(qū)中字的地址,它映射到某個目標位。bit_band_alias_base是別名區(qū)的基址,即起始地址。byte_offset是包含目標位的字節(jié)在位帶區(qū)里的序號。bit_number是位帶區(qū)目標位所在字節(jié)中的位置(0-7)。位帶操作(續(xù))例1:位帶區(qū)SRAM地址為0x20000300的字節(jié)中的位2,其位帶別名區(qū)的映射地址:?

位帶操作(續(xù))例1:位帶區(qū)SRAM地址為0x20000300的字節(jié)中的位2,其位帶別名區(qū)的映射地址:?=0x22000000+(0x300*32)+(2*4).0x22006008=0x22000000+(0x300*32)+(2*4).對0x22006008地址的寫操作和對SRAM中地址0x20000300字節(jié)的位2執(zhí)行“讀--改--寫”操作有著相同的效果。位帶操作(續(xù))例2:

(1)地址

?的別名字映射為0x200FFFFF的bit-band字節(jié)的位0:

(2)地址?的別名字映射為0x200FFFFF的bit-band字節(jié)的位7:

(3)地址?的別名字映射為0x20000000的bit-band字節(jié)的位0:

(4)地址?的別名字映射為0x20000000的bit-band字節(jié)的位7:位帶操作(續(xù))

例2:

(1)地址0x23FFFFE0的別名字映射為0x200FFFFF的bit-band字節(jié)的位0:0x22000000+(0xFFFFF*32)+0*4=0x23FFFFE0

(2)地址0x23FFFFEC的別名字映射為0x200FFFFF的bit-band字節(jié)的位7:0x22000000+(0xFFFFF*32)+7*4=0x23FFFFEC

(3)地址0x22000000的別名字映射為0x20000000的bit-band字節(jié)的位0:0x22000000+(0*32)+0*4=0x22000000

(4)地址0x220001C的別名字映射為0x20000000的bit-band字節(jié)的位7:0x22000000+(0*32)+7*4=0x2200001C位帶操作(續(xù))例2圖示位帶操作(續(xù))怎樣利用“位帶操作”進行位帶區(qū)的“讀—改—寫

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論