Cortex-M3存储器系统
一、存儲器系統的功能概覽
? 1、Cortex-CM3存儲器系統功能
?? 1)、存儲器映射是預定義的,并且還規定好了那個位置使用那條總線。
?? 2)、Cortex-CM3的存儲器系統支持“位帶”操作。
?? 3)、Cortex-CM3存儲器系統支持非對齊訪問和互斥訪問。
?? 4)、Cortex-CM3的存儲器系統支持both大端配置和小端配置。
二、存儲器映射
? 1、Cortex-CM3只有一個單一固定的存儲器映射。這極大方便了軟件在各種Cortex-CM3單片機間的移植。
? 2、存儲器的一些位置用于調試組件等私有外設,這個地址被稱為“私有外設區”。私有外設區的組件包括:
?? 1)、閃存地址重載及斷點單元(FPB)。
?? 2)、數據觀察點單元(DWT)。
?? 3)、指令跟蹤宏單元(ITM)。
?? 4)、嵌入式跟蹤宏單元(ETM)。
?? 5)、跟蹤端口接口單元(TPIU)。
?? 6)、ROM表。
? 3、Cortex-CM3的地址空間是4GB,程序可以在代碼區,內部SRAM區以及RAM區執行。4GB粗線條劃分:
?? 1)、內部SRAM區的大小是512MB,用于讓芯片制造商連接片上的SRAM,這個區通過系統總線來訪問。在此區的下部,有一個1MB的位帶區,該位帶區還有一個對應的
???????????? 32MB的“位帶別名區”,容納了8M個“位變量”。位帶區對應的是最低的1MB地址范圍,而位帶別名區里面的每個字對應位帶區的一個比特。位帶操作只適用于數據訪問,
???????????? 不適用與取指操作。
?? 2)、地址空間另一個512范圍由片上外設(的寄存器)使用。這個區也有一條32MB的位帶別名,以便于快捷的訪問外設寄存器。
?? 3)、還有兩個1GB的范圍,分別用于連接外部RAM和外部設備,它們之間沒有位帶。兩者的區別在于外部RAM區允許執行指令,而外設設備區則不允許。
?? 4)、最后剩下0.5GB的地帶是Cortex-CM3內核所在區域,包括系統級組件,內部私有外部總線S,外部私有外部總線S,以及由提供者定義的系統外設。
?? 5)、私有外部總線有兩條
??? I、AHB外設總線,只用于Cortex-CM3內部的AHB設備,它們是:NVIC,FPB,DWT和ITM。
??? II、APB外設總線,即用于Cortex-CM3內部的APB設備,也用于外部設備
?? 6)、NVIC所處的區域叫做“系統控制空間(SCS)”在SCS里面還有SysTick、MPU以及代碼調試控制所用的寄存器:
三、存儲器訪問屬性S
? 1、Cortex-CM3為存儲器做了映射之外,還為存儲器的訪問規定了4中屬性:
?? 1)、可否緩沖(Bufferable)
?? 2)、可否緩存(Cacheable)
?? 3)、可否執行(Executable)
?? 4)、可否共享(Shareable)
? 2、如果配置了MPU,則可以通過它配置不同的存儲區,并且覆蓋缺省的訪問屬性。
四、存儲器的缺省訪問許可
? 1、Cortex-CM3有一個缺省的訪問許可,它能防止使用戶代碼訪問系統控制存儲空間,保護NVIC,MPU等關鍵組件。缺省訪問許可在以下條件時生效:
?? 1)、沒有配置MPU。
?? 2)、配置了MPU,但是MOPU被除能。
? 2、存儲器的缺省訪問許可
四、位帶操作
?一)、簡介
? 1、支持位帶操作后,可以使用普通的加載/存儲指令來對單一的比特進行讀寫。在Cortex-CM3中,有兩個區實現了位帶。其中一個是SRAM區的最低1MB,第二個則是片內外
??????? 設區的最低1MB范圍。這兩個區的地址除了可以像普通的RAM使用外,它也都有自己的“位帶別名區”,位帶別名區把每個比特膨脹成一個32位的字。
??1)、位帶區與別名區的膨脹對應關系圖A
?? 2)、位帶區與別名區的膨脹對應關系圖B
? 2、Cortex-CM3用如下術語來表示位帶存儲的地址區
?? 1)、位帶區:支持位帶操作的地址區。
?? 2)、位帶別名:對別名地址的訪問最總作用到位帶區的訪問上。(注意:這中途有一個地址映射過程)
? 3、在位帶區中每個比特都都映射到別名地址區的一個字——這是只有LSB有效的字。當一個別名地址被訪問時,會先把改地址變換成位帶地址。
?? 1)、對于讀操作,讀取位帶地址中的一個字,再把需要的位右移到LSB,并把LSB返回。
?? 2)、對于寫操作,把需要寫的位左移到對應的位序號處,然后執行一個原子的“讀-改-寫”過程。
? 4、支持位帶操作的兩個內存區的范圍是:
?? 1)、0x2000_0000-0x000F_FFFF(SRAM區中的最低1MB)和0x4000_0000-0x400F_FFFF(片上外設區中的最低1MB)。
?? 2)、對于SRAM位帶區的某個比特,記它所在字節地址為A,位序號為n,則該比特在別名區的地址是:
?? 3)、對于片上外設位帶區的某個比特,記它所在字節地址為A,位序號為n,則該比特在別名區的地址是:
? 5、位帶地址映射
?? 1)、SRAM區中的位帶地址映射
?? 2)、片上外設區中的位帶地址映射
?二)、位帶操作的優越性
?? 1、位帶操作對硬件I/O密集型的底層程序提供了很大方便。
?
?? 2、位帶操作可用來化簡跳轉的判斷。是代碼更整潔。
? 3、在多任務中用于實現共享資源在任務間的“互鎖”訪問。
?三)、其他數據長度上的位帶操作
? 1、位帶操作并不限于以字為單位的傳送。亦可以按半子節和字節為單位傳送。
五、在C語言中使用位帶操作
? 1、C編譯器中并沒有直接支持位帶操作。欲在在C中使用位帶操作,最簡單的做法就是#define一個位帶別名區的地址。為了簡化位帶操作,也可以定義一些宏。
? 2、當使用位帶功能時,要訪問的變量必須用vollatile來定義。
六、非對齊數據傳送
? 1、Cortex-CM3支持在單一的訪問中使用非(地址)對齊的傳送,數據存儲器的訪問無需對齊。
? 2、非對齊傳送實例
? 3、在Cortex-CM3中,非對齊的數據傳送只發生在常規的數據傳送指令中,其他的指令則不支持:
?? 1)、多個數據的加載存儲(LDM/STM)。
?? 2)、棧堆操作(PUSH/POP)。
?? 3)、互斥訪問(LDREX/STREX)。
?? 4)、位帶操作。
? 4、應該養成好習慣,總是保持地址對齊。為此可以變成NVIC,使之監督地址對齊。
七、互斥訪問
? 1、在Cortex-CM3中,用互斥體訪問取代了ARM處理器中的SWP指令。
? 2、互斥訪問的理念同SWP非常相似,不同點在于:在互斥訪問操作下,允許互斥體所在的總線被其他master訪問,也允許被其他運行在本機上的任務訪問,但是Cortex-CM3
??????? 能駁回有可能導致竟態條件的互斥訪問。
? 3、互斥訪問分為加載/存儲,相應的指令為LDREX/STREX,LDREXH/STREXH,LDREXB/STREXB,分別對應于字/半字/字節
? 4、使用方式(以LDREX/STREX為例)
?? 1)、語法格式
?? 2)、LDREX指令與LDR相同。而STREX不同,STREX指令的執行是可以被駁回的。
??? I、當處理器同意執行STREX,Rxf的值會被存儲到(Rn+Offset)處,并且把Rd的值更新。
??? II、若處理器駁回了STREX的執行,則不會發生存儲動作,并且把Rd的值更新為1。
?? 3)、駁回規則:只有在LDREX執行后最近的一條STREX才能成功執行。其他情況下,駁回此STREX
??? I、中途有其他STR指令執行。
??? II、中途有其他的STREX執行。
?? 4)、當時用互斥訪問時,LDREX/STREX指令必須成對使用。
八、端模式
? 1、Cortex-CM3支持both小端模式和大端模式。在絕大多數情況下,Cortex-CM3都是用小端模式——為了避免不必要的麻煩,推薦使用小端模式。
? 2、Cortex-CM3中對大端模式的定義與ARM7的不同(小端定義都相同)。在ARM7中大端模式稱為“字不變大端”,而在Cortex-CM3中,使用的是“字節不變大端”。
?? 1)、Cortex-CM3的字節不變大端:存儲器視圖
?? 2)、Cortex-CM3的字節不變大端:在ABH上的數據
?? 3)、ARM7字節不變大端:在ABH上的數據
? 3、在Cortex-CM3,是在復位時確定使用那種端模式的,且運行時不得改變。指令預取永遠使用小端模式,在配置控制存儲空間的訪問也永遠小端模式(包括NVIX,FPB之
??????? 流)。另外外部私有總線地址區0xE0000000至0xE00FFFFF也永遠使用小端模式。
總結
以上是生活随笔為你收集整理的Cortex-M3存储器系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Impala:大数据丛林中敏捷迅速的黑斑
- 下一篇: linux内核head.S文件分析