一、說在前面的話
自從Arm在2016年的十月發(fā)布兩款A(yù)rmv8-M架構(gòu)的新處理器Cortex-M23和Cortex-M33以來,已經(jīng)過去了3年多,而市面上基于這兩款處理器的微控制器產(chǎn)品也剛剛才嶄露頭角。 很多才剛剛通過開發(fā)板熟悉Cortex-M0/M0+/M3/M4處理器的童鞋可能心中又要飄過彈幕:
誰TM告訴我,這個M23和M33是什么鬼?
從個位數(shù)一下蹦到兩位數(shù)了喂!
前面十幾位兄弟怎么了?喂!
別說跟M3有啥關(guān)系,這以后下第n代是不是就該叫2333333了?
該來的總會來,那么如何簡單粗暴的理解這兩個全新的處理器呢?以下是傻孩子獨家特別提供的的無責(zé)任囫圇吞棗公式:
Cortex-M23 =
Cortex-M0/M0 + 硬件除法器 + 性能提升 +
專門的棧溢出硬件檢測+
指令集不可忽略的小動作 +
安全擴展(TrustZone for Armv8-M) +
MPU開發(fā)者模型的友好化改進
Cortex-M33 =
Cortex-M3/M4 + 性能提升 +
專門的棧溢出硬件檢測+
指令集不可忽略的小動作 +
安全擴展(TrustZone for Armv8-M)+
MPU開發(fā)者模型的友好化改進
再簡單點說就是無敵增強版的“M0/M0+,M3/M4”加“安全擴展”。有人說,Armv8-M的主要功能就是為Cortex-M家族引入TrustZone,這么看來也是不無道理的。
1.1增強版的Cortex-M0/M0+
根據(jù)官方的說法,Cortex-M23實現(xiàn)的是Armv8-M架構(gòu)的Baseline子架構(gòu),我們不妨理解為手機里面的“入門級”產(chǎn)品。
Cortex-M23從定位上也非常直接,就是給Cortex-M0/M0+增加個安全擴展。因此,實際上所有為Cortex-M0/M0+編譯生成的二進制代碼基本上都可以“無修”的在Cortex-M23/M33上執(zhí)行——除非你原本的代碼使用了MPU。此外Cortex-M23居然配備了硬件除法器,這無疑在原本Cortex-M0和Cortex-M0+主打的8位/16位市場上把“基本配置”又提升了一個檔次。 指令集上,Cortex-M23師承Armv6-M,除了支持“安全擴展”所必須的一系列指令之外,這款入門級產(chǎn)品還做了一個“不可忽略的小動作”——也就是說,除了Cortex-M33以外,Cortex-M23也可以通過很小的代價支持“暗代碼(eXecute Only Memory, XOM)”。
什么是暗代碼呢?和“暗物質(zhì)”只能理論上知道它存在卻很難探測到類似——“暗代碼”是一類只能由處理器執(zhí)行(取指令)卻根本無法用任何形式讀取機器碼(OPCODE)內(nèi)容的程序——也就是人們常說的XO(eXecute-Only)代碼。“暗代碼”并不是依靠內(nèi)核來實現(xiàn)的,但卻需要編譯器和內(nèi)核共同努力才能支持。這是因為XOM本質(zhì)上是芯片廠家在地址空間上劃分出的一段特殊區(qū)域——只能由處理器取指令、用于代碼的運行(Instruction Fetch),而不能進行普通的數(shù)據(jù)訪問(Data Access)。這就要求“暗代碼”里不能直接保存任何常數(shù)——它們必須編碼到指令里面——成為指令的一部分,以指令編碼中的立即數(shù)形式存在。
Armv6-M的指令集大部分都是16位的Thumb指令,16位的指令可以用于編碼的立即數(shù)的二進制位長度可想而知——少得可憐。Armv7-M由于引入了32位的Thumb2指令集,從而極大增強了指令攜帶立即數(shù)的能力。為了將這一能力引入Armv8-M的Baseline指令集,MOVT和MOVW這兩個可以分別攜帶32位立即數(shù)“高、低16位”的指令就被特別加入到Cortex-M23所使用的指令集中。考慮到Armv8-M所強的調(diào)信息安全,“暗指令”對固件的保護有多大的分量,可想而知。
結(jié)論:Cortex-M23——這個M0+不簡單。
1.2增強版的Cortex-M3/M4
相對Cortex-M3/M4來說,Cortex-M33在性能上有了提升并不是什么意料之外的事情,不提也罷。值得說明的是,從城里來的Cortex-M7在性能上仍然可以"甩其他Cortex-M土包子幾條街"——6級流水線和3級流水線的差別可是"三缸夏利和六缸寶馬之間的差距"所不能比擬的!(認(rèn)真臉)。
1.3ARMv8-M是個知錯就改的好少年
我不知道有多少人真正用過Armv7-M,也就是Cortex-M3/M4的MPU——簡單說就是個以Region為單位來修改Memory屬性的系統(tǒng)級外設(shè)。原本設(shè)計的時候想法很簡單,一個Region,給個大小(Size)給個基地址(Base Address),再給個屬性(Memory Attribute),一使能,就工作了,很簡單,很Happy。然而,出于優(yōu)(pi)化(gu)內(nèi)(jue)核(ding)面(nao)積(dai)的原因,Region地址范圍的設(shè)定被人為加入了一個限定:
基地址(Base Address)必須對齊(Aligned with)到它的尺寸(Size),而且尺寸必須是2的整數(shù)次方(還必須大于4次方)。
舉個例子:一個Region大小為512K,那么基地址必須是512K的整數(shù)倍……如果你還不能理解這個問題蛋疼的點在哪里,設(shè)想一個任意大小的Region該怎么設(shè)定,比如,一個234K大小的Memory該咋辦?——還能咋辦,用多個Region組合出來唄。正是這個蛋疼的限制,導(dǎo)致幾乎沒有什么RTOS可以很好的使用MPU,也罕有身邊的項目把MPU這么骨感的現(xiàn)實應(yīng)用的如理想般美好。
那么Armv8-M做了什么呢?他更正了這一蛋疼的設(shè)定,即:Region的設(shè)置由“基地址+尺寸”進化為“起始地址+終止地址”,除了這兩個地址都必須是32字節(jié)的整倍數(shù)的要求外,再也沒有變態(tài)的關(guān)于“基地址必須是Region大小的整倍數(shù)”這樣的限定。是不是突然覺得眼前一亮,是不是突然發(fā)現(xiàn)了一個寶藏?MPU頓時好玩起來。
結(jié)論:ARMv8-M的MPU是個好同志,士別三日當(dāng)刮目相看
審核編輯:劉清
-
微控制器
+關(guān)注
關(guān)注
48文章
7660瀏覽量
152188 -
處理器
+關(guān)注
關(guān)注
68文章
19440瀏覽量
231321 -
MPU
+關(guān)注
關(guān)注
0文章
375瀏覽量
48984 -
RTOS
+關(guān)注
關(guān)注
22文章
820瀏覽量
119918 -
ARMv8
+關(guān)注
關(guān)注
1文章
35瀏覽量
14206
原文標(biāo)題:簡單粗暴解讀Cortex-M23/33(上)
文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
cortex M0/M0+/M3/M4 所支持的最高時鐘頻率是多少?
Cortex?-M3處理器
cortex m3/m4處理器的復(fù)位設(shè)計資料分享
制造一種基于Cortex-M0和Cortex-M3處理器的SoC
ARM Cortex-M0設(shè)計啟動評估用戶指南
LPCXpresso54114:Cortex-M4/M0+教程
ARM為主流嵌入式SoC設(shè)計提供免費的Cortex-M0處理器IP
特大好消息:ARM Cortex-M0/M3免收授權(quán)費了
如何定制基于Cortex-M0/M3免費內(nèi)核的自主SoC | 直播報名(11.25)
cortex m3/m4處理器的復(fù)位設(shè)計
![<b class='flag-5'>cortex</b> <b class='flag-5'>m3</b>/<b class='flag-5'>m4</b><b class='flag-5'>處理器</b>的復(fù)位設(shè)計](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論