對於用MCU的人來講,不必定要明白HCS12(x) memory map的機制和聯繫。由於若是沒有系統地學習操做系統和編譯原理之類的課程,確實有些難度。而且,對於DG128 XS128這樣的MCU,默認的memory分配方式已經夠用了。從這個意義上講,搞清楚memory map彷佛沒必要要。
編程
可是,你有沒有RAM不夠用的狀況?有沒有想定義變量到FLASH ROM的狀況?有沒有由於欲提升尋址效率而定義變量到非分頁區的狀況?有沒有寫EEPROM但沒寫成功的狀況?
飛思卡爾的memory很是靈活,經過地址映射來提升效率是芯片製造商的一慣做風(固然,首先這個CPU要有這種尋址和內存映射轉換機制),可是,縱觀HCS12(x) memory map的東西,真是作到極限了。用我之前的話講是,用有限的資源得到無限的好處了。看看DG128,64K的邏輯空間,映射以後RAM EEPROM FALSH ROM,均可以充分發揮做用,並且擴展FLASH也方便。而XS128更高級一籌,有專門的MMC管理HCS12(x) memory map。
我大致上瞭解這兩個片子的HCS12(x) memory map,所以就此談談理解和見解,若有錯誤,請你們不吝指出
首先,說說6個概念。
1 memory map 地址映射,不要理解成內存映射,內存是RAM。
2 爲何要映射?由於CPU的尋址是對物理地址操做,可是單片機的RESET以後只有相對地址。相對地址,我理解爲是一塊一塊的,不是連斷的。相對地址,顧名思義,是個相對的,沒有映射以前,CPU是找不到他的,也用不了相對地址的數據。 粘一句百度上的解釋:爲了保證CPU執行指令時可正確訪問存儲單元,需將用戶程序中的邏輯地址轉換爲運行時由機器直接尋址的物理地址,這一過程稱爲地址映射。
3 RAM,這個很少說,是存變量和棧的東西,高速,掉電即失。
4 EEPROM,這個是一種特別的FLASH。通常用來保存少許數據,掉電不會丟失。FLASH也是非易失的,SD卡就是一種FLASH。EEPROM和普通FLASH的區別,在於讀寫時的字節操做上。這個我基本上沒有體會,由於是至關底層的東西。
5 FLASH和ROM,在HCS12(X)裏,建議把FLASH和ROM等同起來理解。你們的程序就是放在這裏面的。還有一個const變量和中斷向量也是存在這裏面的。ROM可能有個誤區,只能讀不能寫,一次性的,不錯。可是,有加個前提,應該是可控的ROM。
6 還有一個重要的register 空間,這個是存放I/0地址和單片機可編程寄存器的空間,是廠家定義的。在頭文件裏能夠看到。如extern volatile PORTABSTR _PORTAB @(REG_BASE + 0x00000000)就是典型的register 空間映射。
我把memory map理解成爲3個內容:一個是映射管理,一個是分頁機制,一個是尋址的問題。映射管理,就是單片機RESET以後,邏輯地址和物理地址之間的關係。分頁機制的產生主要因爲16位尋址能力有限,須要分頁解決,另外在虛擬內存管理上能夠得到更多的優點。 至於,CPU尋址的問題,這個就不深糾了。
此次以DG128的爲例,XS128的稍複雜一些。理解了DG128的,XS128的問題就不大。
先說一說映射管理:DG128裏經過設置INITRG、INITRM、INITEE來實現映射。具體的設置看DS吧。默認狀況下:register 空間映射到0X0000到0x03FF,這個優先級最高。RAM空間映射到0x0400-0X1FFF,看到沒有,實際上只有7K,也就是說能用的RAM只有7K。可是,DG128的RAM有8K的邏輯空間啊。因此,能夠改INITRG、INITRM、INITEE重映射以提升RAM的實際可用空間。怎麼改,看須要了。WJ在這裏邏嗦一句,能夠看看PE是怎麼改的。而FLASH映射了3個,有兩個非分頁地址0x4000-0x7FFF和0xC000-0xFEFF。還有一個分頁地址,這一個分頁地址有6個頁面。6個頁面佔用一個分頁窗,用一個邏輯空間,如何讓這6個頁面協做工做並讓CPU能找到他們呢?
這就是分頁管理機制的內容。這6個頁面分別是:
PAGE_38 = READ_ONLY 0x388000 TO 0x38BFFF;
PAGE_39 = READ_ONLY 0x398000 TO 0x39BFFF;
PAGE_3A = READ_ONLY 0x3A8000 TO 0x3ABFFF;
PAGE_3B = READ_ONLY 0x3B8000 TO 0x3BBFFF;
PAGE_3C = READ_ONLY 0x3C8000 TO 0x3CBFFF;
PAGE_3D = READ_ONLY 0x3D8000 TO 0x3DBFFF;
上面說的你們能夠新建一個DG128工程,到PRM文件裏看。
再看看分頁管理機制:DG128裏只有FLASH空間能夠分頁,而XS128裏,分頁的東西太多了。DG128裏FLASH分頁是經過PPAGE寄存器搞定的。PPAGE是5位寄存器,CPU12內核規位每頁只能有16KB。所以DG128的FLASH尋址空間就是2^5*16KB=512KB了。
中斷函數爲何要加:#pragma CODE_SEG __NEAR_SEG NON_BANKED 這個聲明?這個聲明是幹什麼用的?
這要仍是要從FLASH分頁和非分頁的區別提及。
下面詳細說一說,FLASH裏非分頁和分頁的使用。 要明白一點,分頁是不可見的,要用的時候PPAGE參與尋址。
1 FLASH裏非分頁工做機制
FLASH一共爲128K,一頁是16K,那麼應該有8頁纔是,可是實際只有6個分頁。有2個非分頁放在4000-7FFF,和C000-FFFF兩個邏輯地址窗裏。那麼,當程序的尋址在64K以內(2^16=64K,16位機的尋址能力是64K)時,就不用分頁了,直接使用那兩個非分頁的數據。實際上,3E頁 3F頁是可見的,其實他們就是那2個非分頁的映射。所以,使用非分頁FLASH,就不須設置PPAGE寄存器,直接使用邏輯地址便可。見圖1。
這點咱們能夠從如下看出:
/* non-paged FLASHs */
ROM_4000 = READ_ONLY 0x4000 TO 0x7FFF;
ROM_C000 = READ_ONLY 0xC000 TO 0xFEFF;
PLACEMENT
NON_BANKED, INTO ROM_C000/*, ROM_4000*/;
很直觀地看出,把這兩個能夠直接使用邏輯地址的頁面設爲NON_BANKED, 那麼中斷函數放在NON_BANKED裏,就能夠把函數放在64K的尋址程序段中。這麼一來,進中斷就方便多了,效率也高不少。這就是對本文開篇的解釋。
你們記住這一點,在XS128裏也有相似的一招。
2 FLASH裏分頁工做機制
好了,上面是3E頁 3F頁是可見的分頁區,還有3D 3C 3B 3A 39 38不可見的分頁區。當你的程序要尋址64K之外的空間,即不是是可見的3E頁 3F頁時,就要涉及分頁了。
PPAGE是MMC模塊的東西,我搞了個圖片你們看看,如圖2。每一頁在DG128中的邏輯地址都是由PPAGE中的頁號和重疊窗口內地址組成的24位絕對地址。經過設置寄存器PPAGE,可使用所有的FLASH空間。例如:程序要將數據存入$3D頁,設置PPAGE的值爲$3D,那麼邏輯地址範圍說是$3D8000-$3DBFFF。有一點要注意:爲了分頁描述的完整性,能夠以下理解:對於3E頁 3F頁有兩個邏輯地址映射到物理地址。拿3E頁來講,有$004000-$007FFF和$3E8000-$3EBFFF。
對於程序是如何尋址,這個是內核的東西,你們能夠看看CPU這個文檔。
經過分析,相信你們知道地址這個東西是很是有用的吧。下次說說XS128,XS128的RAM FLASH EEPROM均可以分頁。更高級,更主動,編程彈性更大。
圖1
瞭解XS128的MEMORY map和core,對充分榨取他的現有資源,合理分配RAM頗有幫助。上次討論到cpu12內核的DG系列單片機,基本上該涉及的東西都有所說起。包括:
1 MEMORY map的緣由,爲何要搞這個概念出來。
2 MEMORY map包含的內容,有那三點...
3 一些相關的概念性的東西。
若是不明白,看看前面幾篇文章就會明白一些的。
此次再補充三個概念,但願能引發你們的注意和進一步討論:
1 在PRM裏設置了映射以後,怎麼把程序或變量放在那個地址區呢?好比:我就想把int a;這個a分配到未分頁的RAM1區,怎麼辦?
這個說來話太長。
簡單地說用:#pragma DATA_SEG [xxxx] <segment_name>。若是沒有#pragma DATA_SEG,全局變量將會被放到DEFAULT_RAM段中。固然,若是這個變量頻率引用的話,放在非分頁RAM1區能夠提升他的讀取效率,畢竟他不須要RPAGE參與尋址,是near尋址,而不是far,用簡單的指令就能夠搞定。
一樣,若是反覆調用一個函數,把這個函數放在非分頁flash裏也有異曲同同之妙。
關於這個問題的詳細討論,張教主有一篇文章,還有一個DP512的PPT都有講解。你們能夠網上下載看看,若是須要,也能夠向我email要.
2 建程序裏的SAMLL BANKED LARGE是什麼做用?
SMALL平面的64K的地址空間。全部的函數都是near。BANKED採用分頁地址。全部的用戶的函數都被默認爲far。far類型的數據指針能夠在SMALL和BANKED中使用LARGE, 默認爲數據和代碼均爲分頁模式。全部的函數和數據指針都是far類型。這種內存模型運行時間比較長,所以不多使用.用LARGE基本上浪費了16位機尋址64K的優點。
所以,用SMALL和BANKED模式的較多。你們能夠看看建工程時SMALL和BANKED模式下有什麼不一樣?映射是同樣的,只是DEFAULT_ROM和NON_BANKED有無分開的區別。
3 分頁明白了,可是分頁映射以後怎麼用分頁裏面的數據?
好比 const int a;我把他放在PAGE_3C裏面,我如何經過計算PPAGE找到這個a呢?
咱們用C語言的過程當中,把這些東西都忽略了,這個是內核的東西。簡單地說,由於內核會自動調用不一樣的指令去把你C語言譯成機器碼。機器碼就指令集的表示了。所以,內核的先進性和編譯優化過程讓你不要管了了。
這樣說是由於,隨後的博文裏將更進一步討論XS128的memory部分。xs128有128KP-FLASH(ROM) 8KRAM 8KD-FLASH( EEPROM) ,有某些分頁用不到,好比RAM分頁,由於邏輯地址是$2000-$4000,有8K空間,無需分頁。可是大一點的RAM的話,就必需要分頁了。這麼多分頁(還有FLASH確定是要分頁了,不分頁程序就裝不
下去),怎麼管理呢?總得有個東西來統籌一下吧.