<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MC9S12系列單片機(jī)地址影射以及分頁(yè)問(wèn)題

          MC9S12系列單片機(jī)地址影射以及分頁(yè)問(wèn)題

          作者: 時(shí)間:2016-11-22 來(lái)源:網(wǎng)絡(luò) 收藏
          對(duì)于用MCU的人來(lái)說(shuō),不一定要明白HCS12(x) memory map的機(jī)制和聯(lián)系。因?yàn)槿绻麤](méi)有系統(tǒng)地學(xué)習(xí)操作系統(tǒng)和編譯原理之類的課程,確實(shí)有些難度。并且,對(duì)于DG128 XS128這樣的MCU,默認(rèn)的emory分配方式已經(jīng)夠用了。從這個(gè)意義上講,搞清楚memory map似乎不必要。

          但是,你有沒(méi)有RAM不夠用的情況?有沒(méi)有想定義變量到FLASH ROM的情況?有沒(méi)有因?yàn)橛岣邔ぶ沸识x變量到非分頁(yè)區(qū)的情況?有沒(méi)有寫EEPROM但沒(méi)寫成功的情況?
          飛思的memory非常靈活,通過(guò)地址映射來(lái)提高效率是芯片制造商的一慣作風(fēng)(當(dāng)然,首先這個(gè)CPU要有這種尋址和內(nèi)存映射轉(zhuǎn)換機(jī)制),但是,縱觀HCS12(x) memory map的東西,真是做到極限了。用我以前的話講是,用有限的資源獲得無(wú)限的好處了??纯碊G128,64K的邏輯空間,映射之后RAM EEPROM FALSH ROM,都可以充分發(fā)揮作用,而且擴(kuò)展FLASH也方便。而XS128更高級(jí)一籌,有專門的MMC管理HCS12(x) memory map。
          我大體上了解這兩個(gè)片子的HCS12(x) memory map,因此就此談?wù)劺斫夂涂捶?,如有錯(cuò)誤,請(qǐng)大家不吝指出
          首先,說(shuō)說(shuō)6個(gè)概念。
          1 memory map 地址映射,不要理解成內(nèi)存映射,內(nèi)存是RAM。
          2 為什么要映射?因?yàn)镃PU的尋址是對(duì)物理地址操作,但是單片機(jī)的RESET之后只有相對(duì)地址。相對(duì)地址,我理解為是一塊一塊的,不是連斷的。相對(duì)地址,顧名思義,是個(gè)相對(duì)的,沒(méi)有映射之前,CPU是找不到他的,也用不了相對(duì)地址的數(shù)據(jù)。 粘一句百度上的解釋:為了保證CPU執(zhí)行指令時(shí)可正確訪問(wèn)存儲(chǔ)單元,需將用戶程序中的邏輯地址轉(zhuǎn)換為運(yùn)行時(shí)由機(jī)器直接尋址的物理地址,這一過(guò)程稱為地址映射。
          3 RAM,這個(gè)不多說(shuō),是存變量和棧的東西,高速,掉電即失。
          4 EEPROM,這個(gè)是一種特別的FLASH。一般用來(lái)保存少量數(shù)據(jù),掉電不會(huì)丟失。FLASH也是非易失的,SD卡就是一種FLASH。EEPROM和普通FLASH的區(qū)別,在于讀寫時(shí)的字節(jié)操作上。這個(gè)我基本上沒(méi)有體會(huì),因?yàn)槭窍喈?dāng)?shù)讓拥臇|西。
          5 FLASH和ROM,在HCS12(X)里,建議把FLASH和ROM等同起來(lái)理解。大家的程序就是放在這里面的。還有一個(gè)CONST變量和中斷向量也是存在這里面的。ROM可能有個(gè)誤區(qū),只能讀不能寫,一次性的,不錯(cuò)。但是,有加個(gè)前提,應(yīng)該是可控的ROM。
          6 還有一個(gè)重要的register 空間,這個(gè)是存放I/0地址和單片機(jī)可編程寄存器的空間,是廠家定義的。在頭文件里可以看到。如extern volatile PORTABSTR _PORTAB @(REG_BASE + 0x00000000)就是典型的register 空間映射。
          我把memory map理解成為3個(gè)內(nèi)容:一個(gè)是映射管理,一個(gè)是分頁(yè)機(jī)制,一個(gè)是尋址的問(wèn)題。映射管理,就是單片機(jī)RESET之后,邏輯地址和物理地址之間的關(guān)系。分頁(yè)機(jī)制的產(chǎn)生主要由于16位尋址能力有限,需要分頁(yè)解決,另外在虛擬內(nèi)存管理上可以獲得更多的優(yōu)勢(shì)。至于,CPU尋址的問(wèn)題,這個(gè)就不深糾了。
          這次以DG128的為例,XS128的稍復(fù)雜一些。理解了DG128的,XS128的問(wèn)題就不大。
          先說(shuō)一說(shuō)映射管理:DG128里通過(guò)設(shè)置INITRG、INITRM、INITEE來(lái)實(shí)現(xiàn)映射。具體的設(shè)置看DS吧。默認(rèn)情況下:register 空間映射到0X0000到0x03FF,這個(gè)優(yōu)先級(jí)最高。RAM空間映射到0x0400-0X1FFF,看到?jīng)]有,實(shí)際上只有7K,也就是說(shuō)能用的RAM只有7K。但是,DG128的RAM有8K的邏輯空間啊。所以,可以改INITRG、INITRM、INITEE重映射以提高RAM的實(shí)際可用空間。怎么改,看需要了。WJ在這里邏嗦一句,可以看看PE是怎么改的。而FLASH映射了3個(gè),有兩個(gè)非分頁(yè)地址0x4000-0x7FFF和0xC000-0xFEFF。還有一個(gè)分頁(yè)地址,這一個(gè)分頁(yè)址有6個(gè)頁(yè)面。6個(gè)頁(yè)面占用一個(gè)分頁(yè)窗,用一個(gè)邏輯空間,如何讓這6個(gè)頁(yè)面協(xié)作工作并讓CPU能找到他們呢?

          本文引用地址:http://www.ex-cimer.com/article/201611/319684.htm

          這就是分頁(yè)管理機(jī)制的內(nèi)容。這6個(gè)頁(yè)面分別是:
          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;
          上面說(shuō)的大家可以新建一個(gè)DG128工程,到PRM文件里看。
          再看看分頁(yè)管理機(jī)制:DG128里只有FLASH空間可以分頁(yè),而XS128里,分頁(yè)的東西太多了。DG128里FLASH分頁(yè)是通過(guò)PPAGE寄存器搞定的。PPAGE是5位寄存器,CPU12內(nèi)核規(guī)位每頁(yè)只能有16KB。因此DG128的FLASH尋址空間就是2^5*16KB=512KB了。

          首先問(wèn)一個(gè)問(wèn)題:
          中斷函數(shù)為什么要加:#pragma CODE_SEG __NEAR_SEG NON_BANKED 這個(gè)聲明?這個(gè)聲明是干什么用的?
          這要還是要從FLASH分頁(yè)和非分頁(yè)的區(qū)別說(shuō)起。
          下面詳細(xì)說(shuō)一說(shuō),F(xiàn)LASH里非分頁(yè)和分頁(yè)的使用。 要明白一點(diǎn),分頁(yè)是不可見(jiàn)的,要用的時(shí)候PPAGE參與尋址。
          1 FLASH里非分頁(yè)工作機(jī)制
          FLASH一共為128K,一頁(yè)是16K,那么應(yīng)該有8頁(yè)才是,但是實(shí)際只有6個(gè)分頁(yè)。有2個(gè)非分頁(yè)放在4000-7FFF,和C000-FFFF兩個(gè)邏輯地址窗里。那么,當(dāng)程序的尋址在64K之內(nèi)(2^16=64K,16位機(jī)的尋址能力是64K)時(shí),就不用分頁(yè)了,直接使用那兩個(gè)非分頁(yè)的數(shù)據(jù)。實(shí)際上,3E頁(yè) 3F頁(yè)是可見(jiàn)的,其實(shí)他們就是那2個(gè)非分頁(yè)的映射。因此,使用非分頁(yè)FLASH,就不須設(shè)置PPAGE寄存器,直接使用邏輯地址即可。見(jiàn)圖1。
          這點(diǎn)我們可以從以下看出:


          ROM_4000 = READ_ONLY 0x4000 TO 0x7FFF;
          ROM_C000 = READ_ONLY 0xC000 TO 0xFEFF;
          PLACEMENT
          NON_BANKED, INTOROM_C000;

          很直觀地看出,把這兩個(gè)可以直接使用邏輯地址的頁(yè)面設(shè)為NON_BANKED, 那么中斷函數(shù)放在NON_BANKED里,就可以把函數(shù)放在64K的尋址程序段中。這么一來(lái),進(jìn)中斷就方便多了,效率也高很多。這就是對(duì)本文開(kāi)篇的解釋。
          2FLASH里分頁(yè)工作機(jī)制
          好了,上面是3E頁(yè) 3F頁(yè)是可見(jiàn)的分頁(yè)區(qū),還有3D 3C 3B 3A 39 38不可見(jiàn)的分頁(yè)區(qū)。當(dāng)你的程序要尋址64K以外的空間,即不是是可見(jiàn)的3E頁(yè) 3F頁(yè)時(shí),就要涉及分頁(yè)了。
          PPAGE是MMC模塊的東西,我搞了個(gè)圖片大家看看,如圖2。每一頁(yè)在DG128中的邏輯地址都是由PPAGE中的頁(yè)號(hào)和重疊窗口內(nèi)地址組成的24位絕對(duì)地址。通過(guò)設(shè)置寄存器PPAGE,可以使用全部的FLASH空間。例如:程序要將數(shù)據(jù)存入$3D頁(yè),設(shè)置PPAGE的值為$3D,那么邏輯地址范圍說(shuō)是$3D8000-$3DBFFF。有一點(diǎn)要注意:為了分頁(yè)描述的完整性,可以如下理解:對(duì)于3E頁(yè) 3F頁(yè)有兩個(gè)邏輯地址映射到物理地址。拿3E頁(yè)來(lái)說(shuō),有$004000-$007FFF和$3E8000-$3EBFFF。
          對(duì)于程序是如何尋址,這個(gè)是內(nèi)核的東西,大家可以看看CPU這個(gè)文檔。
          通過(guò)分析,相信大家知道地址這個(gè)東西是非常有用的吧。下次說(shuō)說(shuō)XS128,XS128的RAM FLASH EEPROM都可以分頁(yè)。更高級(jí),更主動(dòng),編程彈性更大。



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();