历史上的今天
返回首页

历史上的今天

今天是:2025年04月04日(星期五)

2020年04月04日 | 【ARM】微处理器工作模式

2020-04-04 来源:eefocus

收获

SPACE 和 DCD 的区别在于:


SPACE 申请一片内存空间(以字节为单位申请),但不赋初值


DCD 申请一个字(32bit)的内存空间,并赋初值


对于 32 位的 ARM,一个字为 32 bit = 4 Byte


代码中的


UsrStackSpace   SPACE   USR_STACK_LEGTH*4


这里的 ∗4*4∗4 就是由于 SPACE 是以字节为单位分配空间,而我们需要的是以字为单位的堆栈空间


对于代码中的


StackUsr    DCD    UsrStackSpace+(USR_STACK_LEGTH-1)*4


可以这样理解: UsrStackSpace 是标号,相当于地址,实际上就是在 UsrStackSpace SPACE USR_STACK_LEGTH*4 这个语句给分配的空间的首地址,UsrStackSpace+(USR_STACK_LEGTH-1)*4是这个地址空间的结束地址,将 StackUsr 指向这个地址,作为栈顶


每种模式堆栈位置

在这里插入图片描述

代码

;ARM 微控制器工作模式实验的参考程序如下:

;定义堆栈的大小

USR_STACK_LEGTH    EQU  64 ; 定义用户模式堆栈长度为 64 字

SVC_STACK_LEGTH    EQU   0

FIQ_STACK_LEGTH    EQU  16

IRQ_STACK_LEGTH    EQU  64

ABT_STACK_LEGTH    EQU   0

UND_STACK_LEGTH    EQU   0


        AREA Example3,CODE,READONLY ;声明代码段Example3

        ENTRY ;标识程序入口

        CODE32 ;声明32 位ARM 指令

START   MOV R0,#0

        MOV R1,#1

        MOV R2,#2

        MOV R3,#3

        MOV R4,#4

        MOV R5,#5

        MOV R6,#6

        MOV R7,#7

        MOV R8,#8

        MOV R9,#9

        MOV R10,#10

        MOV R11,#11

        MOV R12,#12


        BL InitStack                ;初始化各模式下的堆栈指针

        ;打开IRQ 中断(将CPSR 寄存器的1 位清零)

        MRS  R0,CPSR            ;R0 <-CPSR

        BIC   R0,R0,#0X80 ; 1000 0000  I 置 0,打开 IRQ 中断

        MSR  CPSR_cxsf,R0       ;CPSR <-R0


        ;切换到用户模式

        MSR CPSR_c,#0xd0

        MRS R0,CPSR


        ;切换到管理模式

        MSR CPSR_c,#0xd3 ; 不能成功切换到管理模式,因为不能从用户模式直接切换到其他模式,可以使用 SWI 指令切换到管理模式

        MRS R0,CPSR


HALT    B    HALT


;名称:InitStack

;功能:堆栈初始化,即初始化各模式下下的堆栈指针。

;入口参数:无

;出口参数:无

;说明:在特权模式下调用此子程序,比如复位后的管理模式

InitStack

        MOV R0,LR                ;R0 <-LR ,因为各种模式下R0 是相同的

        ;设置管理模式堆栈

        MSR CPSR_c,#0xd3

        LDR SP,StackSvc

        ;设置中断模式堆栈

        MSR CPSR_c,#0xd2

        LDR SP,StackIrq


        ;设置快速中断模式堆栈

        MSR CPSR_c,#0xd1

        LDR SP,StackFiq


        ;设置中止模式堆栈

        MSR CPSR_c,#0xd7

        LDR SP,StackAbt


        ;设置为定义模式堆栈

        MSR CPSR_c,#0xdb

        LDR SP,StackUnd


        ;设置系统模式堆栈

        MSR CPSR_c,#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    UndStackSpace+(UND_STACK_LEGTH-1)*4


;分配堆栈空间

AREA   MyStacks,  DATA, NOINIT, ALIGN=2

UsrStackSpace   SPACE   USR_STACK_LEGTH*4 ; 为用户模式分配一个64字的堆栈空间

SvcStackSpace   SPACE   SVC_STACK_LEGTH*4

IrqStackSpace   SPACE   IRQ_STACK_LEGTH*4

FiqStackSpace   SPACE   FIQ_STACK_LEGTH*4

AbtStackSpace   SPACE   ABT_STACK_LEGTH*4

UndStackSpace   SPACE   UND_STACK_LEGTH*4

推荐阅读

史海拾趣

CML Microcircuits公司的发展小趣事

在竞争激烈的电子行业中,CML Microcircuits公司始终坚持质量与服务并重的经营理念。公司注重产品的可靠性和稳定性,通过严格的质量控制和测试流程确保产品的高品质。同时,CML还为客户提供全面的技术支持和售后服务,帮助客户解决在使用过程中遇到的问题。这种以客户为中心的服务理念赢得了客户的信任和忠诚,也为CML赢得了良好的口碑。

ADI Electronics Inc公司的发展小趣事

随着技术的不断进步,ADI开始逐步拓展其产品线,从最初的运算放大器逐步扩展到信号处理、数据转换等多个领域。这些技术突破不仅巩固了ADI在电子行业的地位,也为其带来了更多的商业机会。同时,ADI始终保持着对新技术的高度关注,不断投入研发,确保公司在激烈的市场竞争中保持领先地位。

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

作为一家有远见的企业,迪一电子公司始终关注社会责任和可持续发展。公司积极参与环保和公益活动,推动绿色生产和可持续发展。同时,公司还注重员工培训和福利保障,为员工提供良好的工作环境和发展机会。这些举措不仅提升了公司的社会形象,也增强了员工的归属感和凝聚力。

Floeth Electronic Ltd公司的发展小趣事

随着市场的不断变化和技术的快速发展,迪一电子公司意识到必须不断创新才能保持竞争力。于是,公司加大研发投入,引进高端技术人才,与国内外知名科研机构合作,成功研发出一系列具有竞争力的新产品。这些新产品不仅提高了公司的市场占有率,还为公司赢得了良好的口碑。

Everspin公司的发展小趣事

尽管Everspin在初期经历了亏损,但随着时间的推移,其财务状况逐渐改善。特别是在XXXX年和XXXX年,Everspin的总收入和净利润均实现了显著增长。这一财务表现证明了Everspin在MRAM领域的领先地位和持续盈利能力。

FILTRAN公司的发展小趣事

Everspin与众多知名企业和机构建立了合作伙伴关系,如戴尔电脑、Koyo Electronics Industries等。这些合作伙伴的认可和支持不仅为Everspin带来了更多的商业机会,也进一步提升了其在行业中的影响力。同时,Everspin还积极与客户沟通合作,根据客户需求提供定制化的解决方案,赢得了客户的广泛赞誉。

问答坊 | AI 解惑

什么是触摸屏

所谓触摸屏,从市场概念来讲,就是一种人人都会使用的计算机输入设备,或者说是人人都会使用的与计算机沟通的设备。不用学习,人人都会使用,是触摸屏最大的魔力,这一点无论是键盘还是鼠标,都无法与其相比。 从技术原理角度讲,触摸屏是一套透明 ...…

查看全部问答>

怎样用LM358做三角波的跟随电路啊?

怎样用LM358做三角波的跟随电路啊? 三角波用来驱动多个 光纤F-P 可调滤波器︱FFP-TF2 ,怎样接才能接多个FFP?要做什么处理啊? 知道的指定下咯,救急呀!QQ:297164133…

查看全部问答>

散分,顺便咨询一下,我怎么才能用帖子中删除这个功能???

请教各位老鸟:     发帖子,和跟贴下面都有“修改”、“删除”、“举报”、“引用”、“回复”功能 请问我怎么才能用删除这个特权功能??? 谢谢各位!在此散分!…

查看全部问答>

windows embedded standard ctp1

由于工作的需要,我想通过image configuration editor 这个工具来设计一个第三方应用程序template,它说提供的帮助残缺不全,不知道该如何去设计这个模板,这里有Windows embedded 高手吗?能帮忙下吗?能列出详细的设计步骤最好能举出个案例,或提 ...…

查看全部问答>

三星s3c6410的BSP中提供SPI总线的驱动,可是为什么没编译进内核呢?

rt    如果想自己手动把spi总线的驱动加入内核,改怎么做呢? 谢谢!…

查看全部问答>

如何修改按钮背景色, 对话框。VC++

普通按钮控件。 我要实现的是通过按钮1,修改按钮2的背景色。如何实现。…

查看全部问答>

EVC下支持汉字的问题?

我在EVC下建立一个MFC单文档的应用程序,我想在菜单项上写上汉字,可是应用程序执行缺显示乱码,我查看建立工程前选择语言栏那项,发现没有选择中文这项,请问怎样才能在菜单项上显示中文呢?是否需要下载支持中文的补丁呢?…

查看全部问答>

按键和LED灯怎么复用IO管脚

请教一个问题  本人刚毕业 从事小家电的PCB设计 现在经理突然给俺一个压力锅的项目 有9个按键 9个共阳的LED 一个共阳的数码管 16个脚的 我把真值表发上来  用一个20个管脚的单片机驱动(贴片的) 有一个加热盘 一个门控 ...…

查看全部问答>

关于STM32F100远程升级

如题,操作如下:板子上有一块片外FLASH,通过串口把程序代码发到单片机烧入片外FLASH,然后单片机自动重启,把片外FLASH的程序更新到单片机上。应该怎么实现?…

查看全部问答>