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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 關(guān)于一個(gè)arm 異常向量表的問(wèn)題的擴(kuò)展

          關(guān)于一個(gè)arm 異常向量表的問(wèn)題的擴(kuò)展

          作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò) 收藏
          很長(zhǎng)時(shí)間沒(méi)有寫bolg了,看看各位同仁的博客,讓我很慚愧,我決定從今天開始,努力堅(jiān)持寫blog,加油~

          今天在上chinaunix 的時(shí)候,一個(gè)網(wǎng)友有關(guān)中斷向量表的問(wèn)題。

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

          具體的鏈接http://bbs.chinaunix.net/thread-3620484-1-1.html,對(duì)于這個(gè)問(wèn)題,我講了我的一些看法,那個(gè)同學(xué)表示completely 明白了,我也覺(jué)的很高興~

          對(duì)于問(wèn)題,我覺(jué)的牽扯的東西還是比較多,所以我今天就決定就這個(gè)問(wèn)題,在簡(jiǎn)單的拓展一下~

          對(duì)于一個(gè)特定(ARM)的機(jī)器而言,一般有3個(gè)軟件的生命周期。

          第一個(gè) 生命的周期稱之為 rom boot(一級(jí)boot),這是有具體的芯片生產(chǎn)商來(lái)實(shí)現(xiàn)的。這個(gè)rom boot 十分重要,因?yàn)樗憔唧w的產(chǎn)品量產(chǎn),以及機(jī)器的啟動(dòng)方式有著很重要的關(guān)系.

          三星 有個(gè)芯片叫 6410 ,它的啟動(dòng)方式有 nand flash 啟動(dòng) 和sd 啟動(dòng),就是說(shuō)你可以通過(guò)多個(gè)外部 IO 口的高低電平來(lái)確定是從SD 啟動(dòng),還是從nand flash 啟動(dòng).那么為什么會(huì)這樣呀?

          原因就是rom boot.比如說(shuō),如果6410 是從SD 啟動(dòng),那么rom 會(huì)根據(jù)外部 IO 高低電平來(lái)得知這個(gè)信息,并從SD 卡的某個(gè)扇區(qū)讀取數(shù)據(jù)(這個(gè)數(shù)據(jù)是用戶自己的軟件,對(duì)于6410來(lái)講 是uboot),加載到ddr 中.

          第二個(gè) 生命的周期是 boot loader (二級(jí)boot)

          第三個(gè)生命的周期是 system

          對(duì)于發(fā)帖的內(nèi)容我是這個(gè)回應(yīng)的,

          就是在bootloader 和你的system 是運(yùn)行在同一機(jī)器上兩個(gè)不同的軟件。
          uboot 完成必要的操作后,就把控制權(quán)交給了system
          這里面有兩個(gè)階段
          階段1 uboot 運(yùn)行階段,這時(shí)候如果出現(xiàn)異常,就會(huì)轉(zhuǎn)到絕對(duì)地址(假設(shè)映射的是存儲(chǔ)介質(zhì)A)上去比如說(shuō) undefine,但是在udefine 處理中,是一個(gè)死循環(huán),這個(gè)也是有道理的,因?yàn)樵赽ootloader 中不允許出現(xiàn)異常,所以這時(shí)候你要檢查你自己bootloader 中的代碼。
          階段2 system運(yùn)行階段, 由于這個(gè)時(shí)候,已經(jīng)進(jìn)行了地址的remap ,所以絕對(duì)地址 映射的是不同的存儲(chǔ)介質(zhì)B。介質(zhì)B中的undefine 中的處理就是system 軟件定義的undefine ,和你uboot中的不是一回事。

          從上面我的回應(yīng)可以看出

          我主要闡明的觀點(diǎn)是

          軟件的生命周期 。發(fā)帖的同學(xué)其實(shí)是把軟件的第二生命周期和第三生命周期混為一談了。

          接著讀者又問(wèn)


          現(xiàn)在不解的問(wèn)題是,是不是編譯器把異常向量編譯到特定的地址上,然后CPU發(fā)生異常才跳轉(zhuǎn)呢?


          不管你的代碼怎么寫的,只要發(fā)生(undefine)異常,cpu就會(huì)到0x00000004 這個(gè)地址去指令
          其他的異常也是一樣(這是一個(gè)硬件的行為)。具體你0x00000004 上是什么內(nèi)容,那就是你軟件的事情了(你寫的代碼和編譯的事情了)。


          還有我們是不是必須在整個(gè)程序的第二行開始寫異常向量表呢,

          恩,這個(gè)是規(guī)定好的,我見(jiàn)過(guò)的程序都是這樣寫的,另外arm 相關(guān)的手冊(cè)上應(yīng)該有相應(yīng)的說(shuō)明內(nèi)容。

          這是一種和編譯器的約定嗎?
          這個(gè)是arm 硬件約定的,但是需要用編譯的來(lái)實(shí)現(xiàn),確定把處理異常的代碼放在正確的位置(中斷向量表)

          通過(guò)我上面的回答,可以看出有時(shí)候具體的軟件的code 是和硬件息息相關(guān)的,哪個(gè)位置需要什么樣的代碼,都是規(guī)定好的,我覺(jué)得這是一個(gè)驅(qū)動(dòng)軟件和應(yīng)用軟件的區(qū)別。如果要做底層軟件的話,也必須了解硬件,因?yàn)橛行┐a可能看起來(lái)是沒(méi)有邏輯的,但是這些代碼的邏輯性確實(shí)是存在的,只不過(guò)這個(gè)觀看代碼的主體不是人,而是你的機(jī)器,你的硬件,你的網(wǎng)卡,你的SD host,太多了~



          關(guān)鍵詞: arm異常向量

          評(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); })();