历史上的今天

今天是:2024年10月28日(星期一)

正在发生

2019年10月28日 | 关于__user_initial_stackheap( )

发布者:笑脸猫 来源: 51hei关键字:编译器  初始化  C库函数 手机看文章 扫描二维码
随时随地手机看文章

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


关键字:编译器  初始化  C库函数 引用地址:关于__user_initial_stackheap( )

上一篇:初识ARM cotex—A9
下一篇:arm开关中断汇编接口

推荐阅读

开发商ConcernedApe(Eric Barone)表示,以农场为主题的角色扮演游戏《星露谷物语》已经在游戏机和个人电脑上大受欢迎,今天这款游戏将推向iOS平台。        官方称《Stardew Valley》正在全面转型,iOS平台上大部分主要功能和内容完好无损。        这款“休闲”游戏还将加入合作多人游戏,PC玩家甚至可以使用iTunes,将游戏中的文件...
1987 年,当时的工研院电子工业研究所副所长杨丁元等人,带着一份半导体整合元件厂的营运计画找上华新丽华创办人焦廷标,获得他的应允投资,成立了华邦电子,并指派长子焦佑钧担任董事长。双方于 1988 年签下产品与技术授权合约;很快的,5 吋晶圆厂一厂落成启用,第一片正式晶圆产出,华邦电从此与半导体产业结下不解之缘。创业初期 工研院加持如虎...
Mentor, a Siemens business 近日与 Arm® 深化合作,帮助集成电路 (IC) 设计人员优化基于Arm设计的功能验证。通过此次合作,Arm的设计评审计划 (Design Reviews program) 可以为客户提供Mentor功能验证工具的专业知识,助其优化基于Arm的芯片级系统 (SoC) 设计。 Arm与Mentor合作推出的 RTL 验证设计评审 (Verification Design Review) 服务,能够...
对于三元锂与磷酸铁锂电芯的特性,今天我想把一些关键数据做一个整理。首先对比一下同一个电芯制造商(宁德时代),提供给特斯拉Model 3的磷酸铁锂版本和提供给小鹏P7的三元锂NCM811,然后再比较下采用比亚迪刀片电池的汉EV的磷酸铁锂电芯,和特斯拉磷酸铁锂电芯版本的差异。Part 1:特斯拉与小鹏P7的电芯差异我把这两颗电芯做了一个对比,特斯拉的电芯...

史海拾趣

问答坊 | AI 解惑

多功能随身电源设计

引言 现在,市场上可移动的电子设备越来越多,设备的电源容量和功耗却远远不能满足市场的要求,对日常生活,特别是户外活动造成诸多不便。为此,本文设计了一种多功能、高效、低功耗、安全的随身电源,以满足户外需求,将有很大的实用价值。 多功 ...…

查看全部问答∨

求助高手帮忙看看运放输出电压

求助高手帮忙看看运放输出电压…

查看全部问答∨

IAR中的“Segment NEAR_I”大小设置?

请教如何设置 IAR中的NEAR_I Segment 的大小? 我是用IAR For AVR 5.11B版,在链接时出现以下错误提示: Error[e16]: Segment NEAR_I (size: 0xdb0c align: 0) is too long for segment definition. At least 0xcb4c more bytes needed. The prob ...…

查看全部问答∨

NXP LPC1343 开发板 学习之旅(三)------led控制实验

       学东西就是要趁热打铁,这样进步才能更快,这不,今天继续跟大家分享下我用上位机控制小灯的实验。 在第二篇学习之旅中,我已经完成了串口的基本调试,在第一篇完场了led的点亮的实验,那么接下来自然而然的 ...…

查看全部问答∨

求WIN CE开发的小程序源码

本人急需WIN CE入门! 要求:用VS2005开发,要比"HELLO WORLD"的难度稍微大一点,多用一些控件,当然是常规控件(如:mainMenu ,pictureBox1等),我急需了解其用法(急需)!能附带对数据库操作的最好!…

查看全部问答∨

电子设计与制作大赛模拟试题——液位控制器

本帖最后由 paulhyde 于 2014-9-15 03:51 编辑 2010年全国电子专业人才设计与技能大赛模拟试题  …

查看全部问答∨

活动告一个段落了!!嘻嘻!来了个迟到的我给补上啊。。。

         记得在十月一号之前有了举办我与51的征文活动的想法,   于是报着试试看的心理我就发了帖子,没想到soso姐很给力啊!不但允许了活动还有情赞助了奖品啊! 于是征文活动这样开始了,大家 ...…

查看全部问答∨

MSP430激光安全系统

一个由激光器,红外接收器,2X16的LCD模块和和喇叭组成的报警系统。相信很多人在刚刚学习单片机的时候曾今做过这样子的报警器。先上一张系统的图片这是个国外的小制作,可惜视频连不上(没翻墙,哈哈!)PCB的照片…

查看全部问答∨

求助 高手

怎么能在  ads1,2的环境下生成  hex文件    望高手指点    谢谢…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved