新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 關于一個arm 異常向量表的問題的擴展

        關于一個arm 異常向量表的問題的擴展

        作者: 時間:2016-11-10 來源:網絡 收藏
        很長時間沒有寫bolg了,看看各位同仁的博客,讓我很慚愧,我決定從今天開始,努力堅持寫blog,加油~

        今天在上chinaunix 的時候,一個網友有關中斷向量表的問題。

        本文引用地址:http://www.104case.com/article/201611/317545.htm

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

        對于問題,我覺的牽扯的東西還是比較多,所以我今天就決定就這個問題,在簡單的拓展一下~

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

        第一個 生命的周期稱之為 rom boot(一級boot),這是有具體的芯片生產商來實現的。這個rom boot 十分重要,因為它跟你具體的產品量產,以及機器的啟動方式有著很重要的關系.

        三星 有個芯片叫 6410 ,它的啟動方式有 nand flash 啟動 和sd 啟動,就是說你可以通過多個外部 IO 口的高低電平來確定是從SD 啟動,還是從nand flash 啟動.那么為什么會這樣呀?

        原因就是rom boot.比如說,如果6410 是從SD 啟動,那么rom 會根據外部 IO 高低電平來得知這個信息,并從SD 卡的某個扇區讀取數據(這個數據是用戶自己的軟件,對于6410來講 是uboot),加載到ddr 中.

        第二個 生命的周期是 boot loader (二級boot)

        第三個生命的周期是 system

        對于發帖的內容我是這個回應的,

        就是在bootloader 和你的system 是運行在同一機器上兩個不同的軟件。
        uboot 完成必要的操作后,就把控制權交給了system
        這里面有兩個階段
        階段1 uboot 運行階段,這時候如果出現異常,就會轉到絕對地址(假設映射的是存儲介質A)上去比如說 undefine,但是在udefine 處理中,是一個死循環,這個也是有道理的,因為在bootloader 中不允許出現異常,所以這時候你要檢查你自己bootloader 中的代碼。
        階段2 system運行階段, 由于這個時候,已經進行了地址的remap ,所以絕對地址 映射的是不同的存儲介質B。介質B中的undefine 中的處理就是system 軟件定義的undefine ,和你uboot中的不是一回事。

        從上面我的回應可以看出

        我主要闡明的觀點是

        軟件的生命周期 。發帖的同學其實是把軟件的第二生命周期和第三生命周期混為一談了。

        接著讀者又問


        現在不解的問題是,是不是編譯器把異常向量編譯到特定的地址上,然后CPU發生異常才跳轉呢?


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


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

        恩,這個是規定好的,我見過的程序都是這樣寫的,另外arm 相關的手冊上應該有相應的說明內容。

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

        通過我上面的回答,可以看出有時候具體的軟件的code 是和硬件息息相關的,哪個位置需要什么樣的代碼,都是規定好的,我覺得這是一個驅動軟件和應用軟件的區別。如果要做底層軟件的話,也必須了解硬件,因為有些代碼可能看起來是沒有邏輯的,但是這些代碼的邏輯性確實是存在的,只不過這個觀看代碼的主體不是人,而是你的機器,你的硬件,你的網卡,你的SD host,太多了~



        關鍵詞: arm異常向量

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 阿瓦提县| 博客| 政和县| 鲁甸县| 恩施市| 娄底市| 平度市| 米泉市| 田林县| 桂平市| 延川县| 夏邑县| 个旧市| 大同市| 无极县| 乌审旗| 新余市| 资兴市| 青海省| 堆龙德庆县| 同心县| 视频| 积石山| 玛纳斯县| 阿勒泰市| 大理市| 安岳县| 天峨县| 龙川县| 太湖县| 沁水县| 勐海县| 齐齐哈尔市| 临武县| 松原市| 连州市| 达州市| 东乡族自治县| 霍邱县| 伽师县| 营口市|