• __user_initial_stackheap 库函数翻译(转)


    from:http://blog.cechina.cn/metalmax/181841/message.aspx

    今天被这些库函数郁闷了,翻出帮助文档,索性就翻译了点,提供给像我这样迷惑的人参考,俺英文水平很有限,见谅!

    __user_initial_stackheap 库函数用法翻译

    __user_initial_stackheap返回初始化堆和栈的位置

    RVCT V2.X及其更早的版本中__user_initial_stackheap默认使用的是符号|Image$$ZI$$Limit|的值。当使用分散加载文件的时候这个符号不会产生。如果你使用分散加载文件,那么你需要重新执行__user_initial_stackheap函数,不然链接会失败。

    在RVCT V3.X中__user_initial_stackheap的功能得到了加强,即使你使用分散加载文件也不需要你重新执行__user_initial_stackheap函数。函数会根据你的分散加载文件的描述选择正确的功能函数段。

    注意:如果你重新执行__user_initial_stackheap函数,这将忽略所有的库函数的执行。这就使得存在的应用程序不需要修改。

    语法:
            __valu_in_regs    struct __initial_stackheap    __user_initial_stackheap(unsinged R0,
                                                                                     unsigned SP,
                                                                                     unsgined R2)

    用法:
            __user_initial_stackheap 返回这些值:
                    1. 堆基址(heap base)                          ---> RO
                    2. 栈基址(stack base,一般为栈的最高地址)      ---> R1
                    3. 堆顶(heap limit)                           ---> R2
                    4. 栈顶(stack limit)                          ---> R3

            如果这个函数被重新执行,那么必须满足以下条件:
                    1. 栈的使用不能超过88字节。
                    2. R12(ip)不能被破坏。
                    3. 堆要以8字节方式对齐(ALIGN = 3)。

            默认的一段模式中R2,R3将被忽略,R0,R1间的存储空间将全部用来作为堆空间。如果使用二段模式那么堆和栈的空间将分别受R2,R3的限制。 在rt_misc.h中__user_initial_stackheap的定义是这样的:
            struct __initial_stackheap {
                unsigned heap_base, stack_base, heap_limit, stack_limit
            }

            注意:
                    由于满递减堆栈的原因,stack_base的值比栈的最高地址要高出1个栈容量。

    返回: R0,R1,R2,R3中的返回值是由你使用的一段存储模式还是二段存储模式决定。
                    1. 一段模式中R1比R0大。R2和R3被忽略了。
                    2. 二段模式中R0和R2用来初始化堆,R1和R3用来初始化栈。R2 >= R0, R3 < R1

                    ┏━━━┳━━━┓<----- R1 ----->┏━━━┳━━━┓<--- HIGH ADDR
                    ┃            ↑            ┃  stack_base  ┃            │            ┃
                    ┃            │            ┃                        ┃            │            ┃
                    ┃            │            ┃                        ┃         stacks        ┃
                    ┃            │            ┃                        ┃            │            ┃
                    ┃            │            ┃                        ┃            ↓            ┃
                    ┃            │            ┃          R3 ----->┃           ┻             ┃
                    ┃            ↑            ┃                        ┃                            ┃
                    ┃            │            ┃                        ┃                            ┃
                    ┃            │            ┃                        ┃                            ┃
                    ┃            │            ┃          R2 ----->┃           ┳            ┃
                    ┃            │            ┃                        ┃           ↑             ┃
                    ┃            │            ┃                        ┃           │             ┃
                    ┃            │            ┃                        ┃           │             ┃
                    ┃      heaps           ┃                        ┃         heaps        ┃
                    ┃            │            ┃                        ┃           │             ┃
                    ┃            │            ┃                        ┃           │             ┃
                    ┃            │            ┃                        ┃           │             ┃
                    ┗━━━┻━━━┛<----- R0 ----->┗━━━┻━━━┛<--- LOW ADDR

                 _use_one_memory_region             _use_two_memory_region


    使用分散加载文件:
                    默认情况下__user_initial_stackhep()使用的是符号|Image$$ZI$$limit|的值。这个符号在用户使
                    用分散加载文件时不会产生。然而,C库提供了比较折中的方法:利用分散加载文件中的一些信息来执行这个函数。

            注意:
            如果你重新执行__user_initial_stackhep()函数,那么其他的库的执行将被忽略。

            选择使用一段存储模式:
                    定义一段特殊的执行域在你的分散加载文件中。使用这种符号:ARM_LIB_STACKHEAP,并使用EMPTY属性。这样库管理器就选择了一个把这个域当作堆和栈合并在一起的__user_initial_stackhep()函数。在这个函数中使用了Image$$ARM_LIB_STACKHEAP$$Base和Image$$ARM_LIB_STACKHEAP$$ZI$$Limit符号 。
            选择使用二段存储模式:
                    定义两个特殊的执行域再你的分散加载文件中。使用这两种符号:ARM_LIB_STACK, ARM_LIB_HEAP。并且两个段都要使用EMPTY属性。这样库管理器就会选择使用符号:Image$$ARM_LIB_HEAP$$Base、
    Image$$ARM_LIB_STACK$$ZI$$ZI$$limit、Image$$ARM_LIB_STACK$$Base、image$$ARM_LIB_STACK$$ZI$$Limit的__user_initial_stackhep()函数。

            例子:
                    FLASH_LOAD 0x0000 0x00200000
                    {
                            VECTORS +0 0x400
                            {
                                    * (:gdef:__vectab_stack_and_reset, +FIRST)
                                    ; 其他域可以放在这里
                            }

                            ;; 最高256 异常深度 (256*4bytes == 1024 == 0x400)
                            CODE 0x400 FIXED
                            {
                                    * (+RO)
                            }

                            DATA 0x20000000 0x00200000
                            {
                                    * (+RW, +ZI)
                            }

                            ;; 堆开始于 1MB ,向高地址生长
                            ARM_LIB_HEAP 0x20100000 EMPTY 0x100000-0x8000
                            {
                            }

                            ;; 堆安排在 2MB RAM的最高地址处
                            ;; 向低地址生长,空间为32KB
                            ARM_LIB_STACK 0x20200000 EMPTY - 0x8000
                            {
                            }
                    }

  • 相关阅读:
    利用css实现鼠标经过元素,下划线由中间向两边展开
    盒模型的auto值
    CSS选择器
    CSS类名命名规则
    leetcode 移除元素
    leetcode 有效的括号
    leetcode 罗马数字转整数
    leetcode 回文数
    leetcode 合并两个有序数组
    leetcode 最长公共前缀
  • 原文地址:https://www.cnblogs.com/xinjie/p/1546760.html
Copyright © 2020-2023  润新知