哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

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

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

如何編寫(xiě)ARM處理器的Bootloader

工程師 ? 來(lái)源:strongerHuang ? 作者:strongerHuang ? 2020-10-27 11:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者 | strongerHuang

微信公眾號(hào) | strongerHuang

之前從應(yīng)用的角度給大家分享過(guò)Bootloader相關(guān)的文章,今天從底層原理來(lái)給大家描述ARM處理器如何編寫(xiě)B(tài)ootloader。

1關(guān)于Bootloader

Bootloader顧名思義就是引導(dǎo)加載程序,是在操作系統(tǒng)或應(yīng)用程序運(yùn)行之前的一段程序,是在系統(tǒng)上電后執(zhí)行的一段程序代碼。

BootLoader是嚴(yán)重地依賴于硬件而實(shí)現(xiàn)的,特別是在嵌入式平臺(tái)。因此,在嵌入式平臺(tái)里建立一個(gè)通用的BootLoader幾乎是不可能的。盡管如此,我們?nèi)匀豢梢詫?duì)bootloader歸納出一些通用的概念來(lái),以指導(dǎo)用戶特定的BootLoader設(shè)計(jì)與實(shí)現(xiàn)。

---來(lái)源百度百科

Bootloader在手機(jī)、電腦、眾多嵌入式系統(tǒng)中都存在,它的作用有很多,比如:初始化底層應(yīng)用驅(qū)動(dòng)、加載應(yīng)用程序、更新應(yīng)用程序等。

不同的設(shè)備,Bootloader可能差異很大,通常來(lái)說(shuō)Bootloader比較依賴底層硬件和實(shí)際項(xiàng)目需求。

2如何編寫(xiě)bootloader

bootloader是一段引導(dǎo)加載程序代碼,它更新用戶的應(yīng)用程序代碼,可以使用很多硬件下載通道(例如USB、網(wǎng)絡(luò)端口)獲得新代碼。

在執(zhí)行引導(dǎo)ROM之后,將執(zhí)行bootloader程序,并在需要時(shí)進(jìn)行更新,然后執(zhí)行最終用戶應(yīng)用程序。

引導(dǎo)加載程序和用戶應(yīng)用程序應(yīng)作為兩個(gè)獨(dú)立的Project或Object進(jìn)行編寫(xiě)和編譯,從而產(chǎn)生兩個(gè)獨(dú)立且可執(zhí)行的(bin/hex)文件。

引導(dǎo)加載程序的主要任務(wù)是在必要時(shí)對(duì)用戶應(yīng)用程序進(jìn)行重新編程/替換,并跳轉(zhuǎn)至用戶應(yīng)用程序以執(zhí)行該程序,應(yīng)用程序不一定需要知道引導(dǎo)加載程序的存在。

引導(dǎo)加載程序通常位于芯片閃存基址,下面通過(guò)一張圖來(lái)描述內(nèi)存和Flash代碼映射關(guān)系:

有很多方法可以引導(dǎo)bootloader進(jìn)入編程模式,以將用戶應(yīng)用程序重新編程到Flash中,或者直接跳轉(zhuǎn)到現(xiàn)有的用戶應(yīng)用程序來(lái)執(zhí)行。最簡(jiǎn)單的方法是檢查GPIO引腳以確定是否應(yīng)進(jìn)入編程模式。

大多數(shù)芯片供應(yīng)商為用戶提供了一種方便的方式,例如 ISP 和 IAP 接口,bootloader將使用它們來(lái)更新閃存內(nèi)容。

當(dāng)Flash內(nèi)容已更新或已經(jīng)是最新時(shí),引導(dǎo)加載程序?qū)⑻D(zhuǎn)到用戶應(yīng)用程序。在執(zhí)行用戶應(yīng)用程序之前,這需要許多步驟:

1.確保CPU處于特權(quán)模式。

2.禁用NVIC中所有啟用的中斷。

3.禁用所有可能產(chǎn)生中斷請(qǐng)求的使能外設(shè),并清除這些外設(shè)中的所有未使用中斷標(biāo)志。

4.清除NVIC中所有未使用的中斷請(qǐng)求。

5.禁用SysTick并清除其異常掛起位。

6.如果引導(dǎo)加載程序使用了單個(gè)故障處理程序,請(qǐng)禁用它們。

7.如果發(fā)現(xiàn)內(nèi)核當(dāng)前與PSP一起運(yùn)行,則激活MSP(由于編譯器可能仍在使用堆棧,因此在此之前需要將PSP復(fù)制到MSP)。

8.將用戶應(yīng)用程序的向量表地址加載到SCB-》 VTOR寄存器中。確保地址符合對(duì)齊要求。

9.最后一部分是將MSP設(shè)置為用戶應(yīng)用程序向量表中找到的值,然后將用戶應(yīng)用程序的重置向量值加載到PC中,也就是跳轉(zhuǎn)功能。

比如通過(guò)調(diào)用下面的示例BootJump()這樣的函數(shù)來(lái)完成此操作:

static void BootJump(uint32_t *Address){ //1.確保CPU處于特權(quán)模式。 if( CONTROL_nPRIV_Msk & __get_CONTROL()) { /* not in privileged mode */ EnablePrivilegedMode() ; } //2.禁用NVIC中所有啟用的中斷。 Disable_All_Peripherals(); //3.禁用所有可能產(chǎn)生中斷請(qǐng)求的使能外設(shè),并清除這些外設(shè)中的所有未使用中斷標(biāo)志。 NVIC-》ICER[ 0 ] = 0xFFFFFFFF; NVIC-》ICER[ 1 ] = 0xFFFFFFFF; NVIC-》ICER[ 2 ] = 0xFFFFFFFF; NVIC-》ICER[ 3 ] = 0xFFFFFFFF; NVIC-》ICER[ 4 ] = 0xFFFFFFFF; NVIC-》ICER[ 5 ] = 0xFFFFFFFF; NVIC-》ICER[ 6 ] = 0xFFFFFFFF; NVIC-》ICER[ 7 ] = 0xFFFFFFFF; //4.清除NVIC中所有未使用的中斷請(qǐng)求。 NVIC-》ICPR[ 0 ] = 0xFFFFFFFF; NVIC-》ICPR[ 1 ] = 0xFFFFFFFF; NVIC-》ICPR[ 2 ] = 0xFFFFFFFF; NVIC-》ICPR[ 3 ] = 0xFFFFFFFF; NVIC-》ICPR[ 4 ] = 0xFFFFFFFF; NVIC-》ICPR[ 5 ] = 0xFFFFFFFF; NVIC-》ICPR[ 6 ] = 0xFFFFFFFF; NVIC-》ICPR[ 7 ] = 0xFFFFFFFF; //5.禁用SysTick并清除其異常掛起位。 SysTick-》CTRL = 0; SCB-》ICSR |= SCB_ICSR_PENDSTCLR_Msk; //

6.如果引導(dǎo)加載程序使用了單個(gè)故障處理程序,請(qǐng)禁用它們。 SCB-》SHCSR &= ~( SCB_SHCSR_USGFAULTENA_Msk | \ SCB_SHCSR_BUSFAULTENA_Msk | \ SCB_SHCSR_MEMFAULTENA_Msk ) ; //7.如果發(fā)現(xiàn)內(nèi)核當(dāng)前與PSP一起運(yùn)行,則激活MSP if( CONTROL_SPSEL_Msk & __get_CONTROL()) { /* MSP is not active */ __set_MSP( __get_PSP()) ; __set_CONTROL( __get_CONTROL() & ~CONTROL_SPSEL_Msk); } //8.將用戶應(yīng)用程序的向量表地址加載到SCB-》 VTOR寄存器中。 SCB-》VTOR = ( uint32_t )Address ; //9.跳轉(zhuǎn) BootJumpASM( Address[ 0 ], Address[ 1 ]);}

再次說(shuō)明bootloader與底層硬件和實(shí)際需求有關(guān),以上代碼僅供參考,主要是提供思路,方便大家理解。

責(zé)任編輯:haq

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

    關(guān)注

    463

    文章

    54369

    瀏覽量

    468815
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    135

    文章

    9582

    瀏覽量

    393409
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3847

    瀏覽量

    85436
  • keil
    +關(guān)注

    關(guān)注

    69

    文章

    1231

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    探索TDA54x Jacinto?處理器:高性能與安全的完美融合

    我們帶來(lái)了哪些新的技術(shù)亮點(diǎn)和應(yīng)用可能。 文件下載: tda54-q1.pdf 強(qiáng)大的功能特性 多核心處理架構(gòu) TDA54x處理器擁有豐富的處理核心。它配備了多達(dá)八個(gè)Arm? Corte
    的頭像 發(fā)表于 03-06 16:50 ?1135次閱讀

    Cortex-M0 處理器介紹

    Cortex-M0 處理器簡(jiǎn)介ARM公司的Cortex-M0應(yīng)用于各種微控制(MCU)中,并可讓研發(fā)工程師以8位的價(jià)位創(chuàng)造32位的的效能,并將傳統(tǒng)的8位和16位的處理器升級(jí)到更高效、
    發(fā)表于 01-16 08:04

    Genio 720處理器規(guī)格參數(shù)_MTK8391高算力核心板方案

    Genio 720(MT8391)處理器規(guī)格參數(shù),采用先進(jìn)的6nm制程工藝,兼顧高性能與低功耗,適配無(wú)風(fēng)扇設(shè)計(jì)及電池供電移動(dòng)設(shè)備需求。CPU架構(gòu):八核處理器,包含2顆Arm Cortex-A78核心
    的頭像 發(fā)表于 01-12 19:57 ?443次閱讀
    Genio 720<b class='flag-5'>處理器</b>規(guī)格參數(shù)_MTK8391高算力核心板方案

    NICE協(xié)處理器demo分析及測(cè)試

    實(shí)現(xiàn)思路: 1.硬件設(shè)計(jì),編寫(xiě)相應(yīng)的verilog文件,需要注意的是NICE協(xié)處理器定義了一些基本的接口; 2.編寫(xiě)驅(qū)動(dòng),通過(guò)內(nèi)聯(lián)匯編的偽指令.insn配置相關(guān)的驅(qū)動(dòng)設(shè)置; 3.編寫(xiě)
    發(fā)表于 10-23 07:05

    基于E203 NICE協(xié)處理器擴(kuò)展指令

    (memory response channel) Nice 反饋通道(response channel) 調(diào)用協(xié)處理器的方法:擴(kuò)展一個(gè)用RTL級(jí)代碼編寫(xiě)的協(xié)處理器,想個(gè)辦法調(diào)用這個(gè)獨(dú)立
    發(fā)表于 10-21 14:35

    基于E203 NICE協(xié)處理器擴(kuò)展指令2.0

    存儲(chǔ)讀寫(xiě)結(jié)果。 調(diào)用協(xié)處理器的方法:擴(kuò)展一個(gè)用RTL級(jí)代碼編寫(xiě)的協(xié)處理器,想個(gè)辦法調(diào)用這個(gè)獨(dú)立于流水線的計(jì)算單元,即在MCU層面,在編譯
    發(fā)表于 10-21 10:39

    Cortex-M0+處理器的HardFault錯(cuò)誤介紹

    ARM處理器中,如果一個(gè)程序產(chǎn)生了錯(cuò)誤并且被處理器檢測(cè)到,就會(huì)產(chǎn)生錯(cuò)誤異常。Cortex-M0+處理器只有一種異常用以處理錯(cuò)誤:HardF
    的頭像 發(fā)表于 10-14 10:50 ?3616次閱讀
    Cortex-M0+<b class='flag-5'>處理器</b>的HardFault錯(cuò)誤介紹

    德州儀器AM62Ax Sitara?處理器技術(shù)解析

    Texas Instruments AM62A/AM62A-Q1基于ARM ^?^ 的處理器是車規(guī)級(jí)異構(gòu)ARM處理器系列的一部分。這些處理器
    的頭像 發(fā)表于 08-13 10:25 ?1873次閱讀
    德州儀器AM62Ax Sitara?<b class='flag-5'>處理器</b>技術(shù)解析

    【老法師】多核異構(gòu)處理器中M核程序的啟動(dòng)、編寫(xiě)和仿真

    有很多研究單片機(jī)的小伙伴在面對(duì)多核異構(gòu)處理器時(shí),可能會(huì)對(duì)多核的啟動(dòng)流程感到困惑——因?yàn)椴皇煜CC編程和GDB調(diào)試,所以也無(wú)法確定多核異構(gòu)處理器的程序是否能像單片機(jī)那樣方便地編寫(xiě)和仿真。本篇
    的頭像 發(fā)表于 08-13 09:05 ?4169次閱讀
    【老法師】多核異構(gòu)<b class='flag-5'>處理器</b>中M核程序的啟動(dòng)、<b class='flag-5'>編寫(xiě)</b>和仿真

    Texas Instruments 適用于AM64x Sitalog ?處理器的SK-AM64B入門(mén)套件數(shù)據(jù)手冊(cè)

    Texas Instruments適用于AM64x Sitara?處理器的SK-AM64B入門(mén)套件是一個(gè)獨(dú)立的測(cè)試和開(kāi)發(fā)平臺(tái),是加速設(shè)計(jì)原型階段的理想選擇。AM64x處理器由一個(gè)雙核64位ARM
    的頭像 發(fā)表于 07-28 10:20 ?928次閱讀
    Texas Instruments 適用于AM64x Sitalog ?<b class='flag-5'>處理器</b>的SK-AM64B入門(mén)套件數(shù)據(jù)手冊(cè)

    石油測(cè)井儀器電子艙的“大腦”——高溫ARM處理器芯片

    175℃高溫ARM處理器芯片是高溫電子學(xué)的尖端成果,是解鎖深部、高溫油氣資源勘探開(kāi)發(fā)的關(guān)鍵技術(shù)之一
    的頭像 發(fā)表于 07-22 13:09 ?1130次閱讀
    石油測(cè)井儀器電子艙的“大腦”——高溫<b class='flag-5'>ARM</b><b class='flag-5'>處理器</b>芯片

    瑞薩MCU方案:瑞薩RZ/G2L Bootloader單獨(dú)編譯方法詳解

    ? RZ/G2L微處理器配備Cortex -A55(1.2 GHz)CPU、16位DDR3L/DDR4接口、帶Arm Mali-G31的3D圖形加速引擎以及視頻編解碼(H.264)。此外,這款
    的頭像 發(fā)表于 07-08 14:47 ?2943次閱讀
    瑞薩MCU方案:瑞薩RZ/G2L <b class='flag-5'>Bootloader</b>單獨(dú)編譯方法詳解

    集成了Arm? Cortex?-M0內(nèi)核微處理器的電容處理器芯片

    ?電容處理器芯片的工作原理?主要基于電容傳感的原理,通過(guò)檢測(cè)電容的變化來(lái)感知物理量的變化。電容傳感利用兩個(gè)導(dǎo)體之間的電容變化來(lái)檢測(cè)各種物理量,如距離、位置、液位和壓力等?。
    的頭像 發(fā)表于 06-06 10:09 ?820次閱讀
    集成了<b class='flag-5'>Arm</b>? Cortex?-M0內(nèi)核微<b class='flag-5'>處理器</b>的電容<b class='flag-5'>處理器</b>芯片

    龍芯處理器支持WINDOWS嗎?

    龍芯處理器目前不支持原生運(yùn)行Windows操作系統(tǒng),主要原因如下: 架構(gòu)差異 龍芯架構(gòu):龍芯早期基于MIPS架構(gòu),后續(xù)轉(zhuǎn)向自主研發(fā)的LoongArch指令集(與x86/ARM不兼容
    發(fā)表于 06-05 14:24

    十萬(wàn)塊一顆的芯片值不值?ADM處理器CPU。#半導(dǎo)體#電子

    處理器
    芯廣場(chǎng)
    發(fā)布于 :2025年05月26日 18:09:31
    丽江市| 陵川县| 化州市| 略阳县| 双柏县| 江安县| 阳信县| 定州市| 留坝县| 竹溪县| 肇源县| 甘德县| 武汉市| 河间市| 黄冈市| 万全县| 浦北县| 平陆县| 荥经县| 高碑店市| 吉木乃县| 社旗县| 乌鲁木齐县| 溆浦县| 灵武市| 静安区| 剑川县| 翁牛特旗| 改则县| 饶河县| 琼海市| 凌海市| 盈江县| 嘉荫县| 佛山市| 秦安县| 界首市| 眉山市| 教育| 公安县| 泾阳县|