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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

3天內(nèi)不再提示

bootloader的原理及實現(xiàn)過程詳解

嵌入式應(yīng)用開發(fā) ? 來源:嵌入式應(yīng)用開發(fā) ? 作者:嵌入式應(yīng)用開發(fā) ? 2022-06-18 17:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、背景

嵌入式操作系統(tǒng)中,BootLoader是在操作系統(tǒng)內(nèi)核運行之前運行。可以初始化硬件設(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。在嵌入式系統(tǒng)中,通常并沒有像BIOS那樣的固件程序

二、實現(xiàn)思路

bootloader其實就是一段啟動程序,它在芯片啟動的時候首先被執(zhí)行,它可以用來做一些硬件的初始化,當初始化完成之后跳轉(zhuǎn)到對應(yīng)的應(yīng)用程序中去。

我們可以將內(nèi)存分為兩個區(qū),一個是啟動程序區(qū)(0x0800 0000 - 0x0800 2000 )大小為8K Bytes,剩下的為應(yīng)用程序區(qū)(0x0800 2000 - 0x0801 0000)。

芯片上電時先運行啟動程序,然后跳轉(zhuǎn)到應(yīng)用程序區(qū)執(zhí)行應(yīng)用程序。

三、程序跳轉(zhuǎn)

bootloader一個主要的功能就是首先程序的跳轉(zhuǎn)。在STM32中只要將要跳轉(zhuǎn)的地址直接寫入PC寄存器,就可以跳轉(zhuǎn)到對應(yīng)的地址中去。

怎么實現(xiàn)呢?

當我們實現(xiàn)一個函數(shù)的時候,這個函數(shù)最終會占用一段內(nèi)存,而它的函數(shù)名代表的就是這段內(nèi)存的起始地址。當我們調(diào)用這個函數(shù)的時候,單片機會將這段

內(nèi)存的首地址(函數(shù)名對應(yīng)的地址)加載到PC寄存器中,從而跳轉(zhuǎn)到這段代碼來執(zhí)行。那么我們也可以利用這個原理,定義一個函數(shù)指針,將這個指針指向我們

想要跳轉(zhuǎn)的地址,然后調(diào)用這個函數(shù),就可以實現(xiàn)程序的跳轉(zhuǎn)了。

代碼如下:

#define  APP_ADDR  0x08002000   //應(yīng)用程序首地址定義 
typedef void (*APP_FUNC)(); //函數(shù)指針類型定義

APP_FUNC jump2app; //定義一個函數(shù)指針

jump2app = ( APP_FUNC )(APP_ADDR + 4); //給函數(shù)指針賦值
jump2app(); //調(diào)用函數(shù)指針,實現(xiàn)程序跳轉(zhuǎn)

上面的代碼實現(xiàn)了我們要的跳轉(zhuǎn)功能,但是為什么要跳轉(zhuǎn)到(APP_ADDR + 4) 這個地址,而不是APP_ADDR.

首先我們要了解主控芯片的啟動過程。以STM32為例,在芯片上電的時候,首先會從內(nèi)存地址位0x0800 0000(由啟動模式?jīng)Q定)的地方加載棧頂?shù)刂罚?字節(jié)),從0x0800 0004的地方加載程序復(fù)位地址(4字節(jié)),然后跳轉(zhuǎn)到對應(yīng)的復(fù)位地址去執(zhí)行。

所以上面的程序會中,jump2app這個函數(shù)指針的地址為(APP_ADDR + 4),調(diào)用這個函數(shù)指針的時候,芯片內(nèi)核會自動跳轉(zhuǎn)到這個指針指向的內(nèi)存地址,也即是應(yīng)用程序的復(fù)位地址。

四、加載棧地址

實際運行會發(fā)現(xiàn),上面的程序可能會出現(xiàn)問題。因為我們還缺少了一個棧地址的加載過程,也就是芯片上電的第一個動作。這里要用到一點匯編的知識:

__asm void MSR_MSP(uint32_t addr)
{
    MSR MSP, r0
    BX r14;
}
__asm void MSR_MSP(uint32_t addr) 是MDK嵌入式匯編形式。

MSR MSP, r0 意思是將r0寄存器中的值加載到MSP(主棧寄存器,復(fù)位時默認使用)寄存器中,r0中保存的是參數(shù)值,即addr的值

BX r14 跳轉(zhuǎn)到連接寄存器保存的地址中,即退出函數(shù),跳轉(zhuǎn)到函數(shù)調(diào)用地址

完整的程序如下:

#define APP_ADDR 0x08002000 //應(yīng)用程序首地址定義 
typedef void (*APP_FUNC)(); //函數(shù)指針類型定義

/**
  * @brief
  * @param
  * @retval
  */
__asm void MSR_MSP(uint32_t addr)
{
    MSR MSP, r0
    BX r14;
}


/**
  * @brief
  * @param
  * @retval
  */
void run_app(uint32_t app_addr)
{
    uint32_t reset_addr = 0;
    APP_FUNC jump2app;
    
    /* 跳轉(zhuǎn)之前關(guān)閉相應(yīng)的中斷 */
    NVIC_DisableIRQ(SysTick_IRQn);
    NVIC_DisableIRQ(LPUART_IRQ);
    
    /* 棧頂?shù)刂肥欠窈戏?這里sram大小為8k) */
    if(((*(uint32_t *)app_addr)&0x2FFFE000) == 0x20000000)
    {
        /* 設(shè)置棧指針 */
        MSR_MSP(app_addr);
        /* 獲取復(fù)位地址 */
        reset_addr = *(uint32_t *)(app_addr+4);
        jump2app = ( APP_FUNC )reset_addr;
        jump2app();
    }
    else
    {
        printf("APP Not Found!n");
    }
}

五、編譯設(shè)置

我們需要在設(shè)置界面將默認(0x8000000)改為我們的應(yīng)用程序地址(0x8002000)

poYBAGKtoIGAOtpZAAGKkMPFU-E907.png

六、中斷向量表重映射

完成了上面的工作,實際測試發(fā)現(xiàn)程序還是無法正確運行。原因是我們沒有進行中斷向量表的重映射。向量表映射?什么時候有做過這個工作,我們來看一下:

.s文件里有如下代碼:

; Reset handler routine
Reset_Handler    PROC
                 EXPORT  Reset_Handler                 [WEAK]
        IMPORT  __main
        IMPORT  SystemInit  
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

這代碼表示,程序在執(zhí)行main函數(shù)之前,會先執(zhí)行SystemInit這個函數(shù)。下面看看這個函數(shù):

/**
  * @brief  Setup the microcontroller system.
  * @param  None
  * @retval None
  */
void SystemInit (void)
{
/*!< Set MSION bit */
  RCC->CR |= (uint32_t)0x00000100U;

  /*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], MCOSEL[2:0] and MCOPRE[2:0] bits */
  RCC->CFGR &= (uint32_t) 0x88FF400CU;

  /*!< Reset HSION, HSIDIVEN, HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFF6U;

  /*!< Reset HSI48ON  bit */
  RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;

  /*!< Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFFU;

  /*!< Reset PLLSRC, PLLMUL[3:0] and PLLDIV[1:0] bits */
  RCC->CFGR &= (uint32_t)0xFF02FFFFU;

  /*!< Disable all interrupts */
  RCC->CIER = 0x00000000U;

  /* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}

從上面的代碼可以看到,這個函數(shù)主要是做了時鐘的初始化和中斷初始化,還有就是中斷向量表的映射,就是最后那一段代碼

poYBAGKtoMKAO1bzAAD8OXA5lO8440.png

再看看FLASH_BASE 和 VECT_TAB_OFFSET的定義:

poYBAGKtoOCAIUjEAAEZB3-GFsQ012.png

這里默認映射地址就是FLASH的初始地址,所以只要將其改成我們程序的起始地址就行了: SCB->VTOR = 0x08002000

編譯,運行,下載.

七、總結(jié)

程序跳轉(zhuǎn)完成,對于bootloader來說也就完成了一大半。剩下的就是根據(jù)自己的需求去完善相應(yīng)功能了,比如我的在線升級功能,就要在bootloader里做固件接收和校驗的功能。這里有一點需要特別注意的是,跳轉(zhuǎn)程序之前最好把你用到的中斷都關(guān)了,不然跳轉(zhuǎn)之后的程序沒有對應(yīng)的中斷處理函數(shù),那就又可能使得程序進入死循環(huán)中。

審核編輯:符乾江

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5147

    文章

    19627

    瀏覽量

    316686
  • Boot
    +關(guān)注

    關(guān)注

    0

    文章

    153

    瀏覽量

    36686
收藏 2人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

  • jf_054316351
  • jf_609710291

評論

相關(guān)推薦
熱點推薦

【HarmonyOS 5】桌面快捷方式功能實現(xiàn)詳解

【HarmonyOS 5】桌面快捷方式功能實現(xiàn)詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財# 一、前言 在移動應(yīng)用開發(fā)中,如何讓用戶快速觸達核心
的頭像 發(fā)表于 06-21 16:42 ?223次閱讀
【HarmonyOS 5】桌面快捷方式功能<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>詳解</b>

Art-Pi2的BootLoader用rtthread有什么特殊的作用嗎?

我的基礎(chǔ)不太好,在創(chuàng)建artpi2的bootloader的例程的時候發(fā)現(xiàn)bootloader編譯完好像不小,然后發(fā)現(xiàn)bootloader里面也用上了rtthread的系統(tǒng),不太明白這里使用rtthread有沒有什么特殊的作用。
發(fā)表于 05-27 06:08

SMA接頭制造工藝詳解:精密加工技術(shù)與實現(xiàn)策略

SMA接頭制造工藝詳解:精密加工技術(shù)與實現(xiàn)策略
的頭像 發(fā)表于 04-26 09:22 ?191次閱讀
SMA接頭制造工藝<b class='flag-5'>詳解</b>:精密加工技術(shù)與<b class='flag-5'>實現(xiàn)</b>策略

倒裝芯片鍵合技術(shù)的特點和實現(xiàn)過程

本文介紹了倒裝芯片鍵合技術(shù)的特點和實現(xiàn)過程以及詳細工藝等。
的頭像 發(fā)表于 04-22 09:38 ?992次閱讀
倒裝芯片鍵合技術(shù)的特點和<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>過程</b>

求助,關(guān)于S32G3 Multi-Boot Bootloader創(chuàng)建的問題求解

使用Bootloader_S32G3XX_ASR_4.4_M7 示例,我根據(jù)以下內(nèi)容修改了引導源信息: A53: Reset Handler Address: 0x34302000 Load Image Address: 0x342F8000 Image
發(fā)表于 04-09 08:30

U-Boot 和 Bootloader,99% 的工程師都分不清?

嵌入式軟件工程師聽說過 u-boot 和 bootloader,但很多工程師依然不知道他們到底是啥。 ? 今天就來簡單講講?u-boot 和 bootloader?的內(nèi)容以及區(qū)別
的頭像 發(fā)表于 03-25 20:47 ?550次閱讀

自定義RISC V的bootloader-v3

在生成SoC時,會生成一個預(yù)定義bootloader .bin文件,用于指定soc的工程運行的地址,這包括在flash的存儲地址 ,加載到外存中的運行地址及在外存中分配的存儲空間的大小 。下面我們
的頭像 發(fā)表于 03-10 09:05 ?1035次閱讀
自定義RISC V的<b class='flag-5'>bootloader</b>-v3

自定義RISC V的bootloader-v2

在生成SoC時,會生成一個預(yù)定義bootloader .bin文件,用于指定soc的工程運行的地址,這包括在flash的存儲地址 ,加載到外存中的運行地址及在外存中分配的存儲空間的大小 。下面我們
的頭像 發(fā)表于 10-31 12:37 ?1122次閱讀
自定義RISC V的<b class='flag-5'>bootloader</b>-v2

SATA主機協(xié)議的物理層的實現(xiàn)過程

這里講解SATA主機協(xié)議的物理層的實現(xiàn)過程
的頭像 發(fā)表于 10-22 15:17 ?922次閱讀
SATA主機協(xié)議的物理層的<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>過程</b>

MES系統(tǒng)如何實現(xiàn)生產(chǎn)過程的全流程追溯

萬界星空科技的MES系統(tǒng)通過實時采集、傳輸、處理、監(jiān)控和追溯管理,實現(xiàn)了生產(chǎn)過程的實時跟蹤,為企業(yè)提供了決策支持。
的頭像 發(fā)表于 10-12 10:51 ?831次閱讀
MES系統(tǒng)如何<b class='flag-5'>實現(xiàn)</b>生產(chǎn)<b class='flag-5'>過程</b>的全流程追溯

bootloader和應(yīng)用程序之間共享FEE塊

電子發(fā)燒友網(wǎng)站提供《在bootloader和應(yīng)用程序之間共享FEE塊.pdf》資料免費下載
發(fā)表于 10-10 09:18 ?2次下載
在<b class='flag-5'>bootloader</b>和應(yīng)用程序之間共享FEE塊

如何開發(fā)不帶Flash API 的Bootloader實現(xiàn)在線升級

電子發(fā)燒友網(wǎng)站提供《如何開發(fā)不帶Flash API 的Bootloader實現(xiàn)在線升級.pdf》資料免費下載
發(fā)表于 09-12 09:41 ?0次下載
如何開發(fā)不帶Flash API 的<b class='flag-5'>Bootloader</b><b class='flag-5'>實現(xiàn)</b>在線升級

簡述拉曼散射效應(yīng)的實現(xiàn)過程

拉曼散射效應(yīng),作為一種重要的光學現(xiàn)象,其實現(xiàn)過程涉及光與物質(zhì)之間復(fù)雜的相互作用。以下將詳細闡述拉曼散射效應(yīng)的實現(xiàn)過程,包括基本原理、實驗觀察、理論解釋以及應(yīng)用等方面。
的頭像 發(fā)表于 08-16 17:08 ?1709次閱讀

PLC對模擬量信號的處理過程及方法 詳解

)。 PLC通過計算轉(zhuǎn)換,將這些模擬量信號轉(zhuǎn)換為內(nèi)部的數(shù)值信號。從而實現(xiàn)系統(tǒng)的監(jiān)控及控制。從現(xiàn)場的物理信號到PLC內(nèi)部處理的數(shù)值信號,有以下幾個步驟: 從以上PLC模擬量的信號輸入流程可以看到,在自動化過程控制系統(tǒng)中,模擬量信號的輸入是非
的頭像 發(fā)表于 07-30 16:31 ?953次閱讀
PLC對模擬量信號的處理<b class='flag-5'>過程</b>及方法 <b class='flag-5'>詳解</b>版

YTM32的HA系列微控制器啟動過程詳解

見,以確保信息安全的需要。然而,開發(fā)者在自行編譯固件時,需要配合BOOT ROM中的bootloader,才能正常地引導到用戶應(yīng)用程序,完成啟動過程
的頭像 發(fā)表于 07-15 09:24 ?735次閱讀
YTM32的HA系列微控制器啟動<b class='flag-5'>過程</b><b class='flag-5'>詳解</b>
主站蜘蛛池模板: 国产亚洲精品久久无码98 | 国产在线自天天人人 | 广东95后小情侣酒店自拍流出 | 闺蜜扒开我尿口使劲揉 | CHRISTMAS农村夫妻HO | 伊人影院香蕉久在线26 | 国产不卡视频在线 | 国产a视频视卡在线 | 国产欧美日韩视频怡春院 | 九九久久精品 | 久久国产精品久久国产精品 | 男人和女人一起愁愁愁很痛 | 国产精品久久久久久久人热 | 99久久国产免费福利 | YY8090福利午夜理论片 | 国产精品亚洲精品影院 | www国产av偷拍在线播放 | 黄色片中文| 兔费看少妇性L交大片免费 偷偷要色偷偷 | 日韩欧美视频一区二区 | 4388成人 | 拔萝卜视频免费看高清 | 中字幕视频在线永久在线 | 老师给美女同学开嫩苞 | 精品亚洲欧美中文字幕在线看 | 四虎影视国产精品亚洲精品hd | 中文字幕s级优女区 | 男女肉大捧进出全过程免费 | 十次啦中文网 | 亚洲 天堂 欧美 日韩 国产 | 国产成人免费高清激情视频 | 成人免费精品视频 | 美女扒开屁股让男人桶 | 熟妇的味道HD中文字幕 | 亚州笫一色惰网站 | 亚洲专区中文字幕视频专区 | 国内精品视频一区二区在线观看 | 国产欧美一本道无码 | 理论片午午伦夜理片2021 | 伊人久久大香线蕉avapp下载 | 久久中文字幕人妻熟AV女蜜柚M |

電子發(fā)燒友

中國電子工程師最喜歡的網(wǎng)站

  • 2931785位工程師會員交流學習
  • 獲取您個性化的科技前沿技術(shù)信息
  • 參加活動獲取豐厚的禮品