基于S3C6410的ARM11学习(四) 核心初始化之设置处理器模式

发布者:EternalSunset最新更新时间:2018-12-18 来源: eefocus关键字:S3C6410  ARM11  核心初始化  处理器模式 手机看文章 扫描二维码
随时随地手机看文章

之前已经设置中断向量表了,下面就要进行设置处理器的模式。

对于ARM11,有8种模式,不同的模式,权限是不一样的。在bootloader开发的时候,我们需要将处理器的模式设置为Supervisor模式,即SVC模式。这样,权限就高了,可以访问ARM的所有资源。用户模式的权限是最低的,而且要从用户模式切换到其他模式的话,只能通过异常的方式。


clip_image001


用户模式(User): ARM处理器正常的程序执行状态


快速中断模式(FIQ): 高速数据传输或通道处理


外部中断模式(IRQ): 通用的中断处理


管理模式(Supervisor): 操作系统使用保护模式


数据访问终止模式(Abort): 当数据或指令预取终止时进入该模式


系统模式(System):运行具有特权的操作系统任务。


 这些模式是在CPSR寄存器中设置的。

       

如下是CPSR寄存器。在最低5位设置处理器的模式。

 

clip_image003


以下是5位值对应的模式。

 

  clip_image005

图中表的后面有跟着寄存器,这是代表在这个模式下,可以访问的寄存器。

 

        我们知道ARM11是有16个寄存器,R0-R15。但是,在不同的模式下,这16个寄存器有的不一样的。即每个模式有自己的寄存器。


clip_image007

上图,是各个模式下,寄存器的表。

       

其中R0-R7、R15寄存器和CPSR寄存器,是所有模式都共有的。但是R8-R14就不一样了,有的模式有自己对应的R8-R14寄存器。比如FIQ模式,就有自己的R8-R14,和其他模式的R8-R14不共用。所以这才叫快中断,因为跳转到快中断后,不用备份原来的R8-R14寄存器,因为用的是自己的寄存器。还可以看到,其他模式都是自己的R13寄存器,也就是堆栈寄存器,所以在这些模式下,使用C语言的话,是要重新定义R13的值的。

  

       除了用户模式和系统模式外,其他模式都有SPSR寄存器。这个寄存器就是用来备份跳转模式切换之前那个模式的CPSR的值。这样之前模式的CPSR的值才不会丢失。这样,在切回原模式时,再将SPSR的值给CPSR,就把原模式的CPSR的值也恢复了。因为CPSR的值是很重要的,所以要保证不能丢失。

           

clip_image009

 

        下面,就是代码的编写了。

   

        设置SVC模式,其实就是写CPSR寄存器的后5位。将值设置为5’b10011.

  

         代码也比较简单了:

set_svc:

# set cpu mode is SVC and disbale irq fiq

# cpsr[4:0] = 0b10011

    mrs r0, cpsr

  bic r0, r0, #0x1f

  orr r0, r0, #0xd3

  msr cpsr, r0

  mov pc, lr

先通过mrs指令将CPSR的值读到r0中。

使用bic指令对r0的后5位清零,0x1f = ‘b00011111。

使用orr指令对r0的后8位值设置为’b11010011。后面5位是10011,设置为SVC模式了。前面7位和6位也给设置1了。


clip_image011

从上图,看出7位和6位是普通控制中断和快中断的。

  

clip_image013


从手册中得到,当置1,表示disable对应的中断,这里就是关闭所有中断。

 

这样,就完成了处理器的模式SVC设置。

 

对比STM32,因为没有用汇编写过这些代码,所以没有了解STM32的CPU的模式。如果有对这方面了解的,麻烦告知一下。自己以前写STM32代码的时候,根本就没有考虑过这些。现在学ARM11了,对比才去了解了一些STM32的底层的东西。

 

另外,有谁知道CPSR在上电时候的初始化的值是多少的话,也麻烦告知下。我试了下,不设置处理器的SVC模式,并且不关中断,程序也是可以执行的,后面的点灯也是可以点亮,我猜测的话,默认为芯片上电的时候,处理器是工作在SVC模式下的,并且中断也都是关闭的。


如果是这样的话,那就意味着设置处理器的模式SVC,我们是可以省略这部分代码的,因为默认为就是这样。


但是,这也只是考虑了上电复位的情况,但是如果是复位有效呢?当我们按下复位键的时候,这里的代码还是需要的,因为这个时候,需要将处理器模式转化为SVC,因为有可能程序执行的时候是在User模式下的,这样的话就会有权限的限制,有些地址处理器就访问不了。并且要关闭中断,因为也有可能中断是开启的,不然会跳转到中断去。以上两种情况,复位的代码就不会正常的执行了。所以就需要这两步操作,保证复位的程序是可以正常按照我们写的顺序执行。


所以,我总结,这里的代码是需要的。为什么呢?因为uboot中也有这代码,要是不需要的话,那么uboot中肯定也不会有。Uboot可是行业的老大啊。


关键字:S3C6410  ARM11  核心初始化  处理器模式 引用地址:基于S3C6410的ARM11学习(四) 核心初始化之设置处理器模式

上一篇:ARM+Linux下看门狗应用
下一篇:s3c2410中断跳转过程

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

移动视频监控及定位系统的设计方案
  随着3G/4G移动通信网络和计算机技术的快速发展,移动互联网从很多方面改善了人们传统的生活方式,3G/4G移动网络具有带宽宽、广域广、高安全性等突出特点,能够突破安防行业长距离数字化无线监控一直以来难以简单实现的瓶颈,为无线视频监控开辟了一条新的道路。   本文设计的一种移动视频监控及定位系统,采用S3C6410处理器作为硬件基础,以Mediastream、Live555、VLC开源项目为核心,3G/4G移动通信网络作为网络传输媒介,采用H.264编解码方式实现视频的采集传输播放,并集成GPS模块进行位置数据的采集、传输、显示,实现移动目标的视频监控、定位功能,该系统的前端硬件设备小巧,易于使用。   系统原理   系统
[单片机]
移动视频监控及定位系统的设计方案
深入理解ARM体系架构(S3C6410)---S3C6410存储映射
S3C6410的物理内存分成Memory和Pheriperal两部分,地址范围分别为0x0~0x6fffffff和0x7fffffff~0xffffffff。系统通过 SPINE总线访问Memory空间,通过PERI总线访问Pheriperal空间。而为了适应不同外设的访问速度,又分别通过AHB总线访问LCD、 Camera、Accelerator等高速外设,通过APB总线访问iic、watchdog等低速外设。 Memory: (1)启动镜像区物理地址为0x00000000~0x07ffffff,共128MB,是用来启动系统的。但是这个范围内并没有实际的存储介质与之对应,只能在通过OM 选择具体的启动介质后再把相应
[单片机]
深入理解ARM体系架构(<font color='red'>S3C6410</font>)---<font color='red'>S3C6410</font>存储映射
s3c6410 uboot代码分析
以下用以记录uboot代码的分析过程,目标是s3c6410,如有错误,欢迎指正。 强调,内容与三星原厂提供的uboot-1.1.6有更改的地方,因为外接外设的区别,特别是nand_flash、外接网卡芯片和LCD芯片 以下纯代码情景分析,请结合uboot的功能结构图和内存分布图查看代码,这样会更加容易理解。 s3c-u-boot-1.1.6源代码可以在三星下面的网站获得,但前提是你有官方的email。 还是百度google搜一下吧,当然我这也是有的哦。 http://www.samsung.com/global/business/semiconductor/productInfo.do?fmly_id=835&partnum
[单片机]
<font color='red'>s3c6410</font> uboot代码分析
ARM处理器模式和片内寄存器, ARM 异常及中断
中断和异常的区别: 中断时从外至内的, 异常时由内发出的 一、存储器格式(字对齐): Arm体系结构将存储器看做是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字(32位)数据,从第四个字节到第七个字节放置第二个存储的字数据,一次排列。作为32位的微处理器,arm体系结构所支持的最大寻址空间为4GB。 存储器格式 1、大端格式:高字节在低地址,低字节在高地址; 2、小端格式:高字节在高地址,低字节在低地址; 指令长度: Arm微处理器的指令长度是32位的,也可以为16位(thumb状态下)。Arm微处理器中支持字节(8位),半字(16位),字(32位)三种数据类型,其中,字需要4字
[单片机]
ARM<font color='red'>处理器</font><font color='red'>模式</font>和片内寄存器, ARM 异常及中断
基于S3C6410裸机程序中可能用到的函数分享
裸机程序中可能用到的文件以及函数 #include“system.h” /************************************************************************************************************************* *函数:voidSetEINT_TriggerMode(u8EINT0_N,u8Trigger) *功能:设置外部中断组0触发模式 *参数:EINT0_N:中断源的编号(见:中断组0编号定义);Trigger:触发模式(EXT_LowLevel:低电平触发;EXT_HighLevel:高电平触发; EXT_NegEdg
[单片机]
基于<font color='red'>S3C6410</font>裸机程序中可能用到的函数分享
S3C6410输入子系统按键驱动程序
以前写的驱动程序要另外写一个测试程序,这样的驱动程序就有很大的局限性,只能自己用,为了通用性,别人的应用程序也可以用我的驱动程序就要引入输入子系统。在这个驱动程序里设置了5个按键L, S, ENTER, LEFTSHIFT, ESC.设置这几个按键主要是为了方便测试。以下是驱动程序button_input.c #include linux/module.h #include linux/init.h #include linux/fs.h #include linux/interrupt.h #include linux/irq.h #include linux/sched.h #include linux/pm.h
[单片机]
<font color='red'>S3C6410</font>输入子系统按键驱动程序
S3C6410开发(3)-编译运行第一个流水灯程序
编写程序 由于我们是在纯裸机上编程,没有uboot之类的程序为我们初始化硬件资源,所以我们要编写一个带有初始化功能的汇编文件。同时为了直观地感受到程序的运行,我们在里面添加一个流水灯的小程序。在工作目录新建一个 statup.s 的文件,编写初始化程序并根据电路板原理图配置LED的GPIO的模式和输出电平。 .global _start _start: // 把外设的基地址告诉CPU ldr r0, =0x70000000 // 对于6410来说内存(0x00000000~0x60000000) // 外设(0x70000000-0x7fffffff) orr r0, r0, #0
[单片机]
快速学Arm(9)--处理器的状态,模式以及概括了解内部寄存器
快速学习总是要颠三倒四的来学习内容.最终将所知道的东西联系起来就形成了一种能力. 我了先了解一下处理器状态,模式以及一些芯片内部的寄存器. 芯片内部的寄存器一般要使用汇编语言进行控制,写C语言的程序时,大部分情况下不用去关心这些寄存器是如何工作的,除非你要进行底层的程序设计,这些内容可以在以后随着Arm学习的深而入进行再看也不迟,目前大概的扫几眼也就可以了. Arm2400一般有两种两种指令形式,即ARM指令和Thumb指令两种状态条.ARM是32位的指令而Thumb形式则是16位指令模式.如果大家学过8068汇编和80386汇编,大家是看成PC上的8086和和80386自己的指令关心. Arm处理器除了有两种状态
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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