历史上的今天
今天是:2024年10月28日(星期一)
2019年10月28日 | 关于__user_initial_stackheap( )
2019-10-28 来源:51hei
1.作用:用于提供编译器的初始化C库函数设置用户程序的堆栈所需要的堆栈信息。
2.__user_initial_stackheap() 返回:
r0 中的堆基址
r1 中的堆栈基址,即堆栈区中的最高地址
r2 中的堆限制
r3 中的堆栈限制,即堆栈区中的最低地址。
有单区模型和双区模型。
单区模型:(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
上一篇:初识ARM cotex—A9
下一篇:arm开关中断汇编接口
史海拾趣
|
file:///C:/Documents%20and%20Settings/Administrator.4797A7AA28774FE/桌面/未命名.bmp请问这个电路中电感RFC和电容Cbypass值应如何计算,假如放大器的输出频率为5000MHz… 查看全部问答> |
|
如谁有这方面的材料的 请发给我一下可以么?不一定符合下面的要就的,关于多点温度检测系统的都可以发给me,设计一个多点温度检测系统,系统结构框图如下 : 温度测点1→ → 检测器单元1   ...… 查看全部问答> |
|
VXWORKS启动时超级终端会打印以下信息: Copyright 1984-1998 Wind River Systems, Inc. CPU: Motorola ADS - PowerPC 860 VxWorks: 5.4 ...… 查看全部问答> |
|
在嵌入式系统上做Qt串口显示程序 ,make后出现的问题,查了一些资料,有的说是pro里面的HEADERS忘记加就会出现这个问题(具体加什么没说);有的说是出现“undefined reference”表示你缺少*.h 困扰很 ...… 查看全部问答> |
|
我现在写不了某些寄存器(就I2C寄存器写不进去,其他都可以) 有遇见这种问题的么? 我是关了MMU的啊~ 情况如下: 我在shell中输入 查看内存0x55000000位置的寄存器。 d 0x55000000 55000000: 0100 0000 0000 0000 0000 0000 00 ...… 查看全部问答> |
|
求购 S3C4510B 的开发板 最近找了份4510b的资料,看着不错可惜没有板子练。真是郁闷啊!不知道哪为高手还有收藏! 有的话留个言! 电话:13141280460 qq:406672875… 查看全部问答> |
|
在自测试模式下,想实现从邮箱1发数据给邮箱3,但是运行程序发现TRS寄存器不能置位,信息发不出去,不知道怎么回事。 有没有人遇到过类似情况呢? 程序如下 void InitECan(void) { struct ECAN_REGS ECanaShadow; EALLOW; / ...… 查看全部问答> |
|
学习C5416已经很久了,但是进度非常的慢,一个人盲打莽撞。 最近又碰上了个卡了很久的问题: 想用一个串口实现同时输入输出,因为C5416是全双工的。我用5416与TLV2541和TLV5636相接实现信号的输入与输出。 5416一个 ...… 查看全部问答> |
|
The embedded system of the analog design 好书适合数字工程师了解的模拟知识 本书为那些希望掌握基本模拟知识的数字工程师而写,内容包括A/D转换器、D/A转换器、运放、滤波器以及模拟和数字系统集成设计。 本书特别适合那些从事信息家电、工业控制和机电控制系统等模拟/数字 ...… 查看全部问答> |




