历史上的今天
返回首页

历史上的今天

今天是: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


推荐阅读

史海拾趣

Chips And Technologies Inc公司的发展小趣事

C&T始终坚持品质至上的原则,从原材料的采购到产品的生产、测试,每一个环节都严格把控。这种对品质的执着追求,使得C&T的产品在市场上赢得了良好的口碑。许多知名电脑制造商都选择与C&T合作,将其产品作为首选的半导体解决方案。

DAQ Electronics LLC公司的发展小趣事

随着国内外市场的不断拓展和客户需求的不断增长,DAQ Electronics LLC公司开始积极探索国际化发展道路。公司积极参加国际展会和技术交流活动,与全球同行建立了广泛的联系和合作。同时,公司也加大了对海外市场的投入力度,不断拓展海外市场份额。这种国际化的发展战略不仅为公司带来了更多的商业机会和合作伙伴也为公司未来的发展提供了更广阔的空间和机遇。

请注意,以上故事均为虚构内容,仅供参考。如有需要,建议直接联系DAQ Electronics LLC公司获取其真实的发展历程和故事。

Display Elektronik GmbH公司的发展小趣事

随着环保意识的日益增强,Display Elektronik GmbH将绿色环保理念融入到了公司的发展中。公司采用环保材料和生产工艺,减少了对环境的污染。同时,Display Elektronik GmbH还积极推广绿色显示技术,为客户提供更加环保、节能的显示解决方案。这种对环保的关注和投入,让Display Elektronik GmbH在行业中树立了良好的形象。

Electroswitch公司的发展小趣事

在80年代,Electroswitch迎来了一个重要的技术突破期。公司成功开发了一系列符合MIL规格的旋转开关,这些产品凭借其坚固耐用和高品质的特性,迅速赢得了市场的认可。同时,Electroswitch还积极适应新的生产线,不断扩大在工业和电气实用市场的份额。此外,公司还成功收购了西屋电气开关部,进一步增强了其在电力行业中的竞争力。

迪一电子公司的发展小趣事

在技术创新的基础上,迪一电子公司开始积极拓展市场。公司积极参加国内外电子展会和博览会,与全球各地的客户建立联系。同时,公司还注重品牌建设,通过广告宣传、赞助活动等方式提高品牌知名度和美誉度。这些努力使迪一电子的产品逐渐打入国际市场,赢得了更多客户的认可。

昭华(CHA)公司的发展小趣事

昭华公司一直注重品牌建设和市场拓展。他们通过参加各种行业展会、举办技术研讨会等方式,积极宣传公司的产品和技术优势。同时,昭华公司还加强了与客户的沟通和合作,深入了解客户需求并提供定制化的解决方案。这些努力使得昭华公司的品牌知名度不断提升,市场份额也逐渐扩大。

问答坊 | AI 解惑

问一下关于放大器的偏置电路

file:///C:/Documents%20and%20Settings/Administrator.4797A7AA28774FE/桌面/未命名.bmp请问这个电路中电感RFC和电容Cbypass值应如何计算,假如放大器的输出频率为5000MHz…

查看全部问答>

[求助]多点温度检测系统

如谁有这方面的材料的   请发给我一下可以么?不一定符合下面的要就的,关于多点温度检测系统的都可以发给me,设计一个多点温度检测系统,系统结构框图如下  : 温度测点1→   →  检测器单元1    ...…

查看全部问答>

如何修改VXWORKS的启动标题

VXWORKS启动时超级终端会打印以下信息: Copyright 1984-1998  Wind River Systems, Inc.             CPU: Motorola ADS - PowerPC 860         VxWorks: 5.4 ...…

查看全部问答>

make问题,如何解决? 困扰很久了,感谢指点

    在嵌入式系统上做Qt串口显示程序 ,make后出现的问题,查了一些资料,有的说是pro里面的HEADERS忘记加就会出现这个问题(具体加什么没说);有的说是出现“undefined reference”表示你缺少*.h        困扰很 ...…

查看全部问答>

vxWorks寄存器读写问题

我现在写不了某些寄存器(就I2C寄存器写不进去,其他都可以) 有遇见这种问题的么? 我是关了MMU的啊~ 情况如下: 我在shell中输入 查看内存0x55000000位置的寄存器。 d 0x55000000 55000000:  0100 0000 0000 0000 0000 0000 00 ...…

查看全部问答>

求购 S3C4510B 的开发板 (二手也可以)

求购 S3C4510B 的开发板 最近找了份4510b的资料,看着不错可惜没有板子练。真是郁闷啊!不知道哪为高手还有收藏! 有的话留个言! 电话:13141280460 qq:406672875…

查看全部问答>

额定电流估算口诀

已知电机功率,如何估算电机的额定电流? 三相二百二电机,千瓦三点五安培。 三相三百八电机,一个千瓦两安培。 三相六百六电机,千瓦一点二安培。 三相三千伏电机,四个千瓦一安培。 三相六千伏电机,八个千瓦一安培。 3KW以下,1个KW,2.5个流…

查看全部问答>

2812的eCAN模块问题

在自测试模式下,想实现从邮箱1发数据给邮箱3,但是运行程序发现TRS寄存器不能置位,信息发不出去,不知道怎么回事。 有没有人遇到过类似情况呢? 程序如下 void InitECan(void) { struct ECAN_REGS ECanaShadow; EALLOW; / ...…

查看全部问答>

[求教]TMS320C5416串口疑问,被卡住很久了!

学习C5416已经很久了,但是进度非常的慢,一个人盲打莽撞。 最近又碰上了个卡了很久的问题:     想用一个串口实现同时输入输出,因为C5416是全双工的。我用5416与TLV2541和TLV5636相接实现信号的输入与输出。     5416一个 ...…

查看全部问答>

The embedded system of the analog design

好书适合数字工程师了解的模拟知识   本书为那些希望掌握基本模拟知识的数字工程师而写,内容包括A/D转换器、D/A转换器、运放、滤波器以及模拟和数字系统集成设计。  本书特别适合那些从事信息家电、工业控制和机电控制系统等模拟/数字 ...…

查看全部问答>