IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> ARM启动过程实验调试 -> 正文阅读

[嵌入式]ARM启动过程实验调试

				ARM启动过程实验调试

一.前述概要
1.ARM的含义
首先指的是一家公司,全球领先的半导体知识产权(IP)提供商,ARM设计了大量高性价比、耗能低的RISC处理器、相关技术及软件。
其次,ARM指的也是一门技术,具有性能高、成本低和能耗省的特点。在智能机、平板电脑、嵌入控制、多媒体数字等处理器领域拥有主导地位;另外,ARM还是一类微型处理器的统称,其微型处理器包含多个系列,每个系列各自的特点和应用领域。

2.ARM芯片
任何一款ARM芯片主要由两大部分组成:ARM内核 ,外设 。
ARM内核: ARM内核主要由:寄存器 、指令集 、总线 、存储器映射规则 、中断逻辑 和调试组件等。
ARM外设: 包括计时器、A/D转换器、存储器、I2C、UART、SPI、ROM等等。

3.ARM的启动
目前大多基于ARM芯片的系统都是一个比较复杂的片上系统,多数硬件模块都是可配置的,可以通过软件来设置其需要的工作状态。因此在运行用户的应用程序之前,需要由专门的一段代码来完成对系统的初始化。这一段代码就称为启动程序。由于这类代码直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。在ARM系统上电复位后,需要设置中断向量表、初始化各模式堆栈、设置系统时钟频率等,需要用ARM的汇编语言编写启动代码,由启动代码完成系统初始化以及跳转到用户C程序。在ARM设计开发中,启动代码的编写是一个极重要的过程。

4.ARM 启动代码
包含以下部分:向量表定义、地址重映射及中断向量表的转移、初始化存储器系统、堆栈初始化、设置系统时钟频率、中断寄存器的初始化、初始化用户程序执行环境、改变处理器模式、初始化C语言所需要的存储器空间、进入C应用程序。

二.ARM启动过程调试
1.ARM启动代码分析
在这里插入图片描述

							 图一

(1)进行栈的配置

首先声明N=10,且为一个常量 ---- N EQU 10;

Stack_Size EQU 0x00000400 定义了栈空间的大小
接下来AREA MyStack,NOINIT,READWRITE,ALIGN=3 声明栈段即定义了栈,可初始为0,8字节对齐

Stack_Mem SPACE Stack_Size 分配内存空间,分配0x400个连续字节,并予其初始化为0

__initial_sp 汇编代码地址标号

(2) 异常/中断向量表
AREA Reset,DATA,READONLY 声明Reset 数据段
__Vectors DCD __initial_sp 设置栈顶地址,给__initial_sp分配4字节32位的地址0x0
DCD Reset_Handler “复位”异常处理代码的起始地址
AREA Init, CODE, READONLY 声明代码段

(3)THUMB 表示下面的代码均采用32位Thumb指令

PRESERVE8 指表示接下来的代码保持8字节栈对齐

(4)复位、异常处理代码
Reset_Handler 初始化寄存器
LDR r0, =N 初始化循环计数值
MOV r1, #0 初始化计算结果

2.ARM启动过程分析
(1)异常/中断向量表声明确定
中断向量是中断源的识别标志,可用来形成相应的中断服务程序的 入口地址或存放中断服务程序的首地址。中断类型号×4=存放中断向量 的首地址, 有了存放中断向量的首地址,从该地址开始的4个存储单元 中取出的就是中断服务程序的入口,中断向量中存放的可执行代码。

(2)地址重映射及中断向量表的转移

在系统复位之后,ARM将从地址0处开始执行指令,因此地址0x0处必须是ROM之类的在掉电之后数据不会天失的存储介质,而且存放的必须是可执行的指令。
在ARM的体系结构中,异常和中断的入口地址(即中断向最表),位 于存储介质的0x0-0x20的区域,每当有异常或者中断发生的时候,ARM 将会跳转到该区域内的某个地址,去执行异常处理程序。
这样,按照前面的讲述,异常处理的中断向量表将存放在ROM内。这会带来两个问题,一是中断向量表在程序运行时无法动态地改变,降低了系统的灵活性:二是ROM相对RAM来说,在速度和数据宽度等性能上目前还存在不小的差距。因此,ARM提供了Remap (地址重映射)机制来解决这一矛盾。
remap机制是这样的:在复位初期,0x0地址映射到ROM所在的存 储空园。保障系统的正常运行,在系统启动完毕并且在执行
某些初始化操作之后,RAM执行一条remap命令,将0x0地址映射到RAM 所在的存储区,并将中断向量表复制到此时的0x0-0x20地址范围内,即 0x0 地址在程序加载时位与ROM内,而在程序运行时处于RAM内。这 样既能保证程序的正确加载,又能够以更高的速度响应异常事件,并且 允许中断向量表的动态改变。

(3)初始化存储器系统
通常Flash和SRAM同属于静态存储器类型,可以合用同一个存储器端口;而DRAM因为有动态刷新和地址线复用等特性,通常配有专用的存储器端口。
代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区(SRAM)始终从地址0x2000 0000开始(通过系统总线访问)。
根据选定的启动模式,主闪存存储器、系统存储器或SRAM可以按照以下方式访问:
从主闪存存储器启动:主闪存存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(0x0800 0000)访问它,即闪存存储器的内容可以在两个地址区域访问, 0x00000000或0x0800 0000。
从系统存储器启动:系统存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(互联型产品原有地址为0x1FFF B000,其它产品原有地址为0x1FFF F000)访问它。
从内置SRAM启动:只能在0x2000 0000开始的地址区访问SRAM。

(4)堆栈初始化
堆栈是一个按照后进先出原则组织的一个存储区域,任何处理器都会采用堆栈机制来临时存放数据、变量。堆栈的作用:临时存储寄存器中的数据;
用于向函数或子程序中传递参数;用于存储局部变量;当中断等异常产生时 用于保存处理器状态和寄存器数值。
启动代码中各模式堆栈空间的设置是为中断处理和程序跳转时服务的。当系统响应中断或程序跳转时,需要将当前处理器的状态和部分重要参数保存在一段存储空间中,所以对每个模式都要进行堆栈初始化工作,给每个模式的SP定义一个堆栈基地址和堆栈的容量。
由于ARM微处理器有7中运行模式,每一种模式的堆栈指针(SP)都是独立的(其中系统模式和用户模式使用相同的SP)。因此,需要对每一种模式的SP进行初始化。 采用的方法是:改变当前程序状态寄存器(CPSR)内的状态位,使处理器切换到不同的状态,然后初始化SP。但是对用户模式下SP的初始化应该放在最后,因为ARM微处理器进入用户模式之后就无法再切换到其他模式。

(5)设置系统时钟频率
在ARM中要有一个统一的时钟信号,在这个时钟下,各个部件才能有条不紊,按部就班的运行,这个时钟有两种来源,一种是内部晶振,这种晶振频率固定,不利于各个部件的需要,因为不同部件需要的频率可能不相同;另一种是通过外部晶振,这种晶振可以通过锁相环PLL进行控制,在MPLL的控制下,可以分出三种时钟频率,FCLK给CPU,HCLK给高速外设,PCLK给低速外设,在UPLL的控制下,可以得到USB的时钟为UCLK.

(6)中断寄存器的初始化

ARM中断寄存器主要包括:
 中断模式寄存器可以设置2个中断源为IRQ或FIQ方式。
 中断挂起寄存器,当有中断请求产生时,相应的位会被硬件置1,处于挂起状态。当进入中断处理程序时,必须通过软件清除这个标志位,以标志响应中断请求。
 中断屏蔽寄存器,当需要屏蔽某些中断源时,可以设置相对应的位。
 中断优先级寄存器可以设置21个中断源优先级的高低。
 中断偏移寄存器,中断响应时通过读这个寄存器可以查到当前的中断源。
执行操作时,首先先设置按键KEY0,KEY1…位中断模式,EINT0-3就只有在INTMSK寄存器里面使能一下,EINT(x>=4)叫做额外的外部中断,还要在EINTMSK特殊寄存器里面使能一下。然后配置按键的优先级,在PRIORITY寄存器里面设置,现在按键初始化完成了。然后写中断函数: INTOFFSET寄存器;读INTOFFSET寄存器来判断哪一个设备在执行中断
在这里插入图片描述
图二
(7)初始化用户程序执行环境
ARM中的各种源文件(包括汇编文件,C语言程序及C++程序等)经过ARM编译器编译后生成ELF格式的目标文件。这些目标文件和相应的C/C++运行时用到的库经过ARM连接器处理后,生成ELF格式的映像文件(image),这种ELF格式的映像文件是一种可执行文件,可被写入嵌入式设备的ROM中。ARM映像文件的组成:ARM映像文件是一个层次性结构的文件,包括了域(region),输出段(output section)和输入段(input section)。
输入的代码,一般有代码部分和数据部分,这就是所谓的输入段,每个输入段都有相应的属性,可以为只读(ro),可读写的(rw)以及初始化成0的(zi)。ARM连接器根据各输入段的属性将这些输入段分组,再组成对应属性的输出段。对于加载域中的输出段,一般来说ro段后面紧跟着rw段,rw段后面紧跟着zi段。在运行域中这些输出段并不连续,但rw和zi一定是连着的。zi段和rw段中的数据其实可以是rw属性。
ARM映像文件一开始总是存储在ROM/Flash里面的,其RO部分既可以在ROM/Flash里面执行,也可以转移到速度更快的RAM中执行;而RW和ZI这两部分是必须转移到可写的RAM里去,其实RW包括ZI区域,ZI区域放的是未赋值的全局变量,RW 区域放的是已赋值(赋0除外)的全局变量。所谓应用程序执行环境的初始化,就是完成必要的从ROM到RAM的数据传输和内容清零。

(8)改变处理器模式
 如果系统应用程序是运行在用户模式下,可在此处将系统改为用户模式并初始化用户的堆栈指针。

(9)初始化C语言所需要的存储器空间
为正确运行应用程序,在初始化期间应将系统需要读写的数据和变量从只读存储器拷贝到随机存取存储器里;一些要求快速响应的程序,如中断处理程序,也需要在随机存取存储器中运行; 如果使用FLASH,对FALSH的擦除和写入也一定要在随机存取存储器里运行。ARM公司软件开发工具包中的链接器提供了分布装载的功能,可以实现这一目的。

(10)进入C应用程序
ARM有两种指令集:16位的Thumb指令集和32位的指令集。使用16位的存储器可以降低成本,在这种情况下,Thumb指令集的整体执行速度要比ARM32位指令集体,并且提高了代码密度,所以一般用Thumb 编译器将C语言 程序编译成16位代码。
处理器在一开始总是处于ARM状态,可使用BX指令转换到Thumb状态(IMPORT)呼唤C语言程序,要注意的是用C语言编写的嵌入式程序时,要避免使用不能被固化到ROM的库函数。

综上所述:我们完成了ARM启动的过程,接下来执行代码即可。例如
在这里插入图片描述

图三

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-23 11:00:36  更:2022-04-23 11:01:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:39:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码