色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從上電到啟動,帶你拿捏單片機啟動全流程

朱老師物聯網大講堂 ? 2024-05-07 08:10 ? 次閱讀


從事嵌入式開發的伙伴可能會思考過一個問題,我們一般都是使用芯片廠商提供的驅動庫和初始化文件,直接從main函數開始寫程序,那么系統上電之后,程序怎么引導進main函數執行的呢?還有,系統上電之后RAM的數據是隨機的,那么定義的全局變量的初始值又是怎么實現的呢?下面我將帶著這兩個問題,以Cortex-M架構為例,采用IAR EWARM作為編譯工具鏈,從系統上電之后執行的第一條代碼開始,梳理系統的啟動過程,了解編譯器在此期間所做的工作。其他的工具鏈,如Keil和GCC在系統初始化過程所做的工作也是相似的,但具體的實現有所差異。

一、啟動文件

芯片廠商提供的啟動文件,一般是采用匯編語言編寫,少數用C語言。在啟動文件中一般至少存在下面兩個部分內容:向量表默認的中斷和異常處理程序

向量表實際上是一個數組,放置在存儲器的零地址,每個元素存儲的是各個中斷或異常處理程序的入口地址。以STM32F107芯片基于IAR工具的啟動文件為例:

33a54eb2-0c06-11ef-9118-92fbcf53809c.png

文件的開頭定義了一個名為__vector_table的全局符號,“DATA”的作用是在代碼段中定義一個數據區,用作向量表。數據區的內容是使用DCD指令定義的32位寬度常量,除了第一個sfe(CSTACK)比較特殊以為,其他的常量都是異常和中斷服務程序的地址(在編譯時函數名會被替換成函數的入口地址)。sfe(CSTACK)是IAR匯編器段操作,用于獲取段(section)的結束地址,在這里意欲何為呢?實際上這是獲取堆棧基地址的操作。IAR在鏈接器腳本(*.icf)文件中定義堆棧,實際是定義了一個名為“CSTACK”的空閑塊(block),如下圖的腳本命令所示。所謂的塊就是保留一段連續的地址空間,用來作為堆棧或者堆。當然,塊也可以是用內容的,例如可以用來管理段,但不在今天的討論范圍。33bb593c-0c06-11ef-9118-92fbcf53809c.png我們知道Cortex-M架構的堆棧模型是滿減棧,堆棧從高地址向低地址增長,因此堆棧的基地址是CSTACK的結束地址。向量表的第一個元素是棧基址這是由Cortex-M架構定義的。系統上電后硬件自動從向量表中獲取,并設置主堆棧指針MSP,而不是像其他ARM架構,堆棧指針需要通過軟件來設置。向量表中第二個元素是復位異常(Reset_Handler)的入口地址。系統上電后,硬件自動從__vector_table + 4的位置讀取,并從讀取到的地址開始執行。系統上電后CPU執行的第一條是Reset_Handler函數的第一條語句。33c8f0d8-0c06-11ef-9118-92fbcf53809c.png

上面的THUMB命令表示接下來的代碼采用THUMB模式(Cortex-M只支持Thumb-2指令集);SECTION用于定義一個段,段名為“.ResetHandler”,段的類型是代碼(CODE);REODER指示用給定的名稱開啟一個新的段;ROOT指示鏈接器,當段內的符號沒有被引用,鏈接器也不可以丟棄這個段。

PUBWEAK是弱定義,如果用戶在其他位置編寫了中斷處理函數,在連接時實際鏈接用戶所編寫的,啟動文件中用匯編寫的服務函數會忽略。之所以要在啟動文件中以弱定義的方式編寫全部的異常和中斷服務函數,是為了防止用戶在沒有編寫服務函數的情況下開啟并觸發了中斷,導致系統的不確定。

二、系統初始化過程

在EWARM的工程Options > Debugger > Setup中將“Run to”勾選取消,這樣在進入調試之后就會停第一條要執行的代碼的位置:

341a0b6c-0c06-11ef-9118-92fbcf53809c.png

進入調試之后會停在啟動文件Reset_Handler函數第一條匯編指令位置:

34286dc4-0c06-11ef-9118-92fbcf53809c.png

此時,通過寄存器觀察窗口查看SP的值為0x20009820。通過鏈接時生成的map文件,查看CSTACK的地址范圍,0x20009820正好是CSTACK的結束地址。有了MSP,C代碼就能運行了。

34329664-0c06-11ef-9118-92fbcf53809c.png

ystemInit函數是芯片廠商根據ARM的CMSIS標準提供的一個系統基礎配置函數,配置基礎的時鐘系統和向量表重定位等。這里的LDR是偽指令,它將SystemInit函數的地址加載到寄存器R0,實際上是通過PC偏移尋址來獲取SystemInit的地址。

34426850-0c06-11ef-9118-92fbcf53809c.png3450cecc-0c06-11ef-9118-92fbcf53809c.png

從上面的圖可以發現一個問題,在反匯編窗口可以觀察到SystemInit的地址是0x20000150,但加載到R0寄存器后卻是0x20000151。這是因為在使用跳轉指令更新PC時,需要置PC的LSB為1,以表示THUMB模式,由于Cortex-M不支持ARM模式,因此LSB總是1。

執行完芯片廠商提供的SystemInit函數之后,跳轉到__iar_program_start,這是IAR編譯器提供的初始化代碼的入口。

34719882-0c06-11ef-9118-92fbcf53809c.png

__iar_program_start首先會執行兩個函數:__iar_init_core和__iar_init_vfp,可以完成一些CPU和FPU相關的初始化操作,在某些ARM架構打包好的運行時庫會有這兩個函數,用戶也可以重寫這兩個函數來自己實現一些相關的操作。

之后,跳轉到__cmain函數執行。在__cmain中調用了一個__low_level_init函數,該函數專門用于提供給用戶編寫一個初階的初始化操作,它在全局變量初始化之前執行,例如可用在__low_level_init中初始化SDRAM,這樣就可以將全局變量定義到SDRAM中使用。

347c34d6-0c06-11ef-9118-92fbcf53809c.png

__low_level_init可以在任意的C文件中編寫,注意它的返回值,如果返回0,后續就會跳過變量初始化操作,正常一般都是返回1。

348992de-0c06-11ef-9118-92fbcf53809c.png

三、全局變量的初始化

此后進入到__iar_data_init3函數,在這里會完成所有具有初始值的全局/靜態變量的賦值,以及零初始化全局/靜態變量的清零操作,分別調用__iar_copy_init3和__iar_zero_init3,將保存在ROM區由鏈接器生成的變量初始值復制到變量的地址。注意,新的EWARM版本默認變量初始化操作可能會采用壓縮算法,實際變量初始化調用的函數可能有區別。34b4b3ec-0c06-11ef-9118-92fbcf53809c.png

在全局變量未初始化之前,通過watch窗口可以看到,變量的值都是隨機數。

34c207c2-0c06-11ef-9118-92fbcf53809c.png

在__iar_data_init3執行完成后,全部變量的初值賦值已經完成。

34cd1270-0c06-11ef-9118-92fbcf53809c.png

在__cmain函數的最后,跳轉到用戶的main函數,最終開始用戶的代碼執行。

34dc4286-0c06-11ef-9118-92fbcf53809c.png

四、總結

339b54ca-0c06-11ef-9118-92fbcf53809c.png

了解了編譯器所提供的初始化過程和處理器架構,我們可以根據自己的需求定制系統的初始化。例如,在進入__iar_program_start之前,就可以執行必要的硬件初始化操作,可以用匯編寫,也可以用C寫。還可以手動控制變量的初始化操作,自己實現變量的初始化。甚至,完全不采用IAR編譯器提供的初始化操作,自己從復位序列引導至main函數那也是可以的。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    456

    文章

    51154

    瀏覽量

    426293
  • 單片機
    +關注

    關注

    6042

    文章

    44617

    瀏覽量

    637606
  • 嵌入式
    +關注

    關注

    5090

    文章

    19176

    瀏覽量

    306915
收藏 人收藏

    評論

    相關推薦

    單片機復位和冷啟動詳細介紹

    單片機啟動很簡單,關,再上,正常復位后,就冷啟動成功。單片機
    的頭像 發表于 02-12 13:38 ?2w次閱讀
    <b class='flag-5'>單片機</b>復位和冷<b class='flag-5'>啟動</b>詳細介紹

    淺析STM32單片機啟動文件

    今天來總結的stm32基礎知識是啟動文件相關。要想對是stm32單片機有個深入的理解,那么啟動文件就是一個繞不過去的坎。
    發表于 06-12 16:49 ?2132次閱讀
    淺析STM32<b class='flag-5'>單片機</b>的<b class='flag-5'>啟動</b>文件

    單片機啟動代碼

    帶你來看看單片機啟動代碼!
    發表于 05-26 12:45

    單片機有時候上啟動是為什么

    遇到有些國產 單片機有時候上啟動的問題,一般出現的情況是LVR設置有問題,最常見是兼容3.3V 5V供電的MCU,有時候默認是5V配置,在3.3V可能出現上無法
    發表于 11-03 06:11

    單片機是如何啟動

    接觸單片機有幾年的時間了,一直專注于如何在單片機上寫一些應用,對單片機如何啟動的知之甚少,慚愧慚愧。。。今天得空整理了一下,加深了對單片機
    發表于 11-03 08:58

    單片機是如何啟動

    單片機啟動過程是加后,先運行芯片內部固有程序(這個程序是用戶訪問不到也改寫不了的),即啟動代碼。啟動代碼程序建立完運行環境后,會去讀串口
    發表于 11-25 09:26

    RK3188 從上開始啟動內核為止的過程是怎樣去完成的

    如何獲取RK3066的BootRom呢?有哪些步驟?RK3188從上開始啟動內核為止的過程是怎樣去完成的?
    發表于 02-18 07:11

    ARM單片機啟動代碼研究

    摘要:在32位ARM核單片機嵌入式系統的開發中,為了保證系統能正常獨立運行,用戶必須編寫自己的啟動程序。以飛利浦公司的LPC2210單片機為例,在ADSl.2集成開發環境中,介紹了啟
    發表于 09-11 10:11 ?42次下載

    單片機啟動代碼

    。。。扯遠了!其實電腦本身就是從單片機而來,那么單片機也是有啟動代碼的,只是我們絕大部分情況不去關心它。啟動代碼究竟都干了些什么工作,為何需要它?想想你在c語言中用到了什么東西,而這些
    發表于 11-13 16:06 ?30次下載
    <b class='flag-5'>單片機</b>的<b class='flag-5'>啟動</b>代碼

    單片機啟動過程

    啟動過程簡介單片機啟動過程是加后,先運行芯片內部固有程序(這個程序是用戶訪問不到也改寫不了的),即啟動代碼。
    發表于 11-17 10:21 ?8次下載
    <b class='flag-5'>單片機</b>的<b class='flag-5'>啟動</b>過程

    單片機啟動流程分析

    單片機啟動流程概述單片機后一直到準備好C語言運行環境并跳轉到main函數執行總共經歷了5個步驟:1.內核初始化;2.強制PC指針指向
    發表于 11-17 11:36 ?10次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>啟動</b><b class='flag-5'>流程</b>分析

    STM32 單片機啟動流程

    STM32 單片機啟動流程剛接觸ARM的cortex-m系列單片機時,被告知一切都從main() 函數開始,要將程序寫在main()函數中。而仿真時也貌似是從main() 函數開始的,
    發表于 11-19 10:21 ?35次下載
    STM32 <b class='flag-5'>單片機</b><b class='flag-5'>啟動</b><b class='flag-5'>流程</b>

    單片機啟動過程

    啟動過程簡介單片機啟動過程是加后,先運行芯片內部固有程序(這個程序是用戶訪問不到也改寫不了的),即啟動代碼。
    發表于 11-19 12:06 ?55次下載
    <b class='flag-5'>單片機</b>的<b class='flag-5'>啟動</b>過程

    單片機中程序和數據存放位置、與電腦內存和硬盤的類比,單片機和計算機程序啟動流程對比

    單片機中程序和數據存放位置、與電腦內存和硬盤的類比,單片機和計算機程序啟動流程對比
    發表于 11-26 17:51 ?14次下載
    <b class='flag-5'>單片機</b>中程序和數據存放位置、與電腦內存和硬盤的類比,<b class='flag-5'>單片機</b>和計算機程序<b class='flag-5'>啟動</b><b class='flag-5'>流程</b>對比

    STM32的啟動過程如何分析

    本文分析STM32單片機從上運行的過程,目的在于了解STM32單片機啟動到運行的整個過程。
    的頭像 發表于 02-10 10:48 ?1444次閱讀
    STM32的<b class='flag-5'>啟動</b>過程如何分析
    主站蜘蛛池模板: 国产成人免费a在线视频app | 久久这里只有精品国产精品99 | 韩国伦理片2018在线播放免费观看 | 海角国精产品一区一区三区糖心 | 久久99精品国产免费观看 | 久久草福利自拍视频在线观看 | 桃花在线观看播放 | 免费看大黄高清网站视频在线 | 久9青青cao精品视频在线 | 精品国产品国语在线不卡丶 | 国产午夜精品一区理论片飘花 | 国产伦精品一区二区三区免费 | 精品午夜中文字幕熟女人妻在线 | 欧美影院在线观看完整版 mp4 | 极品少妇伦理一区二区 | 伦理片秋霞免费影院 | 又紧又大又爽精品一区二区 | 在线播放毛片 | 俄罗斯人xxx| 精品久久久久久久国产潘金莲 | 撕开美女的衣服2 | 色一欲一性一乱一区二区三区 | 日本邪恶全彩工囗囗番海贼王 | 伊人大香线蕉影院在线播放 | 播色屋97超碰在人人 | 精品国产乱码久久久久久下载 | 高清国产mv视频在线观看 | 出租屋自拍贵在真实15P | 免费精品国偷自产在线 | 国产精品无码亚洲精品 | 一本大道无码AV天堂欧美 | 亚洲精品一线二线三线无人区 | 99在线播放| 被同桌摸出水来了好爽的视频 | 国产毛A片啊久久久久久A | 无人区日本电影在线观看 | 最近更新2019中文字幕国语 | 无码免费视频AAAAAA片草莓 | 久久亚洲人成网站 | 纯肉小黄文高H | 69久久国产露脸精品国产 |