ARM初始化Stack

发布者:WhisperingWaves最新更新时间:2016-07-25 来源: eefocus关键字:ARM  初始化  Stack 手机看文章 扫描二维码
随时随地手机看文章
1. 简介

ARM有7种运行Mode,每一种Mode的堆栈指针寄存器(SP)都是独立的。

所以,对于程序中需要用的每一种处理器模式,都要给SP定义一个堆栈地址。

初始化流程为:

         修改状态寄存器内的状态位,使处理器切换到需要的模式

         给SP赋值。

注意:

        不要切换到User模式进行该模式下的堆栈设置,因为进入User模式后就不能再操作CPSR返回到其他模式了。

===============================

先定义各种模式对应的CPSR寄存器M[4:0]的值,该值决定了进入何种模式,可参考相关数据手册。

Mode_USR        EQU     0x10
Mode_FIQ        EQU     0x11
Mode_IRQ        EQU     0x12
Mode_SVC        EQU     0x13
Mode_ABT        EQU     0x17
Mode_UND        EQU     0x1B
Mode_SYS        EQU     0x1F 
I_BIT           EQU     0x80  ; when I bit is set (1), IRQ is disabled
F_BIT           EQU     0x40  ; when F bit is set (1), FIQ is disabled

下面是初始化堆栈的代码段:

InitStack    
        MOV     R0, LR

; /* 设置管理模式堆栈 */
        MSR     CPSR_c, #(Mode_SVC | I_BIT | F_BIT)  ; 0xd3
        LDR     SP, StackSvc
; /* 设置中断模式堆栈 */
        MSR     CPSR_c, #(Mode_IRQ | I_BIT | F_BIT)  ; 0xd2
        LDR     SP, StackIrq
; /* 设置快速中断模式堆栈 */
        MSR     CPSR_c, #(Mode_FIQ | I_BIT | F_BIT)  ; 0xd1
        LDR     SP, StackFiq
; /* 设置中止模式堆栈 */
        MSR     CPSR_c, #(Mode_ABT | I_BIT | F_BIT)  ; 0xd7
        LDR     SP, StackAbt
; /* 设置未定义模式堆栈 */
        MSR     CPSR_c, #(Mode_UND | I_BIT | F_BIT)  ; 0xdb
        LDR     SP, StackUnd
; /* 设置系统模式堆栈 */
        MSR     CPSR_c, #(Mode_SYS | I_BIT | F_BIT)  ; 0xdf
        LDR     SP, StackUsr

        MOV     PC, R0

StackUsr           DCD     UsrStackSpace + (USR_STACK_LEGTH - 1) * 4
StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4

; /* 分配堆栈空间 */
        AREA    MyStacks, DATA, NOINIT, ALIGN=2
UsrStackSpace      SPACE   USR_STACK_LEGTH * 4  ;用户(系统)模式堆栈空间
SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;管理模式堆栈空间
IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;中断模式堆栈空间
FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;快速中断模式堆栈空间
AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  ;中止义模式堆栈空间
UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;未定义模式堆栈

===============================

以管理模式堆栈空间为例说明一下:

SVC_STACK_LEGTH 定义为 16 ,分配结果为:分配16个4字节的存储空间,把该存储空间初始化为0,并且把SP指向堆栈底部(内存高位)。

ARM初始化Stack - 路雷米 - 路雷米的博客
 

 

从上面memory的内容上面可以看出。管理模式堆栈分配了从0x00008080~0x00008044 一共16*4字节空间。其中0x00008040地址存储器上放置的是0x00008080,也就是该堆栈底部的指针的值。

就是说,StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4 这条32位的伪指令,经过编译后,是在0x00008040(StackSvc)地址上放置SvcStackSpace地址值(0x00008080)。也就是把0x00008080赋给了SP了。

再看看地址0x00008080~0x00008044 上的内容,全部是andeq   r0,r0,r0。

从汇编指令格式来翻译,andeq  r0,r0,r0翻译成16禁止代码后,刚好是0x00000000。从而达到堆栈空间清0的目的。

关键字:ARM  初始化  Stack 引用地址:ARM初始化Stack

上一篇:基于ARM的硬件启动程序设计-分配中断向量表
下一篇:对ARM TrustZone的理解

推荐阅读最新更新时间:2024-03-16 15:01

ARM中断嵌套寄存器NVIC使用说明
在ARM9系列中,针对某种具体的芯片如stm23f103zet6,可以将其看做contex-M3和外设的集成。针对于某种具体的功能(计数器、spi等)要同时对该功能下内核的状态和外设的状态进行设定。在ARM9中,中断与内核紧密联系,要实现某一外设的中断功能就必须对内部控制系统(NVIC)进行设定。 转自:秦工的博客 http://www.arm32.com/post/304.html 1)NVIC是CortexM3内核的标准组件,其实很简单。与其类似的还有MPU,SYSTick,调试/Trace等模块(如果芯片集成了)。NVIC即是Nested Vectored Interrupt Controller,即是中断嵌套向量控制器
[单片机]
ARM7 LPC2378 远程升级----ISP与IAP
最近本人在学习ARM7的远程升级,在这里将自己的学习过程与大家分享,有错误的地方还请大家指出便于改正! ISP(In-System Programming)即“在系统可编程”,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。 IAP(In-Application Programming) 即MCU可以在系统中获取新代码并对自己重新编程,即可用程序来改变程序。ISP和IAP技术是未来仪器仪表的发展方向。 ISP和IAP的工作原理 ISP的实现相对要简单一些,一般通用做法是内部的存储器可以由上位机的软件通过串口来进行改写。对于单
[单片机]
<font color='red'>ARM</font>7 LPC2378 远程升级----ISP与IAP
基于PROTEUS技术的ARM7显示系统设计与仿真实现
0 引言     随着科技的发展,ARM在社会各个方面的应用越来越广。ARM芯片广泛应用于无线产品、PDA、GPS、网络、消费电子产品、STB及智能卡。LPC2138是Philips公司生产的基于ARM7TDMI的RISC微处理器,主频可达50MHz。液晶显示是嵌入式系统中反映系统输入/输出的人机交互界面,液晶显示以其微功耗、体积小、显示内容丰富、模块化,接口电路简单等诸多优点得到广泛应用。本文在介绍以HD44780为控制器的LM 016L液晶模块的引脚结构、功能的基础上,搭建LM016L与LPC2138芯片的硬件接口电路、用c语言编写显示程序,采用Proteus软件进行功能仿真。 1 液晶模块结构及功能简介     LM016
[单片机]
arm-linux-gcc/ld/objcopy/objdump使用总结
arm-linux工具的功能如下: arm-linux-addr2line 把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。 arm-linux-ar 建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。 arm-linux-c++flit 连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。 arm-linux-gprof 显示程序调用段的各种数据。 arm-linux-ld 是连接器,它把一些目标和归档文件结合在一起,重定位数据,并连接符号引用。通常,建立一个新编
[单片机]
ARM Linux中断机制之中断处理
//现在来看看中断初始化的另一个函数early_trap_init(),该函数在文件arch/arm/kernel/traps.c中实现。 void __init early_trap_init(void) { //CONFIG_VECTORS_BASE在autoconf.h中定义(该文件自动成生),值为0xffff0000, unsigned long vectors = CONFIG_VECTORS_BASE; extern char __stubs_start , __stubs_end ; extern char __vectors_start , __vectors_end ; extern char __ku
[单片机]
业界盛赞ARM Mali 第二代T600处理器
2012年8月6日,中国上海——ARM今日宣布推出第二代ARM® Mali™-T600 图形处理器(GPU)系列产品,将为平板电脑、智能手机和智能电视提供非凡的用户体验。第二代ARM Mali-T600 GPU 全线产品不仅性能提升50%,而且是首次加入全调适纹理压缩技术(Adaptive Scalable Texture Compression,ASTC)的GPU系列产品。ASTC是源自ARM的纹理压缩技术,能显著地优化GPU性能和提升终端设备的电池续航能力,带来“永远连线、持续运作(always-on, always connected)”的体验。这项技术已被业界致力于开放标准发展的重要协会—Khronos™ 集团所采用。
[嵌入式]
ARM存储格式之 大端小端
开头讲个有关大端小端的故事:   端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业Big Endian和Little Endian也几乎引起一场战争。     我们知道在内存中数据是以字节为单位进行存储的,每个地址单元对应着一个字节(byte),一个字节为8位(bite)。但是很多时候数据除了8bit额char外
[单片机]
英特尔进军 Arm 芯片领域,并追赶台积电提高代工市场份额
2 月 27 日消息,近日在接受 Tom's Hardware 采访时,英特尔代工负责人斯图尔特・潘(Stu Pann)表示将会进军 Arm 芯片,并不断追赶台积电的代工市场份额。 代工愿景 英特尔希望在 2030 年成为全球第二代代工厂,并希望能成为一家有弹性的代工厂,能够缓解地缘政治、战争冲突等各种问题导致的供应链中断问题。 英特尔会重新平衡其半导体业务,计划产业链的 50% 布局放在美洲 / 欧洲、50% 放在亚洲。 加强和 Arm 合作 Arm 首席执行官雷内・哈斯(Rene Hass)通过远程连接的方式出席 IFS 活动,表示世界似乎正在摆脱独占硬件的想法,转而希望为微软或 Faraday 这样的大公司打造最
[半导体设计/制造]
英特尔进军 <font color='red'>Arm</font> 芯片领域,并追赶台积电提高代工市场份额
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved