3324|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

关于__user_initial_stackheap( ) [复制链接]

  1. 1.作用:用于提供编译器的初始化C库函数设置用户程序的堆栈所需要的堆栈信息。
  2. 2。__user_initial_stackheap() 返回:

  3. * r0 中的堆基址
  4. * r1 中的堆栈基址,即堆栈区中的最高地址
  5. * r2 中的堆限制
  6. * r3 中的堆栈限制,即堆栈区中的最低地址。


  7. 有单区模型和双区模型。

  8. 单区模型:(r0,r1)是单个堆栈和堆区。r1 大于 r0,并忽略 r2 和 r3。

  9. r0--r1这一块内存区域被堆和栈共用,堆从r0向上生长,栈从r1向下生长。

  10. 双区模型:(r0, r2)是初始堆,(r3, r1) 是初始堆栈。r2 大于或等于 r0。r3 小于 r1。
  11. 堆和栈分别指定了单独的内存区域。

  12. 3.如果不使用分散加载文件,则__user_initial_stackheap()必须由用户自己实现。

  13. 实现例子:
  14. ; User Initial Stack & Heap
  15. AREA |.text|, CODE, READONLY

  16. IMPORT __use_two_region_memory
  17. EXPORT __user_initial_stackheap
  18. __user_initial_stackheap

  19. LDR R0, = Heap_Mem
  20. LDR R1, =(Stack_Mem + USR_Stack_Size)
  21. LDR R2, = (Heap_Mem + Heap_Size)
  22. LDR R3, = Stack_Mem
  23. BX LR

  24. 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。这种方式比较方便。

  25. 例子:
  26. 分散加载文件:
  27. LR_IROM1 0x00000000 0x00008000 ;; Load region
  28. {
  29. ER_IROM1 0x00000000 0x00008000
  30. {
  31. vectors.o (VECT, +First)
  32. init.o (INIT)
  33. * (+RO)
  34. }

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

  43. 在初始化文件中使用||Image$$ARM_LIB_STACK$$ZI$$Limit||作为栈底,

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

  47. ldr r1, =||Image$$ARM_LIB_STACK$$ZI$$Limit||

  48. mrs r0,cpsr ; Original PSR value ;
  49. bic r0,r0,#MODE_BITS ; Clear the mode bits ;
  50. orr r0,r0,#IRQ_MODE ; Set IRQ mode bits ;
  51. msr cpsr_c,r0 ; Change the mode ;
  52. mov sp, r1
  53. sub r1, r1, #IRQ_STK_SIZE

  54. ............................ ;
复制代码


转载自:machunshui

点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表