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

          新聞中心

          EEPW首頁 > 設(shè)計(jì)應(yīng)用 > 深入理解MCU啟動原理

          深入理解MCU啟動原理

          作者: 時間:2025-01-23 來源: 收藏

          最開始一啟動后去哪里讀代碼?

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

          CPU上電啟動后被設(shè)計(jì)為去地址0x00000000位置處讀取代碼;首先會連續(xù)讀取兩個字,分別是棧指針初始值和復(fù)位異常處理函數(shù)的地址;然后跳去執(zhí)行復(fù)位異常處理函數(shù)。

          640-3.png

          640-4.png

          當(dāng)然在一些早期的ARM處理器設(shè)計(jì)中,如Arm7TDMI,復(fù)位后會直接讀取0地址處的代碼進(jìn)行執(zhí)行,由軟件初始化棧指針,0地址處存放的直接就是中斷處理函數(shù),而不是函數(shù)地址。所以我們可以有理由推測出,第一個字是棧地址是因?yàn)榻酉聛淼膹?fù)位中斷處理函數(shù)涉及函數(shù)跳轉(zhuǎn),可能已經(jīng)需要存放內(nèi)容在棧里了。

          0x0地址處是bootROM代碼嗎,還是用戶bootloader代碼?

          答案是都可以,這其實(shí)取決于用戶的代碼是存放在哪里的。比如說對于一些性能強(qiáng)的(如Cortex-A系列)來說,代碼本身體積比較大,存放在SD卡里或者QSPI/SPI Flash里都有可能,這些啟動一定是先去bootROM執(zhí)行代碼,因?yàn)镾D卡、SPI Flash的儲存不在MCU的統(tǒng)一編址空間里,沒初始化這些外設(shè)前根本無法訪問,bootROM這塊Nor Flash就一定是可以被MCU直接通過總線地址訪問的,0地址的代碼位于bootROM中。

          代碼從bootROM中起來后,通過啟動引腳判斷從哪個外設(shè)中搬用戶程序,并去初始化相應(yīng)外設(shè),將外設(shè)中存儲的用戶代碼搬到內(nèi)部SRAM中執(zhí)行。后續(xù)的啟動流程不贅述。

          640-5.png

          對于一些小容量的MCU來說,比如Cortex-M3/M4,他們的芯片里有內(nèi)置Flash,這個Flash的特點(diǎn)跟上面說的bootROM很像,是MCU可以直接通過地址總線去訪問到的,不需要進(jìn)行外設(shè)初始化的。當(dāng)然,這些MCU內(nèi)部也是有bootROM的,因此這些MCU一上電可以選擇從bootROM中啟動,也可以選擇從內(nèi)置Flash中啟動,是通過外部引腳進(jìn)行選擇的,選擇了誰,就把誰的起始地址映射到0地址處。

          640-6.png

          類似Cortex-M3/M4是如何保證Flash起始地址是棧指針和復(fù)位異常處理函數(shù)指針的?

          這一點(diǎn)實(shí)際是通過編譯的鏈接文件制定的。比如說如下是我截取的IAR的鏈接文件.icf。

          640-7.png

          MCU有可能不從0地址開始讀代碼嗎?

          M7內(nèi)核芯片比較靈活了,改變了固定從0x0000 0000地址讀取中斷向量表的問題,以STM32H7為例,可以從0x0000 0000到0x3FFF 0000所有地址進(jìn)行啟動。專門安排了個選項(xiàng)字節(jié)來配置。



          關(guān)鍵詞: MCU

          評論


          相關(guān)推薦

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