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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

--存儲(chǔ)器保護(hù)單元。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)時(shí)鐘(SYSTICK)

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

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

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

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

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

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

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

總線矩陣

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

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

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

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

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

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

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

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

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

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

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

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

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

基于APB總線協(xié)議的32位總線,用于訪問(wèn)私有外設(shè),默認(rèn)映射到0xE0040000~0xE00FFFFF內(nèi)存地址段。由于TPIU、ETM以及ROM表占用部分空間,實(shí)際可用地址區(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位,存儲(chǔ)器接口寬度也是32位,Cortex-M3內(nèi)核擁有獨(dú)立的指令總線和數(shù)據(jù)總線,其尋址能力均為4G,且共享同一個(gè)存儲(chǔ)器空間,取指與數(shù)據(jù)訪問(wèn)可同時(shí)進(jìn)行。P29Cortex-M3廣泛采用時(shí)鐘選通等技術(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)

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

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

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

{R0} ;*(-

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

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

保存寄存器列表

… ;

執(zhí)行處理

POP{R0-R7,R12,R14} ;

恢復(fù)寄存器列表

BXR14 ;

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

main

;主程序

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

…Function1

;function1的代碼

BX

LR

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

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

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

0x1000:

MOVR0,PC;R0=0x1004Cortex-M3寄存器(續(xù))三類特殊功能寄存器程序狀態(tài)寄存器組(ProgramStatusRegister,PSRs)中斷屏蔽寄存器組(PRIMASK,FAULTMASK,BASEPRI)控制寄存器(CONTROL)Cortex-M3寄存器(續(xù))特殊功能寄存器,有預(yù)定義的功能,只能采用MSR和MRS指令進(jìn)行訪問(wèn)。指令訪問(wèn)的格式為: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),按位段劃分為三個(gè)子狀態(tài)寄存器:

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

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

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

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

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

,只剩下NMI和硬fault可以響應(yīng)。它的缺省值是0,表示沒(méi)有關(guān)中斷。FAULTMASK這是個(gè)只有1個(gè)bit的寄存器。當(dāng)它置1時(shí),只有NMI才能響應(yīng),所有其它的異常,包括中斷和fault,通通失效。它的缺省值也是0,表示沒(méi)有關(guān)異常。BASEPRI這個(gè)寄存器最多有9個(gè)bits(由優(yōu)先級(jí)的位數(shù)決定)。它定義了被屏蔽優(yōu)先級(jí)的閾值。當(dāng)它被設(shè)成某個(gè)值后,所有優(yōu)先級(jí)號(hào)大于等于此值的中斷都被關(guān)閉(優(yōu)先級(jí)號(hào)越大,優(yōu)先級(jí)越低)。但若被設(shè)成0,則不關(guān)閉任何中斷,0也是缺省值。Cortex-M3寄存器(續(xù))只有在特權(quán)級(jí)下,才允許使用MRS/MSR指令訪問(wèn)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中為了快速地開(kāi)關(guān)中斷,可使用CPS指令:

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

CPSIEI ;PRIMASK=0,開(kāi)中斷

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

CPSIEF ;FAULTMASK=0,

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

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

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

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

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

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

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

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

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

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

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

;檢查STREX是否被駁回

BEQTryInc

;如果發(fā)現(xiàn)STREX被駁回,則重試。注意:Rd一般由共享資源的當(dāng)前占有者設(shè)定,并能為欲使用該資源的其他任務(wù)所讀取。數(shù)據(jù)存儲(chǔ)格式數(shù)據(jù)存儲(chǔ)格式:小端模式和大端模式Cortex-M3默認(rèn)小端模式,見(jiàn)下圖:地址,長(zhǎng)度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ù)存儲(chǔ)格式大端模式地址,長(zhǎng)度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ù)存儲(chǔ)格式Cortex-M3在復(fù)位時(shí)確定使用哪種“端模式”,且運(yùn)行時(shí)不得更改,一般默認(rèn)小端模式。指令預(yù)取永遠(yuǎn)使用小端模式,在配置控制存儲(chǔ)空間的訪問(wèn)也永遠(yuǎn)使用小端模式(包括NVIC,FPB之流)。另外,私有外設(shè)總線區(qū)0xE000_0000至0xE00F_FFFF也永遠(yuǎn)使用小端模式。針對(duì)采用大端模式工作的外設(shè)時(shí),可以使用REV/REVH指令來(lái)完成端模式的轉(zhuǎn)換。存儲(chǔ)保護(hù)單元

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

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

。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

映像文件包括1個(gè)加載時(shí)域、3個(gè)不連續(xù)運(yùn)行時(shí)域

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

映像文件包括2個(gè)加載時(shí)域、3個(gè)運(yùn)行時(shí)域

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論