|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
向各位大俠請教幾個存儲器映射方面的問題! |
| 作者:bush_em 欄目:ARM技術 |
請教: 問題1: 1:為什么要存儲器映射控制,一般是在什么情況下發(fā)生存儲器映射控制呢? 問題2 2:存儲器映射控制,是不是專用中斷的? 問題3: 3:書上原文:“ 列如,每當產(chǎn)生一個軟件中斷請求,ARM 內(nèi)核就從 0x00000008 處取出 32 位數(shù)。這就意味著: 當 MEMMAP[1:0]=10 (用戶 ARM 模式)時,從 0x00000008 的讀數(shù)/取指是對 0x40000008 單元進行操作! 請教,是不是芯片規(guī)定了當發(fā)生中斷時,ARM 就是從 0x00000008 處取出 32 位數(shù)? 問題4 4:書上原文“ 用戶程序需要隨時更改異常向量表,可以將異常向量表(64字節(jié))復制到片內(nèi) RAM 的 0x40000000 地址上, 然后設置 MEMMAP=2 進行重新映射,0x40000000 地址上的向量表就可以更改了。” 請教,為什么要將 異常向量表(64字節(jié))復制到片內(nèi) RAM 的 0x40000000 地址上呢? 是不是因為 片內(nèi) RAM 的其始地址就是 0x40000000 ? 還有 然后設置 MEMMAP=2 進行重新映射,0x40000000 地址上的向量表就可以更改了 各位大哥詳細解釋一下,好嗎? 辛苦各位大俠了!謝謝! |
| 2樓: | >>參與討論 |
| 作者: hiberhe 于 2005/9/20 16:50:00 發(fā)布:
隨便說說 我覺得存儲器重映射其實很簡單:我們知道,復位和發(fā)生中斷時,CPU是從固定地址讀取復位和中斷向量. 系統(tǒng)復位時,MCU一般是從0x0處開始指向,這樣一來,在0x0處一般就只能是ROM了,以后發(fā)生中斷,一般也是在這隨近取指.這樣一來,有時不是太靈活,比如bootloader中用到中斷(這個在arm中好像還好弄一點,在純ROM的MCU中更麻煩),同時像arm之類的,在ROM中執(zhí)行有許多不方便的地方. 于是就有了存儲器重映射的方法:就是通過程序控制,把非0x0處的存儲器,映射到0x0處.這樣一來,這部分存儲器對于CPU而言,跟在0x0處沒有分別,于是發(fā)生中斷時,中斷向量就從這兒取了. 至于能干什么用,就是各顯神通了,比如你可以在0x0處放一個bootloader,執(zhí)行完相關初始化程序后(在8位MCU中可以方便的用來進行IAP),然后重映射主程序,這樣很方便的.在arm中的話,可以先將代碼copy到RAM中,重映射以后,代碼全在ram中執(zhí)行(發(fā)生中斷后,也從RAM中取指),速度會快不少的:) 也不知道說得有沒有不妥的地方,其實你問的問題我也不知道是這是指這個. |
|
| 3樓: | >>參與討論 |
| 作者: bush_em 于 2005/9/20 17:07:00 發(fā)布:
hiberhe 大哥,謝謝! hiberhe 大哥: 您好! 我要的就是您說的啊 我還是有幾個地方?jīng)]懂: 問題1: 您說:“ 把非0x0處的存儲器,映射到0x0處” 這件工作是 芯片自己做的,還是要程序員做的。 如果是需要程序做的話,那要怎么寫程序啊 hiberhe 大哥,舉個具體的列子,好嗎? 問題2: 于能干什么用,就是各顯神通了,比如你可以在0x0處放一個bootloader,執(zhí)行完相關初始化程序后(在8位MCU中可以方便的用來進行IAP),然后重映射主程序,這樣很方便的.在arm中的話,可以先將代碼copy到RAM中,重映射以后,代碼全在ram中執(zhí)行(發(fā)生中斷后,也從RAM中取指),速度會快不少的:) hiberhe 大哥,重映射主程序,到底做了哪些工作呢? 還有,請大哥幫我看看: “ 請教:各位大俠,幫我看看下面這段程序,我有幾個地方不理解!” 這個帖子。 謝謝大哥! |
|
| 4樓: | >>參與討論 |
| 作者: hiberhe 于 2005/9/20 23:23:00 發(fā)布:
別稱大哥啦,叫hiber就好了 重映射不同的MCU不用.當然不是芯片自己做的,芯片不知道你需不需要重映射,以不知道你將哪塊存儲器得映射到0x0.通過在程序中設置MCU的寄存器來實現(xiàn)的.這個不同的MCU有不同的寄存器.看MCU的文檔就知道了.我知道4510是可以重映射的(自己沒實際用過,初學ARM,還是超級菜鳥),我用的44B0X不可以重映射,所以也不好給例子. 看一下CPU的文檔就知道了,很簡單的.也要注意重映射時對一些注意事項,這個在CPU的文檔里都有的. 說白了,重映射就是要CPU將非0x0處的存儲器當作0x0處來用,就這么簡單,具體CPU是怎么實現(xiàn)的,根本不用關心.設置了重映射以后,在你的程序中,就要把那片區(qū)域當作0x0的. 要完成重映射,反正就是操作一下寄存器而已. 不知道自己有沒有說清楚. |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |