__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
??????????????????????? {
??????????????????????? }
??????????????? }
轉載于:https://www.cnblogs.com/xinjie/archive/2009/08/15/1546760.html
總結
以上是生活随笔為你收集整理的__user_initial_stackheap 库函数翻译(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp.net C# 时间格式大全
- 下一篇: C#正则表达式判断是否为IP地址