__user_initial_stackheap() 上班偷懒翻译的KEIL说明书里的

[复制链接]
 楼主| oumi 发表于 2009-7-17 18:00 | 显示全部楼层 |阅读模式
__user_initial_stackheap()<br />RealView&nbsp;Compilation&nbsp;Tools&nbsp;for&nbsp;&micro;Vision&nbsp;Libraries&nbsp;and&nbsp;Floating&nbsp;Point&nbsp;Support&nbsp;Guide&nbsp;Version&nbsp;4.0&nbsp;<br />&nbsp;<br />Home&nbsp;&gt&nbsp;The&nbsp;C&nbsp;and&nbsp;C++&nbsp;Libraries&nbsp;&gt&nbsp;Tailoring&nbsp;the&nbsp;runtime&nbsp;memory&nbsp;model&nbsp;&gt&nbsp;__user_initial_stackheap()&nbsp;<br /><br />2.10.5.&nbsp;__user_initial_stackheap()<br />__user_initial_stackheap()在旧程序中比较常见,该函数的最新替代函数为__user_setup_stackheap().<br /><br />Migrating&nbsp;to&nbsp;RVCT&nbsp;v4.0&nbsp;from&nbsp;RVCT&nbsp;v2.x&nbsp;and&nbsp;earlier<br />RVCT&nbsp;v2.x&nbsp;及之前的版本,&nbsp;Image$$ZI$$Limt的值决定是否调用__user_initial_stackheap()。如果开发人员使用scatter文件,那么&nbsp;Image$$ZI$$Limt不会被定义,此时开发人员必须重新实现__user_initial_stackheap()的函数体,不然编译不会成功。<br /><br />或者,在程序中可以用&nbsp;__user_setup_stackheap()&nbsp;来代替__user_initial_stackheap()。<br /><br />Migrating&nbsp;to&nbsp;RVCT&nbsp;v4.0&nbsp;from&nbsp;RVCT&nbsp;v3.x<br />RVCT&nbsp;v3.x&nbsp;及之后版本,&nbsp;&micro;Vision&nbsp;库里包含了更多__user_initial_stackheap()的函数体,这样编译器可以根据开发人员scatter文件的内容自动选择合适的函数体。换句话说,针对RVCT&nbsp;v3.x及之后的版本,使用scatter文件的开发人员可以不再重新实现__user_initial_stackheap()的函数体。&nbsp;&nbsp;See&nbsp;Using&nbsp;a&nbsp;scatter-loading&nbsp;description&nbsp;file&nbsp;for&nbsp;more&nbsp;information.<br /><br />语法<br />extern&nbsp;__value_in_regs&nbsp;struct&nbsp;__user_initial_stackheap&nbsp;__user_initial_stackheap(unsigned&nbsp;R0,&nbsp;unsigned&nbsp;SP,&nbsp;unsigned&nbsp;R2,&nbsp;unsigned&nbsp;SL);<br />用法<br />__user_initial_stackheap()&nbsp;的返回值规则:<br /><br />堆底地址放在&nbsp;r0,堆底指堆内最小地址<br /><br />栈顶地址放在r1,栈顶指栈内最大地址<br /><br />堆顶地址放在r2,堆顶指堆内最大地址<br /><br />栈底地址放在&nbsp;r3,栈底指栈内最小地址。<br /><br />如果该函数函数体重新定义,必须遵循三点:<br /><br />使用栈的字节数必须小于88&nbsp;bytes<br /><br />除了&nbsp;r12&nbsp;(ip)之外不能乱用别的寄存器<br /><br />堆内需要保持8字节对齐。(栈里应该也需要,看KEIL的例程)<br /><br />针对默认的&nbsp;one-region&nbsp;模型,&nbsp;r2&nbsp;和&nbsp;r3&nbsp;中的值被忽略,r0&nbsp;和&nbsp;r1中存储的两个地址之间存储区都被堆所使用。针对&nbsp;two-region&nbsp;模型,&nbsp;堆顶地址由&nbsp;r2中的值决定,栈底地址由r3中的值决定。<br /><br />当__main()&nbsp;被调用时,sp&nbsp;(r13)的值会被作为参数传递到r1中。__user_initial_stackheap()的默认函数体由sys_stackheap.o目标提供(&nbsp;using&nbsp;the&nbsp;semihosting&nbsp;SYS_HEAPINFO)&nbsp;。<br /><br />To&nbsp;create&nbsp;a&nbsp;version&nbsp;of&nbsp;__user_initial_stackheap()&nbsp;that&nbsp;inherits&nbsp;sp&nbsp;from&nbsp;the&nbsp;execution&nbsp;environment&nbsp;and&nbsp;does&nbsp;not&nbsp;have&nbsp;a&nbsp;heap,&nbsp;set&nbsp;r0&nbsp;and&nbsp;r2&nbsp;to&nbsp;the&nbsp;value&nbsp;of&nbsp;r3&nbsp;and&nbsp;return.&nbsp;See&nbsp;__user_setup_stackheap())&nbsp;for&nbsp;more&nbsp;information.&nbsp;<br /><br />rt_misc.h中__initial_stackheap&nbsp;结构体的定义:<br /><br />struct&nbsp;__initial_stackheap{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;heap_base,&nbsp;stack_base,&nbsp;heap_limit,&nbsp;stack_limit;<br />};<br />注意<br />由于使用全递减栈,stack_base&nbsp;的值等于栈内最高地址加0x1<br /><br />See&nbsp;the&nbsp;examples&nbsp;directory&nbsp;for&nbsp;example&nbsp;reimplementations&nbsp;of&nbsp;this&nbsp;function.<br /><br />返回值<br />使用One-region存储器模型或Two-region存储器模型决定r0&nbsp;到&nbsp;r3中的返回值&nbsp;:<br /><br />One-region&nbsp;<br /><br />(r0,r1)&nbsp;是单一的堆+栈区域.&nbsp;r1&nbsp;大于&nbsp;r0.,r2&nbsp;和&nbsp;r3&nbsp;忽略。<br /><br />Two-region&nbsp;<br />(r0,&nbsp;r2)&nbsp;分配为堆,&nbsp;(r3,&nbsp;r1)&nbsp;分配为栈.&nbsp;r2&nbsp;大于等于&nbsp;r0.&nbsp;r3&nbsp;小于&nbsp;r1.<br /><br />使用scatter-loading&nbsp;(分散加载)描述文件<br />默认__user_initial_stackheap()&nbsp;函数体需要使用Image$$ZI$$Limt模型,如果开发人员使用scatter文件的话,Image$$ZI$$Limt模型不会被定义。然而,&nbsp;&micro;Vision&nbsp;的C库里提供了一些__user_initial_stackheap()&nbsp;的函数体,开发人员可以通过scatter文件中的内容来控制开发环境来调用具体哪一个函数体。<br /><br />自动选择&nbsp;one-region&nbsp;存储器模型<br />在分散加载文件中定义一个特殊的执行域ARM_LIB_STACKHEAP.,给该域定义EMPTY&nbsp;属性。<br /><br />这样,编译器就会从库中选择一个__user_initial_stackheap()&nbsp;的函数体以ARM_LIB_STACKHEAP为堆-栈合并域,这个函数体需要用到&nbsp;Image$$ARM_LIB_STACKHEAP$$Base&nbsp;和Image$$ARM_LIB_STACKHEAP$$ZI$$Limit两个模型。<br /><br />自动选择&nbsp;two-region&nbsp;存储器模型<br />在分散加载文件中定义两个特殊的执行域,ARM_LIB_HEAP&nbsp;和&nbsp;ARM_LIB_STACK.,给这两个域都定义EMPTY&nbsp;属性。<br /><br />这样,编译器就会从库中选择一个用到&nbsp;Image$$ARM_LIB_HEAP$$Base,&nbsp;Image$$ARM_LIB_HEAP$$ZI$$Limit,&nbsp;Image$$ARM_LIB_STACK$$Base,&nbsp;and&nbsp;Image$$ARM_LIB_STACK$$ZI$$Limit.四个模型的__user_initial_stackheap()&nbsp;的函数体。<br /><br />sp会通过ARM_LIB_STACKHEAP&nbsp;(one-region&nbsp;存储器模型)或者&nbsp;ARM_LIB_STACK&nbsp;(two-region&nbsp;存储器模型)进行初始化。<br /><br />错误信息<br />如果使用了scatter文件,但是没有在scatter文件中定义特定的域(ARM_LIB_STACKHEAP/ARM_LIB_HEAP&nbsp;和&nbsp;ARM_LIB_STACK),也没有重定义__user_initial_stackheap(),函数体,函数库在调试信息中报错。<br /><br />Copyright&nbsp;&copy;&nbsp;2007,&nbsp;2008&nbsp;ARM&nbsp;Limited.&nbsp;All&nbsp;rights&nbsp;reserved.&nbsp;ARM&nbsp;DUI&nbsp;0378B&nbsp;<br />Non-Confidential&nbsp;Unrestricted&nbsp;Access&nbsp;<br />&nbsp;<br />Home&nbsp;&gt&nbsp;The&nbsp;C&nbsp;and&nbsp;C++&nbsp;Libraries&nbsp;&gt&nbsp;Tailoring&nbsp;the&nbsp;runtime&nbsp;memory&nbsp;model&nbsp;&gt&nbsp;__user_initial_stackheap()&nbsp;<br /><br />Copyright&nbsp;&copy;&nbsp;Keil,&nbsp;An&nbsp;ARM&nbsp;Company.&nbsp;All&nbsp;rights&nbsp;reserved.<br />
 楼主| oumi 发表于 2009-7-17 18:01 | 显示全部楼层

格式都没了....

大家帮我看看啊,翻译完了才感觉没啥用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

71

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部