ARM处理器的工作模式 (二)

发布者:诗意世界最新更新时间:2016-04-19 来源: eefocus关键字:ARM  处理器  工作模式 手机看文章 扫描二维码
随时随地手机看文章
接 ARM处理器的工作模式(一)
实验二 各工作模式下堆栈初始化实验(ARM9)(工程exp9,文件exp9_2_1.s)
本实验实现各工作模式下堆栈初始化,采用ARMmulator方式调试,选用ARM9作为目标处理器。
                AREA INIT_STACK,CODE,READONLY
                    ENTRY               ;工作于管理模式
START              MOV R1,#1           ;初始化R1      
                    BL INITSTACK       ;设置各模式下的堆栈指针
                                        ;回到用户模式下运行应用程序
MRS R1,CPSR        ;保存CPSR于R1
                    BIC R1,R1,#0x80           
                    MSR CPSR_cxsf,R1  
                    MSR CPSR_c,#0xd0
                    MRS R3,CPSR
                    BIC R3,R3,#0x80
                    MSR CPSR_cxsf,R3
                    MSR CPSR_c,#0xdf           ;切换至系统模式
STOP          B STOP
      
INITSTACK                                 ;初始化各种模式下的堆栈指针
                    MOV R0,LR              ;保存LR值8008,以待返回
                    LDR SP,P_SVC_STK       ;初始化堆栈指针SP_SVC&USR=809C
                    MSR CPSR_c,#0xd2       ;1101 0010,切换至外中断模式
                    LDR SP,P_IRQ_STK       ;初始化堆栈指针SP_IRQ=
                    
MSR CPSR_c,#0xd1      ;切换至快中断模式
                    LDR SP,P_FIQ_STK      ;初始化堆栈指针SP_IRQ=
                    STMED SP!,{R0,R1}    ;保护现场 R0,R1(存入相应的堆栈里面)
                    NOP
                  
                   MSR CPSR_c,#0xd7     ;切换到ABT        
                   LDR SP,P_ABT_STK
                   MSR CPSR_c,#0xdb     ;切换到UND
                   LDR SP,P_UND_STK
                   
                   MSR CPSR_c,#0xdf     ;切换到USR
                   LDR SP,P_USR_STK
                   
                   MOV PC,R0           ;返回原程序
                
;定义各个工作模式下的堆栈长度
USR_STK_LEN EQU 4
SVC_STK_LEN EQU 4
IRQ_STK_LEN EQU 4
FIQ_STK_LEN EQU 4
ABT_STK_LEN EQU 4
UND_STK_LEN EQU 4
 
;定义各工作模式下的堆栈指针
P_USR_STK DCDUSR_STK_SPC+(USR_STK_LEN-1)*4
P_SVC_STK DCD SVC_STK_SPC+(SVC_STK_LEN-1)*4
P_IRQ_STK DCD IRQ_STK_SPC+(IRQ_STK_LEN-1)*4
P_FIQ_STK DCD FIQ_STK_SPC+(FIQ_STK_LEN-1)*4
P_ABT_STK DCD ABT_STK_SPC+(ABT_STK_LEN-1)*4
P_UND_STK DCD UND_STK_SPC+(UND_STK_LEN-1)*4
 
;定义各工作模式下的堆栈空间
                    AREA STACKS,DATA,READWRITE
USR_STK_SPC SPACE USR_STK_LEN*4
SVC_STK_SPC SPACE SVC_STK_LEN*4
IRQ_STK_SPC SPACE IRQ_STK_LEN*4
FIQ_STK_SPC SPACE FIQ_STK_LEN*4
ABT_STK_SPC SPACE ABT_STK_LEN*4
UND_STK_SPC SPACE UND_STK_LEN*4
 
                    END
 
 
1.         单步运行程序,列出本实验的指令执行情况表,统计程序设计的相关寄存器以及存储空间上的相关地址,并记录程序运行过程中这些寄存器、存储空间相关地址上的变化情况,同时记录ARM工作模式的变化情况。
2.         根据本实验的执行结果,并结合ARM反汇编表的信息,画出ARM各模式的堆栈空间分配图,标出各模式堆栈的起始地址、堆栈长度以及堆栈指针的位置。
3.         如何实现各种工作模式下的堆栈初始化
序号 执行指令 指令执行后的变化情况
    寄存器&存储空间 工作模式
                       
0                      
1                      
2                      
3                      
4                      
5                      
6                      
7                      
8                      
9                      
10                      
11                      
12                      
13                      
                       
 
 
 
 
START    [0xe3a01001]   mov      r1,#1
00008004       [0xeb000008]   bl       INITSTACK
00008008       [0xe10f1000]   mrs      r1,cpsr
0000800c      [0xe3c11080]   bic      r1,r1,#0x80
00008010       [0xe12ff001]   msr      cpsr_cxsf,r1
00008014       [0xe321f0d0]   msr      cpsr_c,#0xd0
00008018       [0xe10f3000]   mrs      r3,cpsr
0000801c      [0xe3c33080]   bic      r3,r3,#0x80
00008020       [0xe12ff003]   msr      cpsr_cxsf,r3
00008024       [0xe321f0df]   msr      cpsr_c,#0xdf
STOP          [0xeafffffe]         STOP
INITSTACK   [0xe1a0000e]   mov      r0,r14
00008030       [0xe59fd034]   ldr      r13,P_SVC_STK ; = #P_SVC_STK
00008034       [0xe321f0d2]   msr      cpsr_c,#0xd2
00008038       [0xe59fd030]   ldr      r13,P_IRQ_STK ; = #P_IRQ_STK
0000803c           [0xe321f0d1]   msr      cpsr_c,#0xd1
00008040       [0xe59fd02c]   ldr      r13,P_FIQ_STK ; = #P_FIQ_STK
00008044       [0xe82d0003]   stmed    r13!,{r0,r1}
00008048       [0xe1a00000]   nop     
0000804c      [0xe321f0d7]   msr      cpsr_c,#0xd7
00008050       [0xe59fd020]   ldr      r13,P_ABT_STK ; = #P_ABT_STK
00008054       [0xe321f0db]   msr      cpsr_c,#0xdb
00008058       [0xe59fd01c]   ldr      r13,P_UND_STK ; = #P_UND_STK
0000805c      [0xe321f0df]   msr      cpsr_c,#0xdf
00008060       [0xe59fd000]   ldr      r13,P_USR_STK ; = #P_USR_STK
00008064       [0xe1a0f000]   mov      pc,r0
;定义各工作模式下的堆栈指针
P_USR_STK00008068 [0x0000808c]   dcd      0x0000808c  ....
P_SVC_STK0000806C [0x0000809c]   dcd      0x0000809c  ....
P_IRQ_STK00008070  [0x000080ac]   dcd      0x000080ac  ....
P_FIQ_STK00008074  [0x000080bc]   dcd      0x000080bc  ....
P_ABT_STK00008078 [0x000080cc]   dcd      0x000080cc  ....
P_UND_STK0000807C       [0x000080dc]   dcd      0x000080dc  ....
;定义各工作模式下的堆栈空间
USR_STK_SPC00008080    [0x00000000]   dcd      0x00000000  ....
00008084                   [0x00000000]   dcd      0x00000000  ....
00008088                   [0x00000000]   dcd      0x00000000  ....
0000808c                       [0x00000000]   dcd      0x00000000  ....
SVC_STK_SPC00008090   [0x00000000]   dcd      0x00000000  ....
00008094                   [0x00000000]   dcd      0x00000000  ....
00008098                   [0x00000000]   dcd      0x00000000  ....
0000809c                  [0x00000000]   dcd      0x00000000  ....
IRQ_STK_SPC000080a0   [0x00000000]   dcd      0x00000000  ....
000080a4                  [0x00000000]   dcd      0x00000000  ....
000080a8                  [0x00000000]   dcd      0x00000000  ....
000080ac       [0x00000000]   dcd      0x00000000  ....
FIQ_STK_SPC     [0x00000000]   dcd      0x00000000  ....
000080b4       [0x00000000]   dcd      0x00000000  ....
000080b8       [0x00000000]   dcd      0x00000000  ....
000080bc       [0x00000000]   dcd      0x00000000  ....
ABT_STK_SPC    [0x00000000]   dcd      0x00000000  ....
000080c4       [0x00000000]   dcd      0x00000000  ....
000080c8       [0x00000000]   dcd      0x00000000  ....
000080cc [0x00000000]   dcd      0x00000000  ....
UND_STK_SPC   [0x00000000]   dcd      0x00000000  ....
000080d4       [0x00000000]   dcd      0x00000000  ....
000080d8       [0x00000000]   dcd      0x00000000  ....
000080dc       [0x00000000]   dcd      0x00000000  ....
实验思考题:
1.         如果把实验一的程序运行于实际ARM系统中,运行的结果会是怎样?
2.         实验二的程序中,子程序INITSTACK的第一行代码MOV R0,LR的作用是什么?如果删除,对程序的运行会有什么影响?
关键字:ARM  处理器  工作模式 引用地址:ARM处理器的工作模式 (二)

上一篇:ARM处理器的工作模式(一)
下一篇:ARM异常处理程序

推荐阅读最新更新时间:2024-03-16 14:50

英飞凌基于ARM Cortex-M4内核XMC4000微控制器
XMC4000是英飞凌基于ARM Cortex-M4内核的32位微控制器,XMC4000家族将行业标准内核和英飞凌丰富强大的外设集相结合,适用于电机控制、自动化、智能家居、功率转换、医疗设备、工程机械等广泛的领域。 旋转变压器是一种精密的位置、速度检测装置,尤其适用于高温、严寒、潮湿、高速、振动等环境恶劣、旋转编码器无法正常工作的场合。但是,旋转变压器在使用时并不能直接提供角度或位置信息,需要特殊的激励信号和解调、计算措施,才能将旋转变压器信号中包含的位置信息得到。 英飞凌XMC4000家族中、高端系列集成的Delta-Sigma解调器(Delta-Sigma Demodulator, DSD)模块为旋变位置信号的获取带来
[单片机]
英飞凌基于<font color='red'>ARM</font> Cortex-M4内核XMC4000微控制器
ARM 学习笔记七 (PWM试验)
PWM-脉宽调制。我的理解是通过控制一个计数器来实现不同脉宽的输出,从而驱动蜂鸣器发出不同的声音。 本实验用到的寄存器如下: GPBCON -- I/O端口配置寄存器 B 00=Input 01=Output 10=PWM 11=Reserved GPBDAT -- I/O端口数据寄存器 B GPFUP --I/O端口上拉电阻使能寄存器 B 0=Enable 1=Disabled TCFG0 -- 时钟配置寄存器0 (主要是设置预分频) 定时器输入时钟频率=PCLK/{预分频}/{分割值} {预分频}=1~255 {分割值}=2,4,8,16,32 Address
[单片机]
苏黎世跑分能代表处理器的AI性能吗?
随着手机端加入了越来越多的AI运算,AI性能已经成为手机处理器的一大关键性能指标。近期我们注意到,一款测试工具频繁出现在公众视线中:ETH AI-Benchmark,也就是我们常说的苏黎世跑分。一些处理器厂商经常会援引苏黎世跑分的测试数据,用以展现其AI性能的强大。但苏黎世跑分真能代表处理器的AI性能吗?   苏黎世跑分其实和大家所熟知的安兔兔、GeekBench等跑分软件类似,不同的是,苏黎世跑分是专门针对AI性能的一款跑分软件,它通过对象识别、人脸识别、图像去模糊等共9大测试项的测试,根据不同测试项的重要程度不同,匹配不同的权重,最终得出一个表征AI性能的分数。   苏黎世跑分客观吗?   -16位浮点运算占比过大 严重
[手机便携]
苏黎世跑分能代表<font color='red'>处理器</font>的AI性能吗?
创建ARM Linux交叉编译环境实践
一、准备工作 首先需要一台运行Linux操作系统的PC以完成我们的编译工作。 其次要准备如下一些源文件。 1、源文件准备 binutils-2.14.tar.gz ftp://ftp.gnu.org/gnu/binutils/binutils-2.14.tar.gz gcc-core-2.95.3.tar.gz ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-core-2.95.3.tar.gz gcc-g++2.95.3.tar.gz ftp://ftp.gnu.org/gnu/gcc/gcc-2.95
[单片机]
快速学Arm(12)--APB,AHB地址与接口的关系
在快速学Arm(3)中,我画了一个LPC2478的存储空间的分别图,在存储空间最上面的两块,0xE000 0000 ~ 0xEFFF FFFF(APB)和0xF000 0000 ~ 0xFFFF FFFF(AHB)两块地址空间.这两块空间分别是大概250M字节的空间.每个250M空间分成36块,每块大概16K大小. 在LPC2478的文档中,APB的各个设备的寄存器空间是按下面的方式分配的: 有过Arm或者其他单片机开发经验的人对这种地址分配应该不难理解,但对于初学者可能会有点晕.如果大家打算从LPC2478(ARM7TDMI-S的2400系列)开始学起的话,有两个文档是要用来经常查阅的: lpc2478_ds.p
[单片机]
快速学<font color='red'>Arm</font>(12)--APB,AHB地址与接口的关系
ARM+DSP的嵌入式四轴运动控制器设计
运动控制系统已被广泛应用于工业控制领域。近年来,工业控制对运动控制系统的要求越来越高。传统的基于PC及低端微控制器日渐暴露出高成本、高消耗、低可靠等问题,已经不能满足现代制造的要求 。随着嵌入式技术的日益成熟,嵌人式运动控制器已经初露锋芒。基于ARM技术的微处理器具有体积小、低成本、低功耗的特点,决定其在运动控制领域具有良好的发展前景。 PCL6045BL是一种新型专用DSP运动控制芯片,它具有强大的数据处理能力和较高的运行速度,可以实现高精度的多轴伺服控制。为解决精密制造对低成本、可移植性强的通用型多轴数控系统的迫切需求,文中给出一种基于ARM 微处理器S3C2440与DSP专业运动控制芯片PCL6045BL构成的嵌入式四轴运
[嵌入式]
IC集成的困惑:如何把握增减的尺度?
IC就是集成电路的缩写,它的出现,就是要将更多的电路进行集成。不过,随着半导体工艺的演进到65nm、45nm甚至更小节点,在集成更多不同功能的时候,如何把握集成的尺度也是颇为讲究的,集成更多功能并非是唯一的选择,相反,适当的分立策略,反而有助于芯片的推广和应用。 “在工艺尺寸进入到纳米级以前,集成不同功能追求的是越多越好,但是进入纳米级以后,集成的各功能电路之间的干扰越来越多,还有一些ESD问题也越来越多,这是在考虑集成的时候要注意的地方。”上海贝岭股份有限公司高工颜重光指出,“在这个方面,应当学习学习联发科,它们经过大量的研究,了解到手机中一些电路是最核心的,这些电路虽然能集成,但是集成以后可能会有影响,所以它们的BB和RF就
[焦点新闻]
μCOS-II在ARM Cortex-M3处理器上的移植
0 引言 嵌入式系统已经广泛渗透到了人们工作、生活中的各个领域,嵌入式处理器已占分散处理器市场份额的94%,其中ARM的应用最为广泛。基于ARM内核的处理器以其诸多优异性能而成为各类产品中选用较多的处理器之一。 当系统越来越大,应用越来越多时,就出现了如何管理众多的硬件资源,以及如何满足系统的实时控制要求和如何提高系统软件开发效率等不可回避的问题。这时,使用嵌入式操作系统很有必要。操作系统的主要作用有:统一管理系统资源;为用户提供访问硬件的接口;调度多个应用程序和管理文件系统等。 1 概述 μC/OS-II是著名的、源码公开的实时内核,是专为嵌入式应用设计的,可用于各类8位、16位和32位处理器。μC/OS-II已经
[单片机]
μCOS-II在<font color='red'>ARM</font> Cortex-M3<font color='red'>处理器</font>上的移植
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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