一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

聊聊程序分散加載啟動(dòng)的奧秘

技術(shù)讓夢(mèng)想更偉大 ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:張一西 ? 2022-12-09 11:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

筆者來(lái)聊聊分散加載的東西。

1、什么是分散加載

程序是靜態(tài)的概念,有數(shù)據(jù)有代碼,都是存在不同的區(qū)域,但是進(jìn)程是動(dòng)態(tài)的概念,主進(jìn)程在運(yùn)行的時(shí)候,會(huì)實(shí)際修改對(duì)應(yīng)的數(shù)據(jù),還有在上電加載的時(shí)候?qū)?shù)據(jù)段搬到對(duì)應(yīng)的位置,都是屬于運(yùn)行態(tài),由程序執(zhí)行來(lái)保證。

分散加載會(huì)把Code與Data放在指定的區(qū)域,保證程序在進(jìn)入main函數(shù)后正常運(yùn)行,如果有多個(gè)Code或者Data的時(shí)候,會(huì)分別加載到對(duì)應(yīng)的區(qū)域,不會(huì)直接按照起始地址連著一起加載。

09464d5c-76f1-11ed-8abf-dac502259ad0.png
比如上圖,在可執(zhí)行的視圖里面,分散加載會(huì)找到對(duì)于的Code、Data地址,然后加載,對(duì)于一些其他段,比如bss段會(huì)進(jìn)行初始化為0的操作。

如果全部按照Code和data這種順序加載,那在執(zhí)行視圖里面則會(huì)出現(xiàn)順序錯(cuò)誤,比如Code3加載到bss1,導(dǎo)致程序執(zhí)行異常。

2、分散加載的作用

2.1 ARMCC 編譯器分散加載代碼

本文以STM32的啟動(dòng)為介紹,在介紹分散加載啟動(dòng)之前,介紹一下STM32的啟動(dòng)方式,總共有三種啟動(dòng)方式。09a231d0-76f1-11ed-8abf-dac502259ad0.png
根據(jù)選定的啟動(dòng)模式,主閃存存儲(chǔ)器、系統(tǒng)存儲(chǔ)器或SRAM可以按照以下方式訪問(wèn):

從主閃存存儲(chǔ)器啟動(dòng):主閃存存儲(chǔ)器被映射到啟動(dòng)空間(0x0000 0000),但仍然能夠在它原有的地址(0x0800 0000)訪問(wèn)它,即閃存存儲(chǔ)器的內(nèi)容可以在兩個(gè)地址區(qū)域訪問(wèn), 0x00000000或0x0800 0000。

從系統(tǒng)存儲(chǔ)器啟動(dòng):系統(tǒng)存儲(chǔ)器被映射到啟動(dòng)空間(0x0000 0000),但仍然能夠在它原有的地址(互聯(lián)型產(chǎn)品原有地址為0x1FFF B000,其它產(chǎn)品原有地址為0x1FFF F000)訪問(wèn)它。

從內(nèi)置SRAM啟動(dòng):只能在0x2000 0000開始的地址區(qū)訪問(wèn)SRAM。當(dāng)從內(nèi)置SRAM啟動(dòng),在應(yīng)用程序的初始化代碼中,必須使用NVIC的異常表和偏移寄存器,從新映射向量表到SRAM。

本文中介紹的是:從主閃存啟動(dòng),也就是內(nèi)置的主閃存Flash啟動(dòng)。0a273b46-76f1-11ed-8abf-dac502259ad0.png
上圖為 一個(gè)簡(jiǎn)單的STM32 加載與執(zhí)行視圖的繪制,鏈接腳本指定Code 從0x0800 0000開始,RW ZI 從0x2000 0000開始放置。

LR_IROM10x080000000x00010000{;loadregionsize_region
ER_IROM10x080000000x00010000{;loadaddress=executionaddress
*.o(RESET,+First)
*(InRoot$$Sections)
.ANY(+RO)
}
RW_IRAM10x200000000x00020000{;RWdata
.ANY(+RW+ZI)
}
}
12345678910

左邊加載視圖靜態(tài)的Code和Data放置方式,比如download的時(shí)候 兩者把a(bǔ)xf 解析成bin文件,然后燒錄到nor flash中,可以看到其實(shí)靜態(tài)放置的位置 關(guān)系不是很大,主要是執(zhí)行的時(shí)候 位置正確就行 ,因?yàn)镃ode中有絕對(duì)地址,不然PC跑飛。

執(zhí)行視圖即程序正常運(yùn)行的時(shí)候 Code或者Data放置的位置。

燒錄的位置程序執(zhí)行的位置不同,分散加載 負(fù)責(zé)講其加載到對(duì)應(yīng)位置,保證main 函數(shù)執(zhí)行正常

圖中BSS段初始化為0 或者未初始化的全局變量,不占用ImageSIze(bin文件大?。?,所以加載視圖中并沒(méi)有其,執(zhí)行視圖必須有,上電的時(shí)候會(huì)將這部分初始化為0。

綜述函數(shù)的作用

來(lái)看看具體的分散加載代碼,是如何搬運(yùn)data 和初始化bss段的。(下文中中斷向量表偏移0x10000 偏移64K)

0a4c2280-76f1-11ed-8abf-dac502259ad0.png
armcc 手冊(cè)里面介紹:__main__rt_entry 是初始化運(yùn)行態(tài)的環(huán)境,以及后面運(yùn)行APP程序。

通俗點(diǎn)來(lái)講__main函數(shù)初始化運(yùn)行態(tài)的環(huán)境,主要的功能就是做分散加載將Code位置搬運(yùn)正確,才能正常運(yùn)行Code。其作用如下:

將section 拷貝到對(duì)應(yīng)的執(zhí)行域地址執(zhí)行,(把RO RW從加載域拷貝到執(zhí)行域,如果有壓縮的Section 會(huì)進(jìn)行解壓縮并進(jìn)行拷貝)

還有bss 段的初始化,將其初始化為0,

之后跳到__rt_entry。

以及堆棧的初始化,

lib庫(kù)的初始化

跳到對(duì)應(yīng)的用戶程序(main)。

main函數(shù)結(jié)束后,調(diào)用exit函數(shù)。

手冊(cè)內(nèi)容如下:
0a668012-76f1-11ed-8abf-dac502259ad0.png

__user_setup_stackheap

初始化堆棧地址,以及SP指針位置

__scatterload_copy

主要是RW data的拷貝

__scatterload_zeroinit

主要是ZI data的初始化

__rt_entry如下圖armcc 手冊(cè)所說(shuō):

建立堆棧

初始化C庫(kù)(方便固件使用C庫(kù))

調(diào)用main函數(shù)

關(guān)閉C庫(kù)

離開
0a858a66-76f1-11ed-8abf-dac502259ad0.png

啟動(dòng)代碼的簡(jiǎn)單介紹

0x08010188F000F802__main:bl0x8010190;__scatterload_rt2
1
0x0801018CF000F83Cbl0x8010208;__rt_entry
1

跳到初始化堆棧區(qū)域,執(zhí)行完成之后,跳到main函數(shù)。

10x08010190A00A__scatterload_rt2:adrr0,0x80101BC
20x08010192E8900C00ldmr0,{r10,r11}
30x080101964482addr10,r10,r0
40x080101984483addr11,r11,r0
50x0801019AF1AA0701sub.wr7,r10,#0x1
12345

第一句adr指令,其作用就是將地址讀到寄存器中,接著,以r0為基地址,讀取r0+3464地址的值,將其放到r10,r0+3464+4 的值 ,將其放到r11,然后,r10+=r0,r11+=r0,r7=r10-10a99361a-76f1-11ed-8abf-dac502259ad0.png
而 0x08013620 ~ 0x08013640 是一個(gè)region表,記錄著加載域或者執(zhí)行域的地址信息,從map文件中也可以看到一些信息,0aa9e60e-76f1-11ed-8abf-dac502259ad0.png
根據(jù)鏈接腳本信息,RW的起始地址0x2000 0000,前三個(gè)信息:RW 起始地址,數(shù)量size,拷貝的函數(shù)后三個(gè)信息:ZI 起始地址,數(shù)量size,初始化為0的函數(shù)0ac24906-76f1-11ed-8abf-dac502259ad0.png

備注學(xué)習(xí):ldm 指令,與stm指令是一對(duì),加載指定地址的數(shù)據(jù)LDM{cond} mode Rn{!}, reglist{^} 讀取Rn 地址中的數(shù)據(jù),放到寄存器,并且之后地址自增,再次讀取STM{cond} mode Rn{!}, reglist{^} 以Rn 地址為基地址,將寄存器的值放到基地址內(nèi)存,并且之后地址自增,再次寫入

10x0801019E45DA__scatterload_null:cmpr10,r11
20x080101A0D101bne0x80101A6
30x080101A2F000F831bl0x8010208;__rt_entry
40x080101A6F2AF0E09adrr14,0x80101A1
50x080101AAE8BA000Fldmr10!,{r0-r3}
60x080101AEF0130F01tstr3,#0x1
70x080101B2BF18itne
80x080101B41AFBsubner3,r7,r3
90x080101B6F0430301orrr3,r3,#0x1
100x080101BA4718bxr3
110x080101BC00003464dcd0x3464
120x080101C000003484dcd0x3484
123456789101112

第一行:比較r10 r11 r10 是region表的首地址,先讀三個(gè),后讀三個(gè)數(shù)據(jù),之后就等于r11,直接跳到__rt_entry第二行:如果不等,跳轉(zhuǎn)到第三行,第三行:如果相等,則跳到__rt_entry第四行:則將地址到r14 ,用于返回。第五行:讀取RW的地址信息,size 和拷貝函數(shù)地址,r0-r3 可以看到region的信息被讀出來(lái)了。
0ad7b75a-76f1-11ed-8abf-dac502259ad0.png
第六-第十行:將跳轉(zhuǎn)地址轉(zhuǎn)成奇數(shù)地址,用于bx指令跳轉(zhuǎn),080101C4 -> 080101C5,之后跳到拷貝函數(shù)。
0ae84264-76f1-11ed-8abf-dac502259ad0.png

10x080101C43A10__scatterload_copy:subsr2,r2,#0x10
20x080101C6BF24ittcs
30x080101C8C878ldmcsr0!,{r3-r6}
40x080101CAC178stmcsr1!,{r3-r6}
50x080101CCD8FAbhi0x80101C4;__scatterload_copy
60x080101CE0752lslsr2,r2,#0x1D
70x080101D0BF24ittcs
80x080101D2C830ldmcsr0!,{r4,r5}
90x080101D4C130stmcsr1!,{r4,r5}
100x080101D6BF44ittmi
110x080101D86804ldrmir4,[r0]
120x080101DA600Cstrmir4,[r1]
130x080101DC4770bxr14
140x080101DE0000movsr0,r0
1234567891011121314

r2 是RW data的size 信息,r0 是 RW的起始地址信息,0x08013640,從map信息也可以看到0af768f2-76f1-11ed-8abf-dac502259ad0.png
r0:0801340r1:20000000地址第一到第五行:是一個(gè)循環(huán)語(yǔ)句,每次拷貝16個(gè)字節(jié),到RAW區(qū)域,即0x2000 0000地址中。對(duì)于78個(gè)字?jǐn)?shù)據(jù) 拷貝70個(gè)后,最后八個(gè)數(shù)字沒(méi)辦法拷貝,不滿足CS第六行:左移29位,將個(gè)數(shù)清零。r2 = 0-8 = 0xFFFF FFF8第七行 第八行:拷貝最后八個(gè)數(shù)據(jù)到RAW數(shù)據(jù)第十 十一 十二行:不滿MI (復(fù)數(shù))則直接跳過(guò) 如果滿足的話,則拷貝最后一個(gè)數(shù)據(jù),最后跳轉(zhuǎn)到 cmp r10 r11 ,進(jìn)行bss 段的初始化。

備注:BHI則表示大于則跳轉(zhuǎn),看之前文章介紹,ARM學(xué)習(xí)(2) 寄存器的理解 ===》通用寄存器及狀態(tài)寄存器IT:if then 分支指令,后面如果滿足狀態(tài)標(biāo)志位,則執(zhí)行,否則直接跳過(guò),lsl:左移指令,MI:為負(fù)數(shù)則執(zhí)行

10x080101E02300__scatterload_zeroinit:movsr3,#0x0
20x080101E22400movsr4,#0x0
30x080101E42500movsr5,#0x0
40x080101E62600movsr6,#0x0
50x080101E83A10subsr2,r2,#0x10
60x080101EABF28itcs
70x080101ECC178stmcsr1!,{r3-r6}
80x080101EED8FBbhi0x80101E8
90x080101F00752lslsr2,r2,#0x1D
100x080101F2BF28itcs
110x080101F4C130stmcsr1!,{r4,r5}
120x080101F6BF48itmi
130x080101F8600Bstrmir3,[r1]
140x080101FA4770bxr14
1234567891011121314

獲取到bss段的數(shù)據(jù)后,可以看到r0-r3更新信息,數(shù)據(jù)size 為 0x0728個(gè)
0b0972ae-76f1-11ed-8abf-dac502259ad0.png
第一到第八行:同樣則是循環(huán)語(yǔ)句,每次初始化16個(gè)字的數(shù)據(jù)為0,第九行:同樣左移29位,將數(shù)據(jù)清零第十行 到 第 十一行:將最后八個(gè)字節(jié)數(shù)據(jù)寫入0第十二行 到第十三行:同上面一致(數(shù)據(jù)拷貝)

數(shù)據(jù)初始化完成后,同樣跳轉(zhuǎn)到 cmp r10 r11,則相等,跳到 __rt_entry

0x080101FCB51F__rt_lib_init:push{r0-r4,r14}
0x080101FEF003FA09__rt_lib_init_fp_1:bl0x8013614;_fp_init
0x08010202BD1F__rt_lib_init_alloca_1:pop{r0-r4,pc}
0x08010204B510__rt_lib_shutdown:push{r4,r14}
0x08010206BD10__rt_lib_shutdown_cpp_1:pop{r4,pc}

0x08010208F003F9BE__rt_entry:bl0x8013588;__user_setup_stackheap
0x0801020C4611movr1,r2
0x0801020EF7FFFFF5__rt_entry_li:bl0x80101FC;__rt_lib_init

0x08010212F000F811__rt_entry_main:bl0x8010238;main

0x08010216F003F9F0bl0x80135FA;exit
0x0801021AB403__rt_exit:push{r0,r1}
0x0801021CF7FFFFF2__rt_exit_ls:bl0x8010204;__rt_lib_shutdown
0x08010220BC03__rt_exit_exit:pop{r0,r1}

0x08010222F000FAF5bl0x8010810;_sys_exit
0x080102260000movsr0,r0
12345678910111213141516171819

__rt_enry:進(jìn)入到初始化堆棧的地方:初始化堆棧的位置,以及SP指針。

之后初始化 fp_init,需要用到p10 協(xié)處理器,之后再研究。__rt_entry_main:進(jìn)入main函數(shù)。則分散加載完成。

0801360C4800__user_libspace:ldrr0,0x8013610;r0,=__libspace_start
0801360E4770bxr14
0801361020000140dcd0x20000140;__libspace_start
123

libspace_start:lib庫(kù) 空間使用 棧空間,在初始化堆棧空間的時(shí)候。0b1bd9c6-76f1-11ed-8abf-dac502259ad0.png

1080135884675__user_setup_stackheap:movr5,r14
20801358AF000F83Fbl0x801360C;__user_libspace
30801358E46AEmovr14,r5
4080135900005movsr5,r0
5080135924669movr1,r13
6080135944653movr3,r10
708013596F0200007bicr0,r0,#0x7
80801359A4685movr13,r0
90801359CB018addsp,sp,#0x60
100801359EB520push{r5,r14}
11080135A0F7FDFA3Cbl0x8010A1C;__user_initial_stackheap
12080135A4E8BD4020pop{r5,r14}
13080135A8F04F0600mov.wr6,#0x0
14080135ACF04F0700mov.wr7,#0x0
15080135B0F04F0800mov.wr8,#0x0
16080135B4F04F0B00mov.wr11,#0x0
17080135B8F0210107bicr1,r1,#0x7
18080135BC46ACmovr12,r5
19080135BEE8AC09C0stmr12!,{r6-r8,r11}
20080135C2E8AC09C0stmr12!,{r6-r8,r11}
21080135C6E8AC09C0stmr12!,{r6-r8,r11}
22080135CAE8AC09C0stmr12!,{r6-r8,r11}
23080135CE468Dmovr13,r1
24080135D04770bxr14
123456789101112131415161718192021222324

第八行 到 第十二行:r13 = 20000140 加 0x60之后,正好指向 lib庫(kù)的地址的棧頂。2000 01A0.第十八行:r12 = 2000 0140,后面初始化 lib 庫(kù) 后 變成 r12 = 2000 0180第二十三行:r13 指向棧頂 2000 07A0

0b300f40-76f1-11ed-8abf-dac502259ad0.png
可以看到向量表的第一個(gè)地址也是 2000 07A0,符合預(yù)期。
0b431edc-76f1-11ed-8abf-dac502259ad0.png

__user_initial_stackheap
LDRR0,=Heap_Mem
08010A1C4804__user_initial_stackheap:ldrr0,0x8010A30
LDRR1,=(Stack_Mem+Stack_Size)
08010A1E4905ldrr1,0x8010A34
LDRR2,=(Heap_Mem+Heap_Size)
08010A204A05ldrr2,0x8010A38
LDRR3,=Stack_Mem
08010A224B06ldrr3,0x8010A3C
BXLR
08010A244770bxr14
08010A260000dcw0x0
08010A2808010371dcd0x8010371;SystemInit
08010A2C08010189dcd0x8010189;__main
08010A30200001A0dcd0x200001A0;Heap_Mem
08010A34200007A0dcd0x200007A0;__initial_sp
08010A38200003A0dcd0x200003A0;Stack_Mem
08010A3C200003A0dcd0x200003A0;Stack_Mem
123456789101112131415161718

0b700cf8-76f1-11ed-8abf-dac502259ad0.png
初始化堆棧的地址 開始位置,將其存儲(chǔ)到 r0- r3中。

可以看到R0、R1和R2 分別存放的是堆的基地址、棧的基地址(棧頂)和堆的極限地址(與arm cc手冊(cè)說(shuō)的一致。)
0b838896-76f1-11ed-8abf-dac502259ad0.png
來(lái)看看armcc 手冊(cè)上面是怎么介紹堆棧初始化函數(shù)的:

__user_initial_stackheap 函數(shù)將?;刂罚m敚┲捣旁趓1中,可以從上面寄存器看到,確實(shí)寄存器r1存放的是棧頂?shù)牡刂贰?/p>

__user_setup_stackheap 初始化sp的地址為棧頂?shù)刂罚ㄉ厦娴拇a中第二十三行)

__user_initial_stackheap 之所以可以使用C語(yǔ)言來(lái)編寫,是因?yàn)?__user_setup_stackheap 提供了一個(gè) 臨時(shí)的棧,(手冊(cè)可能比較老,和代碼有點(diǎn)出入。)0bd42b52-76f1-11ed-8abf-dac502259ad0.png

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)注

    117

    文章

    3826

    瀏覽量

    82965
  • Code
    +關(guān)注

    關(guān)注

    0

    文章

    70

    瀏覽量

    15821
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1662

    瀏覽量

    50207
  • 分散加載
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    1521

原文標(biāo)題:聊聊程序分散加載啟動(dòng)的奧秘

文章出處:【微信號(hào):技術(shù)讓夢(mèng)想更偉大,微信公眾號(hào):技術(shù)讓夢(mèng)想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    使用分散加載將部分程序放到RAM,RAM掉電后數(shù)據(jù)就沒(méi)有了,如何復(fù)原?

    我使用分散加載將部分程序放到RAM,RAM掉電后數(shù)據(jù)就沒(méi)有了,重新上電后,芯片是如何將RAM區(qū)程序復(fù)原的呢。
    發(fā)表于 03-06 07:01

    ARM分散加載及應(yīng)用

    從ARM ELF目標(biāo)文件主要構(gòu)成出發(fā),詳細(xì)介紹了分散加載的基本原理、分散加載文件的語(yǔ)法、分散加載
    發(fā)表于 05-04 16:09

    分享下載算法設(shè)計(jì)背后的奧秘

    RT-UFL 項(xiàng)目開發(fā)過(guò)程所有疑難點(diǎn)及其解決方法,和大家分享下載算法設(shè)計(jì)背后的奧秘?! ”酒情_發(fā)筆記第一篇,咱們重點(diǎn)聊聊這個(gè)項(xiàng)目...
    發(fā)表于 12-21 07:19

    什么是分散加載文件?

    分散加載的作用是什么?什么是分散加載文件?
    發(fā)表于 02-16 06:48

    FAQ0086 Eclipse中實(shí)現(xiàn)分散加載的方法

    Eclipse中實(shí)現(xiàn)分散加載的方法如何在Eclipse 中實(shí)現(xiàn)分散加載?
    發(fā)表于 10-20 06:05

    LPC2200_flash內(nèi)部Flash和外部Flash分散加載

    LPC2200_flash內(nèi)部Flash和外部Flash分散加載示例。
    發(fā)表于 05-20 16:08 ?17次下載

    周立功單片機(jī):分散加載文件淺釋

    Scatter-Loading Description File 分散加載文件
    發(fā)表于 03-13 14:19 ?98次下載

    基于NXP LPC2000的次級(jí)啟動(dòng)加載程序解析

    LPC1300/1700等系列。 在大多數(shù)的LPC2000器件內(nèi)部,存在著一個(gè)被稱為主啟動(dòng)加載程序(Primary Boot Loader)的固件,它在每次上電或復(fù)位時(shí)被首先運(yùn)行。本文所講的次級(jí)
    發(fā)表于 10-30 11:13 ?1次下載
    基于NXP LPC2000的次級(jí)<b class='flag-5'>啟動(dòng)</b><b class='flag-5'>加載</b><b class='flag-5'>程序</b>解析

    GD32單片機(jī)程序分散加載的方法

    本文檔內(nèi)容介紹了GD32單片機(jī)程序分散加載的方法,圖像詳解,供參考。
    發(fā)表于 11-22 11:02 ?39次下載
    GD32單片機(jī)<b class='flag-5'>程序</b><b class='flag-5'>分散</b><b class='flag-5'>加載</b>的方法

    單片機(jī)中分散加載文件介紹

    單片機(jī)中分散加載文件介紹
    發(fā)表于 12-03 10:51 ?2次下載
    單片機(jī)中<b class='flag-5'>分散</b><b class='flag-5'>加載</b>文件介紹

    ARM分散加載文件

    分散加載作用:可以將代碼放入不同的存儲(chǔ)空間。1.基本概念了解分散加載文件之前,首先需要了解Code、RO-Data、RW-Data、ZI-Data。Code:
    發(fā)表于 12-20 19:10 ?7次下載
    ARM<b class='flag-5'>分散</b><b class='flag-5'>加載</b>文件

    什么是分散加載文件?何時(shí)進(jìn)行分散加載

    分散加載文件(scatter file)是一個(gè)文本文件,它的作用是可以用于描述 ARM 鏈接器生成映像文件所需要的信息。
    的頭像 發(fā)表于 09-14 10:38 ?3032次閱讀

    什么是分散加載文件?

    分散加載文件(scatter file)是一個(gè)文本文件,它的作用是可以用于描述 ARM 鏈接器生成映像文件所需要的信息。 如果不使用 scatter file 文件來(lái)指定,那么 ARM 鏈接器會(huì)
    的頭像 發(fā)表于 01-30 14:12 ?3504次閱讀
    什么是<b class='flag-5'>分散</b><b class='flag-5'>加載</b>文件?

    AN032GD32F4xx_IAR分散加載說(shuō)明

    AN032 GD32F4xx_IAR分散加載說(shuō)明
    發(fā)表于 02-27 18:26 ?0次下載
    AN032GD32F4xx_IAR<b class='flag-5'>分散</b><b class='flag-5'>加載</b>說(shuō)明

    車規(guī)MCU的啟動(dòng)加載程序是什么

    啟動(dòng)加載程序(bootloader) 車規(guī)MCU的啟動(dòng)加載程序(bootloader)是一種用于
    的頭像 發(fā)表于 10-27 17:26 ?1955次閱讀