專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月16日   【字體:

前些時(shí)候一直不明白"memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);"的用途,今天算是了解了,就是將異常向量表放到0地址處、發(fā)生異常的時(shí)候CPU總是跳轉(zhuǎn)到這里取指執(zhí)行。

 

如果這里沒有異常向量表、異常就得不到處理、而且CPU還無法從這個(gè)區(qū)域返回到跳轉(zhuǎn)之前的地方。

先貼圖

圖中左邊是反匯編代碼、可以看到機(jī)器碼。

而且由于映像文件的入口地址Image entry point設(shè)為0x30000000、也就是使用調(diào)試器調(diào)試,

所以圖中的代碼是從0x30000000開始存放(標(biāo)號'ResetEntry'在0x30000000地址處)。

注意每條語句的機(jī)器碼(方括號'[XXX]'里面的數(shù)據(jù))。

右邊是打開的用來下載.bin文件、里面就是機(jī)器碼。

它和反匯編里面的機(jī)器碼一樣、注意是little endian模式。

運(yùn)行 memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);語句之前、0地址處的值都是FF。

運(yùn)行完畢之后、0地址處的值如下圖


這條語句是從0x30000000處開始、復(fù)制4K代碼到0地址處。

上圖中從0地址開始的代碼和.bin文件里面的代碼一樣、而且只是前4K一樣。

就我的板子TX-2440來說 :

如果是Norflash啟動、那么0地址在Norflash,就是復(fù)制到Norflash。

如果是Nandflash啟動、那么0地址在BootRAM,就是復(fù)制到BootRAM。

語句這樣做的目的是將異常向量表復(fù)制到0地址處、因?yàn)榘l(fā)生異常的時(shí)候、CPU自動跳轉(zhuǎn)到0地址處讀取指令。

要是0地址處沒有這個(gè)異常向量表、那么就無法處理異常,中斷就無法執(zhí)行,含有中斷的程序就會出錯,

CPU無法返回到跳轉(zhuǎn)之前的地方。 

沒有這條復(fù)制語句、那么0x0~0x30000000之間的內(nèi)存里絕大多數(shù)是FF、少數(shù)是00 :

 

關(guān)閉窗口

相關(guān)文章