娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

1、STM32 啟動文件與 .sct 文件分析


1) 定義STACK段,{NOINIT,讀寫}:分配一段內(nèi)存大小為0.5K;


2) 定義HEAP段, {NOINIT,讀寫}:分配一段內(nèi)存大小為1K;


3) 定義RESET段,{DATA,只讀}:DCD各種中斷向量;


4) 定義|.text|段,{CODE,只讀}:Reset_Handler函數(shù),函數(shù)中最后加載了__main;


對剩余的中斷函數(shù)進(jìn)行了弱定義;


在最后還有一段用戶初始化堆棧的代碼__user_initial_stackheap。


那這些代碼都存放在什么位置呢?


5) 分析 .sct 文件:


分散加載文件(即scatter file,后綴為.scf)。


分散加載文件是一個(gè)文本文件,通過編寫一個(gè)分散加載文件來指定ARM連接器在生成映像文件時(shí)如何分配RO,RW,ZI等數(shù)據(jù)的存放地址。


如果不用SCATTER文件指定,那么ARM連接器會按照默認(rèn)的方式來生成映像文件,一般情況下我們是不需要使用分散加載文件的。


但在某些場合,我們希望把某些數(shù)據(jù)放在指定的地址處,那么這時(shí)候SCATTER文件就發(fā)揮了非常大的作用。


而且SCATTER文件用起來非常簡單好用。


舉個(gè)例子:


比如像LPC2378芯片具有多個(gè)不連續(xù)的SRAM,通用的RAM是32KB,可是32KB不夠用,我想把某個(gè).C中的RW數(shù)據(jù)放在USB的SRAM中,那么就可以通過SCATTER文件來完成這個(gè)功能。


LR_IROM1 0x08000000 0x00080000  {    ; load region size_region

  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address

   *.o (RESET, +First)

   *(InRoot$$Sections)

   .ANY (+RO)

  }

  RW_IRAM1 0x20000000 0x00010000  {  ; RW data

   .ANY (+RW +ZI)

  }

}

STACK段和HEAP段是RW屬性,存在RAM(0x20000000-0x20010000)中,具體的地址由編譯器在后面鏈接時(shí)決定,并不是一定存在RAM的開頭地址。


RESET段存在FLASH(0x08000000-0x08080000)中,而且是FLASH的最開頭,再結(jié)合CORTEX-M3的特性,其上電后根據(jù)啟動引腳來決定PC位置,比如啟動設(shè)置為FLASH啟動,則啟動后PC跳到0x08000000。


此時(shí)CPU會先取2個(gè)地址(硬件決定),第一個(gè)是棧頂?shù)刂?,第二個(gè)是復(fù)位異常地址,這樣就跳到Reset_Handler,Reset_Handler執(zhí)行到將最后跳轉(zhuǎn)到?庫的__main。


|.text |段是CODE屬性,也存在FLASH區(qū)。


啟動代碼所做的工作如下:


先是建立了堆棧,之后上電后尋找到中斷向量表中的復(fù)位函數(shù)Reset_Handler執(zhí)行,之后跳轉(zhuǎn)到__main執(zhí)行?庫函數(shù),最后由__main調(diào)用main()函數(shù),進(jìn)入C的世界。


2、__user_initial_stackheap


這段代碼位于裸機(jī)啟動文件的末尾:


       IF      :DEF:__MICROLIB                

                 EXPORT  __initial_sp

                 EXPORT  __heap_base

                 EXPORT  __heap_limit

                

                 ELSE               

                 IMPORT  __use_two_region_memory

                 EXPORT  __user_initial_stackheap                 

__user_initial_stackheap

                 LDR     R0, =  Heap_Mem

                 LDR     R1, =(Stack_Mem + Stack_Size)

                 LDR     R2, = (Heap_Mem +  Heap_Size)

                 LDR     R3, = Stack_Mem

                 BX      LR

若是使用了microlib,則只需要將__initial_sp,__ heap_base的,__ heap_limit三個(gè)變量定義成全局變量即可(這三個(gè)變量也是固定的可被?庫引用,在庫中需要使用到這三個(gè)變量對堆棧進(jìn)行初始化);


否則,就需要自己定義__user_initial_stackheap。


microlib缺省的情況下使用的是Keil C庫。


但是事實(shí)上,μVision庫里包含了更多__user_initial_stackheap()的函數(shù)體,這樣編譯器可以根據(jù)開發(fā)人員scatter文件的內(nèi)容自動選擇合適的函數(shù)體。


換句話說,針對RVCT v3.x及之后的版本,使用scatter文件的開發(fā)人員可以不再重新實(shí)現(xiàn)__user_initial_stackheap()的函數(shù)體。


也就是說不必再自己寫了__user_initial_stackheap,自己在做實(shí)驗(yàn)驗(yàn)證時(shí),沒有使用microlib庫,同時(shí)也將這部分函數(shù)注釋掉,并沒有產(chǎn)生任何異常。


所以對__user_initial_stackheap在這里就不再做更多深入的研究了,這一部分太燒腦了,就當(dāng)作C庫已經(jīng)為我們準(zhǔn)備好了這個(gè)函數(shù)。


3、堆棧的單區(qū)模型和雙區(qū)模型


堆棧分為單區(qū)模型和雙區(qū)模型:


單區(qū)模型堆和棧在同一存儲器區(qū)中互相朝向?qū)Ψ皆鲩L

雙區(qū)模型將堆和棧分別放置在存儲器不同的區(qū)中,__ user_initial_stackheap()建立的專用堆限制來檢查堆,需要設(shè)置堆棧的長度。

1)選擇使用單區(qū)模型,在SCT文件中定義一個(gè)特殊的執(zhí)行域,使用符號:


ARM_LIB_STACKHEAP,并使用EMPTY屬性這樣庫管理器就選擇了一個(gè)把這個(gè)域當(dāng)作堆和棧合并在一起的__user_initial_stackheap()函數(shù)。


在這個(gè)函數(shù)中使用了“Image$ $ ARM_LIB_STACKHEAP$ $Base”和“Image$ $ARM_LIB_STACKHEAP$ $ZI$ $Limit”符號。


2)選擇使用雙區(qū)模型,在sct文件中定義兩個(gè)特殊的執(zhí)行域,使用符號:


ARM_LIB_STACK和ARM_LIB_HEAP,都要使用EMPTY屬性。這樣庫管理器就會選擇使用符號:“Image$ $ARM_LIB_HEAP$ $Base” ,“Image$ $ARM_LIB_STACK$ $ZI$ $ limit”,“Image$ $ARM_LIB_STACK$ $Base”,“Image$ $ARM_LIB_STACK$ $ZI$ $Limit”的__user_initial_stackheap()函數(shù)。


從裸機(jī)的啟動文件可以看出,裸機(jī)使用的是雙區(qū)模型。


4、Huawei_LiteOS 啟動文件與 sct 文件


啟動文件:


LOS_Heap_Min_Size   EQU     0x400

 

                AREA    LOS_HEAP, NOINIT, READWRITE, ALIGN=3

__los_heap_base

LOS_Heap_Mem    SPACE   LOS_Heap_Min_Size

 

                AREA    LOS_HEAP_INFO, DATA, READONLY, ALIGN=2

                IMPORT  |Image$$ARM_LIB_STACKHEAP$$ZI$$Base|

                EXPORT  __LOS_HEAP_ADDR_START__

                EXPORT  __LOS_HEAP_ADDR_END__

__LOS_HEAP_ADDR_START__

                DCD     __los_heap_base

__LOS_HEAP_ADDR_END__

                DCD     |Image$$ARM_LIB_STACKHEAP$$ZI$$Base| - 1

 

                PRESERVE8

                AREA    RESET, CODE, READONLY

                THUMB

                IMPORT  ||Image$$ARM_LIB_STACKHEAP$$ZI$$Limit||

                IMPORT  osPendSV

                EXPORT  _BootVectors

                EXPORT  Reset_Handler

_BootVectors

                DCD     ||Image$$ARM_LIB_STACKHEAP$$ZI$$Limit||

                DCD     Reset_Handler

Reset_Handler

                IMPORT  SystemInit

                IMPORT  __main

                LDR     R0, =SystemInit

                BLX     R0

                LDR     R0, =__main

                BX      R0

 

                ALIGN

                END

定義LOS_HEAP段,{NOINIT,讀寫}:分配一段內(nèi)存大小為1K;


定義LOS_HEAP_INFO段,{DATA,只讀}:定義__LOS_HEAP_ADDR_START__和__LOS_HEAP_ADDR_END__這兩個(gè)全局變量供OS使用;


定義RESET段,{CODE,只讀}:啟動向量,第一個(gè)是棧頂?shù)刂?,第二個(gè)是Reset_Handler;將Reset_Handler主體也寫入了RESET段;


首先,可以看出,分配堆棧的方式與裸機(jī)不同,使用的是單區(qū)模型,從下向上排列


__LOS_HEAP_ADDR_START __ = __ los_heap_base,為堆低地址;

__LOS_HEAP_ADDR_END __ = |Image$ $ARM_LIB_STACKHEAP$ $ZI$ $Base | - 1,為堆頂(不確定的地址);

|Image$ $ARM_LIB_STACKHEAP$ $ZI$ $Base|,為棧底(不確定的地址);

|Image$ $ARM_LIB_STACKHEAP$ $ZI$ $Limit|,為棧頂?shù)刂?

 

所以,由上文可知,在sct文件中必然會出現(xiàn)ARM_LIB_STACKHEAP這個(gè)執(zhí)行域:

 

LR_IROM1 0x08000000 0x00020000  {    ; load region size_region

    ER_IROM1 0x08000000 0x00020000  {    ; load address = execution address

        *.o (RESET, +First)

        *(InRoot$$Sections)

        .ANY (+RO)

        * (LOS_HEAP_INFO)

    }

    VECTOR 0x20000000 0x400  {    ; Vector

        * (.data.vector)

    }

    RW_IRAM1 0x20000400 0x00004800  {    ; RW data

        ;.ANY (+RW +ZI)

        * (.data, .bss)

        * (LOS_HEAP)

    }

    ARM_LIB_STACKHEAP 0x20004C00 EMPTY 0x400  {    ;LiteOS MSP

 

    }

}

那么其他的異常中斷向量入口在哪里呢?定義在los_hwi.c文件中被定義成了數(shù)組的形式:


#ifdef __ICCARM__

#pragma  location = ".data.vector"

#elif defined (__CC_ARM) || defined (__GNUC__)

LITE_OS_SEC_VEC

#endif

 

HWI_PROC_FUNC m_pstHwiForm[OS_VECTOR_CNT] =

{

    (HWI_PROC_FUNC)0,                    // [0] Top of Stack

    (HWI_PROC_FUNC)Reset_Handler,        // [1] reset

    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [2] NMI Handler

    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [3] Hard Fault Handler

    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [4] MPU Fault Handler

    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [5] Bus Fault Handler

    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [6] Usage Fault Handler

    (HWI_PROC_FUNC)0,                    // [7] Reserved

    (HWI_PROC_FUNC)0,                    // [8] Reserved

    (HWI_PROC_FUNC)0,                    // [9] Reserved

    (HWI_PROC_FUNC)0,                    // [10] Reserved

    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [11] SVCall Handler

    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [12] Debug Monitor Handler

    (HWI_PROC_FUNC)0,                    // [13] Reserved

    (HWI_PROC_FUNC)osPendSV,             // [14] PendSV Handler

    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [15] SysTick Handler

};

這一部分代碼被分散加載文件加載到了VECTOR段,位于RAM的開頭部分。


在內(nèi)核初始化時(shí)會進(jìn)行中斷向量表重映射的工作。


關(guān)鍵字:STM32  加載文件  sct 引用地址:STM32 分散加載文件 .sct 解析

上一篇:STM32 啟動代碼 __main 與用戶主程序 main() 的區(qū)別
下一篇:STM32Fxxx 上移植 Huawei LiteOS

推薦閱讀

鳳凰網(wǎng)科技訊 據(jù)彭博社北京時(shí)間3月30日報(bào)道,在蘋果公司iPhone X旗艦機(jī)旺盛需求的推動下,富士康母公司鴻海精密的第四季度凈利潤超出預(yù)期。根據(jù)鴻海此前公布的利潤計(jì)算,截至12月的第四季度,鴻海凈利潤為新臺幣717億元(約合25億美元),較上年同期的新臺幣688億元增長4%,超出了新臺幣580億元的市場預(yù)期。鴻海第四季度營收為新臺幣1.73萬億元(約合594億...
5G的到來速度似乎快于我們的想象,針對5G應(yīng)用于自動駕駛的合規(guī)和安全性問題成為熱門話題。不可否認(rèn)的是,不管從傳輸?shù)臄?shù)據(jù)量還是傳輸速度來看,5G都是實(shí)現(xiàn)L5級別自動駕駛的基礎(chǔ),而且它還將比人類駕駛更加安全。文中剖析,5G的傳速度比4G快百倍以上,足以實(shí)現(xiàn)車與人、車、設(shè)施的低延時(shí)互聯(lián)互通。另外,在邊緣計(jì)算的加持之下,對擁有大量非結(jié)構(gòu)化數(shù)據(jù)的基礎(chǔ)...
3月21日,霍尼韋爾在武漢東湖高新區(qū)設(shè)立的全資子公司營業(yè)執(zhí)照順利開出。霍尼韋爾是一家有著超百年歷史,從事自控產(chǎn)品開發(fā)及生產(chǎn),年銷售額超過300億美元的世界500強(qiáng)公司。目前,霍尼韋爾光谷工廠已于3月7日復(fù)工復(fù)產(chǎn),產(chǎn)能恢復(fù)至50%。預(yù)計(jì)到5月上旬,復(fù)產(chǎn)率將達(dá)到100%。
  3月26日,第二十屆中國北方國際自行車電動車展覽會于天津梅江會展中心盛大開幕。時(shí)隔一年,行業(yè)各大品牌紛紛推陳出新。騎幻出行系列產(chǎn)品矩陣一經(jīng)展出,即在展館引起強(qiáng)烈轟動。   許多對換電模式有了解的業(yè)內(nèi)人士,都將“騎幻出行”譽(yù)為換電領(lǐng)域的第一品牌,背后的原因也極為簡單,“騎幻出行”的新模式是目前換電模式中最具優(yōu)勢與性價(jià)比,最有利...

史海拾趣

問答坊 | AI 解惑

視覺傳感器與光電開關(guān)之比較

視覺傳感器與光電開關(guān)之比較 1.視覺傳感器可以同時(shí)檢測多個(gè)特征,而光電開關(guān)是不能做到的。 2.視覺傳感器對定位要求比較寬松,光電開關(guān)需要定位準(zhǔn)確。 3.視覺傳感器可以檢測不同類型和多數(shù)量的特征,光電開關(guān)則需要很復(fù)雜的機(jī)械調(diào)整和數(shù)量改變 ...…

查看全部問答∨

單片機(jī)讀寫U盤,sd卡,tf卡及usb開發(fā)手冊

1.芯片及模塊手冊資料 2.應(yīng)用電路圖及封裝 3.SPI例程及UART例程 4.其他外圍應(yīng)用電路 5.232、電平轉(zhuǎn)換資料 6.芯片測試文檔 7.U盤支持列表 …

查看全部問答∨

求教HCF4051B電源怎么接啊

看了數(shù)據(jù)資料,也沒有弄明白,VEE,vSS怎么接 電源供電有幾種接法? 我剛開始接了vdd=+5v vss=vee=0 給控制信號開關(guān)不通 又把+5v改成12v還不行 一定要接負(fù)電源嗎 我那沒有負(fù)電源 謝謝了…

查看全部問答∨

怎么學(xué)計(jì)算機(jī)網(wǎng)絡(luò)原理

學(xué)了一年多現(xiàn)在還是不能掌握計(jì)算機(jī)網(wǎng)絡(luò)的精髓,看了許許多多的視頻教程和書籍可還是沒有那種想要的感覺一點(diǎn)都沒有,幾天不學(xué)習(xí)就會忘的一塌糊涂,沒有知識框架,不知道如何下手,沒有方向,真是郁悶的很,我很喜歡這門課程,我一直都想學(xué)精學(xué)透這門 ...…

查看全部問答∨

EVC 編寫 dll

EVC下編寫dll動態(tài)連接 error LNK2019: unresolved external symbol CoTaskMemAlloc referenced in function \"public: __cdecl 這個(gè)錯(cuò)誤。 但是,CoTaskMemAlloc這個(gè)函數(shù),你右鍵點(diǎn)擊  查看函數(shù)的定義,EVC又能自動定位到   ...…

查看全部問答∨

關(guān)于基于SJA1000的can節(jié)點(diǎn)通信

本人做了兩個(gè)基于SJA1000的can節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)在PELI模式下都能實(shí)現(xiàn)自發(fā)自收,但連在總線上時(shí)不能通信。 當(dāng)一個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù)時(shí),查了SR的狀態(tài)標(biāo)志位0x08,一直為1,說明上次的發(fā)送還未處理完,應(yīng)該是沒有收到另外一個(gè)節(jié)點(diǎn)的應(yīng)答信號吧。我查了資料 ...…

查看全部問答∨

請教關(guān)于EVC中樹控件CTreeCtrl的問題

   我的程序中用到CTreeCtrl,調(diào)試單步運(yùn)行到InsertItem()(即使程序是從EVC的幫助文件上COPY下來)語句時(shí)就出現(xiàn)0xC0000005的錯(cuò)誤,直接運(yùn)行的話到相應(yīng)的地方模擬器就死掉了,但是下到板子上時(shí)可以運(yùn)行的,煥一個(gè)其他的SDK也可以,實(shí)在 ...…

查看全部問答∨

Wince5.0中顯示驅(qū)動的問題

大家好, 我正在移植13506的wince5.0驅(qū)動到2440平臺上。在640*480的LCd上,顯示正常,但是換成一塊1024*768的屏后,發(fā)現(xiàn)啟動后桌面的圖標(biāo)很模糊,有些不顯示,但是拖動的時(shí)候卻能正常顯示。打開應(yīng)用軟件也正常。 驅(qū)動沒有過多研究,想問一下大家 ...…

查看全部問答∨

采集高速的電壓信號

采集高速的電壓信號,但是超過了11V,用放大電路如何搭這個(gè)信號采集電路?!?

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 舞钢市| 饶平县| 通州市| 宜宾市| 长治县| 缙云县| 古田县| 兴山县| 樟树市| 寿宁县| 苏尼特左旗| 巧家县| 屯昌县| 津市市| 平邑县| 五大连池市| 汉源县| 虞城县| 乐清市| 抚松县| 米泉市| 乌恰县| 河东区| 延川县| 安陆市| 通化市| 新乐市| 诸城市| 徐水县| 平果县| 根河市| 白河县| 休宁县| 延安市| 诏安县| 岚皋县| 虞城县| 务川| 滕州市| 塔城市| 弋阳县|