一直以來被S12HY64的局部地址與全局地址的對(duì)應(yīng)關(guān)系所困擾,今天通過看Datasheet貌似有了進(jìn)一步的理解,記錄下來以備參考,當(dāng)然這些理解也不一定都對(duì)。 S12系列單片機(jī)總線寬度為16位,從總線寬度來看其最大尋址空間為2^16=64KB,但是這個(gè)系列的單片機(jī)最大有256KB全局地址空間,那么是如何用16位的總線尋址這么大的地址空間呢?這里就涉及到局部地址和全局地址的概念了。所謂的局部地址可以理解為尋址寄存器的值(例如51單片機(jī)的程序計(jì)數(shù)器PC是用于ROM尋址的寄存器),范圍為0x0000~0xffff,共64KB;全局地址包括RAM、DFlash、PFlash、寄存器等所占用的地址空間,范圍為0x0000~0x3ffff,共256KB。 S12的全局地址分為所謂的Paged Address和Unpaged Address,即通過頁映射訪問的和非頁映射訪問的。先拿比較容易理解的Unpaged Address來說,例如尋址寄存器的值處于0x4000~0x7fff范圍時(shí),等同訪問全局地址0x34000~0x37fff中的某個(gè)字節(jié),也就是說對(duì)于Unpaged Address,局部地址的某個(gè)固定范圍是和全局地址的某個(gè)固定范圍是對(duì)應(yīng)的。下面說下比較復(fù)雜一點(diǎn)的Paged Address是如何訪問到的。 對(duì)于Paged Address,則需要通過頁映射的方式來訪問了,這里涉及到全局地址的頁的概念、頁映射寄存器PPAGE和局部地址中用于頁映射的地址范圍0x8000~0xbfff。全局地址最大可達(dá)256KB,分為16個(gè)Page,每個(gè)Page的大小為16KB,頁號(hào)為0x00~0x0f(當(dāng)然對(duì)于PFlash較小的單片機(jī),全局地址的某些范圍是無法訪問的,通俗理解就是S12單片機(jī)的全局地址范圍是0x0000~0x3ffff,根據(jù)PFlash的大小適當(dāng)將其放置于全局地址的某些范圍中。這里特別注意的是并不是PFlash的放置一定是從低地址開始的,有可能是從高地址開始放置的,例如HY64就是從高地址開始放置PFlash,占用了頁號(hào)為0x0c~0x0f的地址空間)。全局地址中頁號(hào)為0x02~0x0b的PFlash頁是需要通過頁映射的方式來訪問的。寄存器PPAGE用于設(shè)置需要訪問的頁號(hào),例如設(shè)置PPAGE的值為0x02,則說明要訪問的是全局地址中的頁號(hào)0x02。舉個(gè)例子,若尋址寄存器的值為0x8000,PPAGE的值為0x02,說明訪問的全局地址是0x02 * 16K + (0x8000 - 0x8000) = 0x8000,通俗理解就是此時(shí)局部地址范圍0x8000~0xbfff與頁號(hào)為0x02的全局地址范圍是對(duì)應(yīng)的。如果把局部地址0x8000看做用于頁映射的基地址LOCAL_BASE_ADDR_FOR_PAGE,尋址寄存器的值為L(zhǎng)OCAL_ADDR,PPAGE寄存器的值為PPAGE_VALUE(不為0),則要訪問的全局地址是PPAGE_VALUE * 16K + (LOCAL_ADDR - LOCAL_BASE_ADDR_FOR_PAGE)。 以上簡(jiǎn)要說了局部地址與全局地址的關(guān)系,其實(shí)CodeWarrior用于鏈接設(shè)置的Project.prm文件中還涉及到邏輯地址(暫且叫邏輯地址)的概念。全局地址最大為0x37fff,用18個(gè)BIT就可以表示出來,但是若看一下Project.prm文件中的地址,發(fā)現(xiàn)有些值已經(jīng)超過了0x37fff,例如HY64 Project.prm中頁號(hào)為0x0c的地址范圍為0x0C8000 TO 0x0C93FF,可見其值已經(jīng)超過了0x37fff,這是什么鬼?其實(shí)這就是所謂的邏輯地址表示方法,拿0x0c8000來說,8000表示尋址寄存器的值,0x0c表示頁號(hào)。邏輯地址就是把Paged Address表示成頁號(hào)+(頁內(nèi)偏移量+LOCAL_BASE_ADDR_FOR_PAGE)的形式。 為了不至于將局部地址、全局地址、邏輯地址的概念相混淆,可以這樣理解:局部地址是尋址寄存器可以訪問的地址(受總線位數(shù)限制),但是通過Paged和Unpaged兩種映射方式可以訪問到全部全局地址;邏輯地址只是編譯器使用的用于鏈接設(shè)置的,我們?cè)诰幊虝r(shí)較少使用(若遇到使用邏輯地址的情況將擴(kuò)充這一部分內(nèi)容,例如在開發(fā)BootLoader時(shí))。 |
|