欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 關于__user_initial_stackheap( ) [打印本頁]

作者: 電子黑    時間: 2016-6-27 21:55
標題: 關于__user_initial_stackheap( )
1.作用:用于提供編譯器的初始化C庫函數設置用戶程序的堆棧所需要的堆棧信息。
2.__user_initial_stackheap() 返回:

有單區模型和雙區模型。

單區模型:(r0,r1)是單個堆棧和堆區。r1 大于 r0,并忽略 r2 和 r3。

r0--r1這一塊內存區域被堆和棧共用,堆從r0向上生長,棧從r1向下生長。

雙區模型:(r0, r2)是初始堆,(r3, r1) 是初始堆棧。r2 大于或等于 r0。r3 小于 r1。
堆和棧分別指定了單獨的內存區域。

3.如果不使用分散加載文件,則__user_initial_stackheap()必須由用戶自己實現。

實現例子:
; User Initial Stack & Heap
                AREA    |.text|, CODE, READONLY

                IMPORT  __use_two_region_memory
                EXPORT  __user_initial_stackheap
__user_initial_stackheap

                LDR     R0, =  Heap_Mem
                LDR     R1, =(Stack_Mem + USR_Stack_Size)
                LDR     R2, = (Heap_Mem +      Heap_Size)
                LDR     R3, = Stack_Mem
                BX      LR

4.使用分散加載可以由用戶實現,也可以在分散加載描述文件中定義兩個特殊執行區(雙區模型,單區模型只定義ARM_LIB_STACKHEAP):        ARM_LIB_HEAP 和 ARM_LIB_STACK(該區具有 EMPTY 屬性。),從而使用C庫的默認實現,此時,會導致庫選擇一個使用以下符號值的 __user_initial_stackheap() 實現:Image$$ARM_LIB_HEAP$$Base、Image$$ARM_LIB_HEAP$$ZI$$Limit、Image$$ARM_LIB_STACK$$Base 和 Image$$ARM_LIB_STACK$$ZI$$Limit。這種方式比較方便。

例子:
分散加載文件:
LR_IROM1 0x00000000 0x00008000                                     ;; Load region
{
    ER_IROM1 0x00000000    0x00008000
    {
        vectors.o (VECT, +First)
        init.o (INIT)
        * (+RO)
    }

    RW_IRAM1 0x40000040 0x00001460
    {
        * (+RW,+ZI)
    }                                                           ;; The following declarations select the "two region model" ;
                                                                ;; A default __user_initial_stackheap() will be used        ;
    ARM_LIB_HEAP  0x40001500 EMPTY  0x00000100   {}
    ARM_LIB_STACK 0x40002000 EMPTY -0x00000400   {}
}

在初始化文件中使用||Image$$ARM_LIB_STACK$$ZI$$Limit||作為棧底,

例子:
                IMPORT __use_two_region_memory
                IMPORT  ||Image$$ARM_LIB_STACK$$ZI$$Limit||     ; Import stack limit from scatter-loading file              ;

                ldr     r1, =||Image$$ARM_LIB_STACK$$ZI$$Limit||
               
                mrs     r0,cpsr                             ; Original PSR value                                        ;
                bic     r0,r0,#MODE_BITS                    ; Clear the mode bits                                       ;
                orr     r0,r0,#IRQ_MODE                     ; Set IRQ mode bits                                         ;
                msr     cpsr_c,r0                           ; Change the mode                                           ;
                mov     sp, r1
                sub     r1, r1, #IRQ_STK_SIZE







歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1