您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!
一、匯編語(yǔ)言基礎(chǔ)
一)、匯編語(yǔ)言:基本語(yǔ)法
1、匯編指令最典型的書(shū)寫(xiě)模式:
標(biāo)號(hào)
操作碼 操作數(shù)1, 操作數(shù)2,... ;注釋
1)、標(biāo)號(hào)是可選的,如果有,它必須頂格寫(xiě)。標(biāo)號(hào)的作用是讓匯編器來(lái)計(jì)算程序轉(zhuǎn)移的地址。
2)、操作碼是指令的助記符,它的前面必須有至少一個(gè)空白符,通常使用提個(gè)Tab鍵來(lái)產(chǎn)生。
3)、操作碼后面往往跟若干個(gè)操作數(shù),而第一個(gè)操作數(shù),通常都給出本指令執(zhí)行結(jié)果的存儲(chǔ)地。不同指令需要不同數(shù)目的操作數(shù),并且對(duì)操作數(shù)的語(yǔ)法要求也可以不同。
4)、注釋均以;開(kāi)頭,它的有無(wú)不影響匯編操作,只是給程序員看的,讓程序員更加可以理解代碼。
2、可以使用EQU指示子來(lái)定義常數(shù),也可以使用DCB來(lái)定義一串字節(jié)常數(shù)——允許以字符串的形式表達(dá),還可以使用DCD來(lái)定義一串32位整數(shù)。
3、如果匯編器不能識(shí)別某些特殊指令的助記符,就需要“手工匯編”,查出該指令的確切二進(jìn)制機(jī)器碼,然后使用DCI編譯器指示器。
4、不同匯編器的指示字和語(yǔ)法都可以不同。以上以ARM匯編器說(shuō)明,如使用其他匯編器,細(xì)看說(shuō)明和實(shí)例代碼。
二)、匯編語(yǔ)言:后綴的使用
1、在ARM處理器中,指令可以帶有后綴的:
2、在Cortex-CM3中,對(duì)條件后綴的使用有限制,只有轉(zhuǎn)移指令(B指令)才可以隨意使用。而對(duì)于其他指令,Cortex-CM3引入IF-THEN模塊,在這個(gè)塊中才可以加后綴,且
必須加后綴。
三)、匯編語(yǔ)言:統(tǒng)一的匯編語(yǔ)言
1、為了有力支持Thumb-2,引入了一個(gè)“統(tǒng)一匯編語(yǔ)言(UAL)”語(yǔ)法機(jī)制。對(duì)于16位指令和32位指令均能實(shí)現(xiàn)一些操作,有時(shí)雖然指令的實(shí)際操作數(shù)不同,或者對(duì)立即數(shù)的
長(zhǎng)度有不同的限制,但是匯編器允許開(kāi)發(fā)者以相同的語(yǔ)法格式編寫(xiě),并且由匯編器來(lái)決定使用16位指令還是32位指令。
2、如果使用了傳統(tǒng)的Thumb語(yǔ)法有些指令會(huì)默認(rèn)更新APSR,即使你沒(méi)有加上S后綴。如果使用UAL語(yǔ)法,則必須使用S后綴才能更新。
3、在Thumb-2指令集中,有些操作既可以由16位指令完成,也可以由32位指令完成。在UAL下,可以讓編譯器決定用哪個(gè),也可以手工指令使用16位還是32位。
1)、.W后綴指定32位指令。如果沒(méi)有給出后綴,會(huì)bain其會(huì)先試著用16位指令以縮小代碼體積如果不行在使用32位指令。
2)、.N后綴指定16位指令。
4、32位Thumb-2指令可以按半字節(jié)對(duì)齊。
四、指令集
1、APSR中的5個(gè)標(biāo)識(shí)位:
1)、N:復(fù)數(shù)表示(Negative)。
2)、Z:零結(jié)果標(biāo)識(shí)(Zero)。
3)、C:進(jìn)位/借位標(biāo)識(shí)(Carry)。
4)、V:溢出標(biāo)識(shí)(oVerflow)。
5)、S:飽和標(biāo)識(shí)(Saturation),它不做條件轉(zhuǎn)移的依據(jù)。
2、Cortex-CM3支持的指令集如下:
注意:邊框雙粗的是從ARMv6T2才支持的指令。
雙線邊框的是從Cortex-CM3才支持的指令,(v7的其他款式不一定支持)。
1)、16位數(shù)據(jù)操作指令
2)、16位轉(zhuǎn)移指令
3)、16位存儲(chǔ)器數(shù)據(jù)傳送指令
4)、其他16位指令
5)、32位數(shù)據(jù)操作指令
6)、32位存儲(chǔ)器數(shù)據(jù)傳送指令
7)、32位轉(zhuǎn)移指令
8)、其他32位指令
3、未支持的指令
1)、不再是傳統(tǒng)的架構(gòu),呆滯某些指令已失去意義
2)、不支持的協(xié)處理器相關(guān)指令
3)、不支持的CPS指令用法
4)、不支持的hint指令
五、近距離的檢視指令
一)、匯編語(yǔ)言:數(shù)據(jù)傳送
1、Cortex-CM3中的數(shù)據(jù)傳輸類(lèi)型
1)、兩個(gè)寄存器間的傳輸數(shù)據(jù)。
2)、寄存器與存儲(chǔ)器間傳輸數(shù)據(jù)。
3)、寄存器與特殊功能寄存器間傳輸數(shù)據(jù)。
4)、把一個(gè)立即數(shù)加載到寄存器。
2、用在數(shù)據(jù)傳輸?shù)闹噶顣r(shí)MOV,它的另一個(gè)衍生物是MVN——把寄存器的內(nèi)容取反后再傳送。
3、用于訪問(wèn)存儲(chǔ)器的基礎(chǔ)指令是“加載(load)”和“存儲(chǔ)(store)”。
1)、加載指令LDR把存儲(chǔ)器中的內(nèi)容加載到寄存器中,存儲(chǔ)指令STR把寄存器的內(nèi)容存儲(chǔ)到存儲(chǔ)器中。傳送過(guò)程中數(shù)據(jù)類(lèi)型也可以變通,最常見(jiàn)的格式有:
2)、如果想一次性的解決存儲(chǔ)器訪問(wèn)問(wèn)題,可以使用LDM/STM來(lái)進(jìn)行,它相當(dāng)于把若干個(gè)LDR/STR給合并起來(lái)。
I、表中加粗的符合Cortex-CM3堆棧操作的LDM/STM的使用方式。并且如果Rd是R13,則與PUSH和POP等效。
II、感嘆號(hào)表示自增或自減基址存儲(chǔ)器Rd的值,時(shí)機(jī)是在每次訪問(wèn)前或訪問(wèn)后。感嘆號(hào)還可以用于單一加載或存儲(chǔ)指令,——LDR/STR。這也就是所謂的“帶預(yù)索引”的LDR和
STR。
III、Cortex-CM3還支持后索引。后索引也要使用一個(gè)立即數(shù)offset,但與預(yù)索引不同的是,后索引是忠實(shí)使用基址寄存器Rd的值作為數(shù)據(jù)傳送的地址的。待到數(shù)據(jù)傳輸之后,
在執(zhí)行Rd<-Rd+offset。
4、LDR偽指令 VS ADR偽指令
1)、LDR和ADR都有能力產(chǎn)生一個(gè)地址,但是語(yǔ)法和行為不同。
2)、對(duì)于LDR,如果匯編器發(fā)生要產(chǎn)生立即數(shù)是一個(gè)程序地址,它會(huì)自動(dòng)把LSB置位,
3)、對(duì)于ADR相反,它不會(huì)修改LSB。
二)、匯編語(yǔ)言:數(shù)據(jù)處理
1、雖然助記符都是ADD,但是二進(jìn)制機(jī)器碼是不同的。當(dāng)使用16位加法時(shí)會(huì)自動(dòng)更新APSR的標(biāo)識(shí)位。然而,在使用了“.W”顯式指定了32位指令后,就可以通過(guò)“S”后綴控制
對(duì)APSR的更新。
2、常見(jiàn)的算術(shù)四則運(yùn)算指令
3、Cortex-CM3還片載了硬件乘法器,支持乘加/乘減運(yùn)算,并能產(chǎn)生64位的值。
4、邏輯運(yùn)算
5、移位(支持多種組合)運(yùn)算和循環(huán)運(yùn)算
6、帶符號(hào)擴(kuò)展指令
7、數(shù)據(jù)序轉(zhuǎn)指令
8、位段處理及把玩指令
三)、匯編語(yǔ)言:子程序呼叫與無(wú)條件轉(zhuǎn)移指令
1、最基本的無(wú)條件轉(zhuǎn)移指令有兩條:
B Label ;轉(zhuǎn)移到Label處對(duì)應(yīng)的地址
BL reg ;轉(zhuǎn)移到有寄存器reg給出的地址
2、呼叫子程序時(shí),需要保存返回地址,正點(diǎn)的指令是:
BL Label ;轉(zhuǎn)移到Label處對(duì)應(yīng)的地址,并且把轉(zhuǎn)移前的下條指令地址保存到LR
BLX reg ;轉(zhuǎn)移到由寄存器reg給出的地址,根據(jù)REG的LSB切換處理器的狀態(tài),并且把轉(zhuǎn)移前的下條指令地址保存到LR
注意:、使用BLX要注意,其改變狀態(tài)的功能。因此確保reg的lsb必須為1,以確保不會(huì)進(jìn)入ARM狀態(tài)。
3、以PC為目的寄存器的MOV和LDR指令也可以實(shí)現(xiàn)轉(zhuǎn)移,常見(jiàn)的形式有:
MOV PC, R0 ; 轉(zhuǎn)移地址由R0給出
LDR PC, [R0] ; 轉(zhuǎn)移地址存儲(chǔ)在R0所指向的存儲(chǔ)器中
POP {..., PC] ; 把返回地址以彈出堆棧的方式送給PC,從而實(shí)現(xiàn)轉(zhuǎn)移
LDMIA SP!, {..., PC ; POP另一種等效寫(xiě)法
注意:使用這些方式必須保證送給PC的值是奇數(shù)(LSB=1)。
四)、標(biāo)志位與條件指令
1、在應(yīng)用程序狀態(tài)寄存器中有5個(gè)標(biāo)志位,但只有4個(gè)被條件轉(zhuǎn)移指令參考。絕大多數(shù)ARM的條件轉(zhuǎn)移指令根據(jù)他們來(lái)決定是否轉(zhuǎn)移。
2、在ARM中數(shù)據(jù)操作指令可以更新這4個(gè)標(biāo)志位。這些標(biāo)志位除了可以當(dāng)條件轉(zhuǎn)移的判斷之外,還能再一些場(chǎng)合下作為指令是否執(zhí)行的依據(jù);蛘咴谝莆徊僮髦谐洚(dāng)各種中介
角色。
3、擔(dān)任條件轉(zhuǎn)移和條件執(zhí)行的依據(jù)時(shí),這4個(gè)標(biāo)志位既可以單獨(dú)使用,也可以組合使用,以產(chǎn)生15種判斷依據(jù):
4、在Cortex-CM3中,下列指令可以更新PSR的標(biāo)志:
1)、16位算術(shù)邏輯指令。
2)、32位帶S后綴的算術(shù)邏輯指令。
3)、比較指令和測(cè)試指令。
4)、直接寫(xiě)PSR/APSR(MAR指令)。
五)、匯編語(yǔ)言:指令隔離指令和存儲(chǔ)器隔離指令
六)、匯編指令:飽和運(yùn)算
1、Cortex-CM3的飽和運(yùn)算指令分為兩種:帶符號(hào)的飽和運(yùn)算以及無(wú)符號(hào)飽和運(yùn)算。
2、飽和運(yùn)算指令
六、Cortex-CM3中一些有用的新指令
1、MSR和MRS
1)、這兩條指令是訪問(wèn)特殊功能寄存器的指令,必須在特權(quán)下訪問(wèn),出APSR外。
2)、指令語(yǔ)法如下:
MRS <Rn>, <SReg> ; 加載特殊功能寄存器的值到Rn
MSR <SReg>, <Rn> ; 存儲(chǔ)Rn的值到特殊功能寄存器的值
3)、SReg可以是下表中的一個(gè)
2、IF-THEN
1)、IF-THEN指令圍成一個(gè)塊,里面最多4條指令,它里面的指令可以條件執(zhí)行。
2)、IT使用形式:
3、CBZ和CBNZ
1)、比較并條件跳轉(zhuǎn)指令專(zhuān)為循環(huán)結(jié)構(gòu)的優(yōu)化而設(shè),它只能做向前跳轉(zhuǎn)。
2)、格式為
4、SDIV和UDIV
1)、32位硬件除法指令。
2)、格式
3)、運(yùn)算結(jié)果是Rd = Rn / Rm。
5、REV,REVH,REV16以及REVSH
1)、REV反轉(zhuǎn)32位整數(shù)中的字節(jié)序,REVH則以半字節(jié)為單位反轉(zhuǎn),且只反轉(zhuǎn)低半字節(jié)。
2)、REVSH在REVH的基礎(chǔ)上,還把反轉(zhuǎn)后的半子做帶符號(hào)的擴(kuò)展。
3)、語(yǔ)法
6、RBIT
1)、RBIT比以前的REV之流更為精細(xì),它是按位反轉(zhuǎn)的,相當(dāng)于把32位整數(shù)的二進(jìn)制表示法水平旋轉(zhuǎn)180°。此指令在處理串行比特流大有用處。
2)、格式
RBIT.W Rd, Rn
7、SXTB,SXTH,UXTB,UXTH
1)、這四條指令是為了優(yōu)化C的強(qiáng)制數(shù)據(jù)類(lèi)型轉(zhuǎn)換而設(shè)的,把數(shù)據(jù)寬度轉(zhuǎn)換為處理器喜歡的32位長(zhǎng)度。
2)、語(yǔ)法
3)、對(duì)于SXTB/SXTH,數(shù)據(jù)帶符號(hào)位擴(kuò)展成32位整數(shù)。對(duì)于UXTB/UXTH,高位清0。
8、BFC/BFI,UBFX/SBFX
1)、這四個(gè)指令是Cortex-CM3提供的位段操作指令。
2)、BFC(位段清零)指令把32位整數(shù)任意一段連續(xù)的二進(jìn)制位S清0,語(yǔ)法格式為:
BFC Rd, #lsb, #width
3)、BFI(位段插入指令),則把某寄存器按LSB對(duì)齊的數(shù)據(jù),拷貝到另一個(gè)寄存器的某個(gè)位段中,其格式為:
BFI.w Rd, Rn, #lsb, #width
4)、UBFX/SBFX都是位段提取指令,語(yǔ)法格式為:
UBFx.w Rd, Rn, #lsb, #width
SBFX.w Rd, Rn, #lsb, #width
9、LDRD/STRD
1)、Cortex-CM3在一定程度上支持對(duì)64位整數(shù),其中LDRD/STRD就是為64位整數(shù)的數(shù)據(jù)傳輸而設(shè)置的。
2)、格式:
10、TBB,TBH
1)、TBB(查表跳轉(zhuǎn)字節(jié)范圍的偏移量)指令和TBH(查表跳轉(zhuǎn)半字節(jié)范圍的偏移量)指令,分別用于從一個(gè)字節(jié)數(shù)組表中查找偏移地址,和從半字節(jié)數(shù)組表中查找偏移地
址。TBB的跳轉(zhuǎn)范圍為255*2+4=514,TBH的跳轉(zhuǎn)范圍為65535*2+4=128kb+2。
2)、TBB語(yǔ)法格式
TBB.W [Rn, Rm] ;PC+=Rn[Rm]*2
3)、TBH語(yǔ)法格式
TBH.W [Rn, 2*Rm] ;PC+=Rn[2*Rm]*2
一、存儲(chǔ)器系統(tǒng)的功能概覽
1、Cortex-CM3存儲(chǔ)器系統(tǒng)功能
1)、存儲(chǔ)器映射是預(yù)定義的,并且還規(guī)定好了那個(gè)位置使用那條總線。
2)、Cortex-CM3的存儲(chǔ)器系統(tǒng)支持“位帶”操作。
3)、Cortex-CM3存儲(chǔ)器系統(tǒng)支持非對(duì)齊訪問(wèn)和互斥訪問(wèn)。
4)、Cortex-CM3的存儲(chǔ)器系統(tǒng)支持both大端配置和小端配置。
二、存儲(chǔ)器映射
1、Cortex-CM3只有一個(gè)單一固定的存儲(chǔ)器映射。這極大方便了軟件在各種Cortex-CM3單片機(jī)間的移植。
2、存儲(chǔ)器的一些位置用于調(diào)試組件等私有外設(shè),這個(gè)地址被稱為“私有外設(shè)區(qū)”。私有外設(shè)區(qū)的組件包括:
1)、閃存地址重載及斷點(diǎn)單元(FPB)。
2)、數(shù)據(jù)觀察點(diǎn)單元(DWT)。
3)、指令跟蹤宏單元(ITM)。
4)、嵌入式跟蹤宏單元(ETM)。
5)、跟蹤端口接口單元(TPIU)。
6)、ROM表。
3、Cortex-CM3的地址空間是4GB,程序可以在代碼區(qū),內(nèi)部SRAM區(qū)以及RAM區(qū)執(zhí)行。4GB粗線條劃分:
1)、內(nèi)部SRAM區(qū)的大小是512MB,用于讓芯片制造商連接片上的SRAM,這個(gè)區(qū)通過(guò)系統(tǒng)總線來(lái)訪問(wèn)。在此區(qū)的下部,有一個(gè)1MB的位帶區(qū),該位帶區(qū)還有一個(gè)對(duì)應(yīng)的
32MB的“位帶別名區(qū)”,容納了8M個(gè)“位變量”。位帶區(qū)對(duì)應(yīng)的是最低的1MB地址范圍,而位帶別名區(qū)里面的每個(gè)字對(duì)應(yīng)位帶區(qū)的一個(gè)比特。位帶操作只適用于數(shù)據(jù)訪問(wèn),
不適用與取指操作。
2)、地址空間另一個(gè)512范圍由片上外設(shè)(的寄存器)使用。這個(gè)區(qū)也有一條32MB的位帶別名,以便于快捷的訪問(wèn)外設(shè)寄存器。
3)、還有兩個(gè)1GB的范圍,分別用于連接外部RAM和外部設(shè)備,它們之間沒(méi)有位帶。兩者的區(qū)別在于外部RAM區(qū)允許執(zhí)行指令,而外設(shè)設(shè)備區(qū)則不允許。
4)、最后剩下0.5GB的地帶是Cortex-CM3內(nèi)核所在區(qū)域,包括系統(tǒng)級(jí)組件,內(nèi)部私有外部總線S,外部私有外部總線S,以及由提供者定義的系統(tǒng)外設(shè)。
5)、私有外部總線有兩條
I、AHB外設(shè)總線,只用于Cortex-CM3內(nèi)部的AHB設(shè)備,它們是:NVIC,FPB,DWT和ITM。
II、APB外設(shè)總線,即用于Cortex-CM3內(nèi)部的APB設(shè)備,也用于外部設(shè)備
6)、NVIC所處的區(qū)域叫做“系統(tǒng)控制空間(SCS)”在SCS里面還有SysTick、MPU以及代碼調(diào)試控制所用的寄存器:
三、存儲(chǔ)器訪問(wèn)屬性S
1、Cortex-CM3為存儲(chǔ)器做了映射之外,還為存儲(chǔ)器的訪問(wèn)規(guī)定了4中屬性:
1)、可否緩沖(Bufferable)
2)、可否緩存(Cacheable)
3)、可否執(zhí)行(Executable)
4)、可否共享(Shareable)
2、如果配置了MPU,則可以通過(guò)它配置不同的存儲(chǔ)區(qū),并且覆蓋缺省的訪問(wèn)屬性。
四、存儲(chǔ)器的缺省訪問(wèn)許可
1、Cortex-CM3有一個(gè)缺省的訪問(wèn)許可,它能防止使用戶代碼訪問(wèn)系統(tǒng)控制存儲(chǔ)空間,保護(hù)NVIC,MPU等關(guān)鍵組件。缺省訪問(wèn)許可在以下條件時(shí)生效:
1)、沒(méi)有配置MPU。
2)、配置了MPU,但是MOPU被除能。
2、存儲(chǔ)器的缺省訪問(wèn)許可
四、位帶操作
一)、簡(jiǎn)介
1、支持位帶操作后,可以使用普通的加載/存儲(chǔ)指令來(lái)對(duì)單一的比特進(jìn)行讀寫(xiě)。在Cortex-CM3中,有兩個(gè)區(qū)實(shí)現(xiàn)了位帶。其中一個(gè)是SRAM區(qū)的最低1MB,第二個(gè)則是片內(nèi)外
設(shè)區(qū)的最低1MB范圍。這兩個(gè)區(qū)的地址除了可以像普通的RAM使用外,它也都有自己的“位帶別名區(qū)”,位帶別名區(qū)把每個(gè)比特膨脹成一個(gè)32位的字。
1)、位帶區(qū)與別名區(qū)的膨脹對(duì)應(yīng)關(guān)系圖A
2)、位帶區(qū)與別名區(qū)的膨脹對(duì)應(yīng)關(guān)系圖B
2、Cortex-CM3用如下術(shù)語(yǔ)來(lái)表示位帶存儲(chǔ)的地址區(qū)
1)、位帶區(qū):支持位帶操作的地址區(qū)。
2)、位帶別名:對(duì)別名地址的訪問(wèn)最總作用到位帶區(qū)的訪問(wèn)上。(注意:這中途有一個(gè)地址映射過(guò)程)
3、在位帶區(qū)中每個(gè)比特都都映射到別名地址區(qū)的一個(gè)字——這是只有LSB有效的字。當(dāng)一個(gè)別名地址被訪問(wèn)時(shí),會(huì)先把改地址變換成位帶地址。
1)、對(duì)于讀操作,讀取位帶地址中的一個(gè)字,再把需要的位右移到LSB,并把LSB返回。
2)、對(duì)于寫(xiě)操作,把需要寫(xiě)的位左移到對(duì)應(yīng)的位序號(hào)處,然后執(zhí)行一個(gè)原子的“讀-改-寫(xiě)”過(guò)程。
4、支持位帶操作的兩個(gè)內(nèi)存區(qū)的范圍是:
1)、0x2000_0000-0x000F_FFFF(SRAM區(qū)中的最低1MB)和0x4000_0000-0x400F_FFFF(片上外設(shè)區(qū)中的最低1MB)。
2)、對(duì)于SRAM位帶區(qū)的某個(gè)比特,記它所在字節(jié)地址為A,位序號(hào)為n,則該比特在別名區(qū)的地址是:
3)、對(duì)于片上外設(shè)位帶區(qū)的某個(gè)比特,記它所在字節(jié)地址為A,位序號(hào)為n,則該比特在別名區(qū)的地址是:
5、位帶地址映射
1)、SRAM區(qū)中的位帶地址映射
2)、片上外設(shè)區(qū)中的位帶地址映射
二)、位帶操作的優(yōu)越性
1、位帶操作對(duì)硬件I/O密集型的底層程序提供了很大方便。
2、位帶操作可用來(lái)化簡(jiǎn)跳轉(zhuǎn)的判斷。是代碼更整潔。
3、在多任務(wù)中用于實(shí)現(xiàn)共享資源在任務(wù)間的“互鎖”訪問(wèn)。
三)、其他數(shù)據(jù)長(zhǎng)度上的位帶操作
1、位帶操作并不限于以字為單位的傳送。亦可以按半子節(jié)和字節(jié)為單位傳送。
五、在C語(yǔ)言中使用位帶操作
1、C編譯器中并沒(méi)有直接支持位帶操作。欲在在C中使用位帶操作,最簡(jiǎn)單的做法就是#define一個(gè)位帶別名區(qū)的地址。為了簡(jiǎn)化位帶操作,也可以定義一些宏。
2、當(dāng)使用位帶功能時(shí),要訪問(wèn)的變量必須用vollatile來(lái)定義。
六、非對(duì)齊數(shù)據(jù)傳送
1、Cortex-CM3支持在單一的訪問(wèn)中使用非(地址)對(duì)齊的傳送,數(shù)據(jù)存儲(chǔ)器的訪問(wèn)無(wú)需對(duì)齊。
2、非對(duì)齊傳送實(shí)例
3、在Cortex-CM3中,非對(duì)齊的數(shù)據(jù)傳送只發(fā)生在常規(guī)的數(shù)據(jù)傳送指令中,其他的指令則不支持:
1)、多個(gè)數(shù)據(jù)的加載存儲(chǔ)(LDM/STM)。
2)、棧堆操作(PUSH/POP)。
3)、互斥訪問(wèn)(LDREX/STREX)。
4)、位帶操作。
4、應(yīng)該養(yǎng)成好習(xí)慣,總是保持地址對(duì)齊。為此可以變成NVIC,使之監(jiān)督地址對(duì)齊。
七、互斥訪問(wèn)
1、在Cortex-CM3中,用互斥體訪問(wèn)取代了ARM處理器中的SWP指令。
2、互斥訪問(wèn)的理念同SWP非常相似,不同點(diǎn)在于:在互斥訪問(wèn)操作下,允許互斥體所在的總線被其他master訪問(wèn),也允許被其他運(yùn)行在本機(jī)上的任務(wù)訪問(wèn),但是Cortex-CM3
能駁回有可能導(dǎo)致竟態(tài)條件的互斥訪問(wèn)。
3、互斥訪問(wèn)分為加載/存儲(chǔ),相應(yīng)的指令為L(zhǎng)DREX/STREX,LDREXH/STREXH,LDREXB/STREXB,分別對(duì)應(yīng)于字/半字/字節(jié)
4、使用方式(以LDREX/STREX為例)
1)、語(yǔ)法格式
2)、LDREX指令與LDR相同。而STREX不同,STREX指令的執(zhí)行是可以被駁回的。
I、當(dāng)處理器同意執(zhí)行STREX,Rxf的值會(huì)被存儲(chǔ)到(Rn+Offset)處,并且把Rd的值更新。
II、若處理器駁回了STREX的執(zhí)行,則不會(huì)發(fā)生存儲(chǔ)動(dòng)作,并且把Rd的值更新為1。
3)、駁回規(guī)則:只有在LDREX執(zhí)行后最近的一條STREX才能成功執(zhí)行。其他情況下,駁回此STREX
I、中途有其他STR指令執(zhí)行。
II、中途有其他的STREX執(zhí)行。
4)、當(dāng)時(shí)用互斥訪問(wèn)時(shí),LDREX/STREX指令必須成對(duì)使用。
八、端模式
1、Cortex-CM3支持both小端模式和大端模式。在絕大多數(shù)情況下,Cortex-CM3都是用小端模式——為了避免不必要的麻煩,推薦使用小端模式。
2、Cortex-CM3中對(duì)大端模式的定義與ARM7的不同(小端定義都相同)。在ARM7中大端模式稱為“字不變大端”,而在Cortex-CM3中,使用的是“字節(jié)不變大端”。
1)、Cortex-CM3的字節(jié)不變大端:存儲(chǔ)器視圖
2)、Cortex-CM3的字節(jié)不變大端:在ABH上的數(shù)據(jù)
3)、ARM7字節(jié)不變大端:在ABH上的數(shù)據(jù)
3、在Cortex-CM3,是在復(fù)位時(shí)確定使用那種端模式的,且運(yùn)行時(shí)不得改變。指令預(yù)取永遠(yuǎn)使用小端模式,在配置控制存儲(chǔ)空間的訪問(wèn)也永遠(yuǎn)小端模式(包括NVIX,F(xiàn)PB之
流)。另外外部私有總線地址區(qū)0xE0000000至0xE00FFFFF也永遠(yuǎn)使用小端模式。
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬(wàn)眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08