没有合适的资源?快使用搜索试试~ 我知道了~
首页基于ARM 的嵌入式系统程序开发
基于ARM 的嵌入式系统程序开发
需积分: 9 14 下载量 75 浏览量
更新于2023-03-03
评论
收藏 710KB PDF 举报
对ARM上的裸机程序开发进行了详细陈述,包括启动的中断向量的设置、存储器配置、堆栈初始化、应用程序环境的拷贝准备、主程序的调用等以及ARM和Thumb代码的交互、重映射的处理,分析精妙
资源详情
资源评论
资源推荐
- 1 -
基于ARM 的嵌入式系统程序开发要点
整理: sailing sailing_9806@163.com
原作者:ARM-CHINA-040415A http://www.arm.com
(一)嵌入式程序开发过程...........................................................................................................1
1.嵌入式程序开发过程.........................................................................................................1
2.开发工具环境里面的库函数.............................................................................................2
2.1 裁剪访问静态数据的函数.....................................................................................3
2.2 裁减访问目标存储器的函数.................................................................................3
2.3 裁剪使用semihosting(半主机)机制实现的函数 ...........................................4
3.Semihosting (半主机) 机制 ...............................................................................................5
(二)系统的初始化过程...............................................................................................................6
1.中断向量表.........................................................................................................................6
2.初始化存储器系统.............................................................................................................7
2.1.存储器类型和时序配置.......................................................................................7
2.2.存储器地址分布(memory map).......................................................................7
3.初始化堆栈.........................................................................................................................8
4.初始化有特殊要求的端口、设备.....................................................................................9
5.初始化应用程序执行环境.................................................................................................9
6.改变处理器模式...............................................................................................................10
7.呼叫主应用程序...............................................................................................................11
(三)如何满足嵌入式系统的灵活需求?.................................................................................12
1.ARM 还是Thumb? ........................................................................................................12
2.堆栈的分配.......................................................................................................................14
3.ROM 还是RAM 在 0 地址处?...................................................................................14
4.存储器地址重映射(memory remap)...........................................................................15
5. 根据目标存储器系统分散加载映像(scatterloading)..................................................17
(四)异常处理机制的设计.........................................................................................................18
1.异常响应流程...................................................................................................................19
1.1 跳转范围...............................................................................................................19
1.2 异常分支...............................................................................................................20
2.异常处理函数的设计.......................................................................................................22
2.1 异常发生时处理器的动作...................................................................................22
2.2 进入异常处理循环后软件的任务.......................................................................23
2.3 异常的返回...........................................................................................................23
2.4 ARM 编译器对异常处理函数编写的扩展...........................................................24
2. 5 软件中断处理.......................................................................................................24
3.可重入中断设计...............................................................................................................25
(五) ARM/Thumb 的交互工作...............................................................................................27
1. 需要交互的原因.............................................................................................................27
2. 状态切换的实现.............................................................................................................27
3. ARM/Thumb 之间的函数调用 .....................................................................................28
4. 交互程序之间的兼容性.................................................................................................30
1
- 2 -
5. V5 架构的扩展..............................................................................................................30
6. Thumb-2..........................................................................................................................30
(六)开发高效程序的技巧.........................................................................................................31
1. 变量定义.........................................................................................................................31
2. 参数传递.........................................................................................................................33
3. 循环条件.........................................................................................................................33
4. 条件执行.........................................................................................................................34
5. 混合编程.........................................................................................................................35
6. 性能分析.........................................................................................................................36
7. 小结.................................................................................................................................36
【序】 毕业在即,以前做的 ARM 和 uC/OS 的项目也忘的差不多了,近日将以前的项目温
习了下,对 ARM 程序开发的启动部分代码及中断程序的编写进行了详细研究。在网上获此
佳作 《基于 ARM 的嵌入式系统程序开发要点》,对 ARM 上的裸机程序开发进行了详细陈
述,包括启动的中断向量的设置、存储器配置、堆栈初始化、应用程序环境的拷贝准备、主
程序的调用等以及 ARM 和 Thumb 代码的交互、重映射的处理,分析精妙,本人觉得把此
文研读透了应付嵌入式 ARM 的面试基本没问题,在此与大家共享。
蓝色部分是本人还有点疑问的,欢迎朋友们指正,谢谢。
sailor_forever
2
- 1 -
基于ARM 的嵌入式系统程序开发要点
(一)嵌入式程序开发过程
ARM®系列微处理器作为全球16/32 位RISC 处理器市场的领先者,在许多
领域内得到了成功的应用。近年来,ARM 在国内的应用也得到了飞速的发展,
越来越多的公司和工程师在基于ARM 的平台上面开发自己的产品。与传统的
8/16位单片机相比,ARM 的性能和处理能力当然是遥遥领先的,但与之相应,
ARM 的系统设计复杂度和难度,较之传统的设计方法也大大提升了。
本文旨在通过讨论系统程序设计中的几个基本方面,来说明基于ARM 的嵌
入式系统程序开发的一些特点,并提出和解决了一些常见的问题。
文章分成几个相对独立的章节刊载。第一部分讨论基于ARM 的嵌入式程序
开发和移植过程中的一些基本概念。
1.嵌入式程序开发过程
不同于通用计算机和工作站上的软件开发工程,一个嵌入式程序的开发过程
具有很多特点和不确定性。其中最重要的一点是软件跟硬件的紧密耦合特性。
图-1:两类不同的嵌入式系统结构模型
这是两类简化的嵌入式系统层次结构图。由于嵌入式系统的灵活性和多样
性,上面图中各个层次之间缺乏统一的标准,几乎每一个独立的系统都不一样。
这样就给上层的软件设计人员带来了极大地困难。第一,在软件设计过程中过多
地考虑硬件,给开发和调试都带来了很多不便;第二,如果所有的软件工作都需
要在硬件平台就绪之后进行,自然就延长了整个的系统开发周期(可以先规划好
BSP或API,着手上次应用程序的开发,交给底层驱动人员按照规范编写API)。
这些都是应该从方法上加以改进和避免的问题。
为了解决这个问题,工程和设计人员提出了许多对策。首先在应用与驱动(或
API)这一层接口,可以设计成相对统一的一些接口函数,这对于具体的某一个
开发平台或在某个公司内部,是完全做得到的。这样一来,就大大提高了应用层
软件设计的标准化程度,方便了应用程序在跨平台之间的复用和移植。
对于驱动/硬件抽象这一层,因为直接驱动硬件,其标准化变得非常困难甚至
不太可能。但是为了简化程序的调试和缩短开发周期,我们可以在特定的EDA
工具环境下面进行开发,通过后再进行移植到硬件平台的工作。这样既可以保证
1
- 2 -
程序逻辑设计的正确性,同时使得软件开发可平行甚至超前于硬件开发进程。
我们把脱离于硬件的嵌入式软件开发阶段称之为“PC 软件”的开发,可以
用下面的图来示意一个嵌入式系统程序的开发过程。
图-2:嵌入式系统产品的开发过程
在“PC 软件”开发阶段,可以用软件仿真,即指令集模拟的方法,来对用
户程序进行验证。在ARM 公司的开发工具中,ADS®内嵌的ARMulator 和
RealView® 开发工具中的ISS,都提供了这项功能。在模拟环境下,用户可以设
置ARM 处理器的型号、时钟频率等,同时还可以配置存储器访问接口的时序参
数。程序在模拟环境下运行,不但能够进行程序的运行流程和逻辑测试,还能够
统计系统运行的时钟周期数、存储器访问周期数、处理器运行时的流水线状态(有
效周期、等待周期、连续和非连续访问周期)等信息。这些宝贵的信息是在硬件
调试阶段都无法取得的,对于程序的性能评估非常有价值。
为了更加完整和真实地模拟一个目标系统,ARMulator 和ISS 还提供了一个
开放的API 编程环境。用户可以用标准C 来描述各种各样的硬件模块,连同工
具提供的内核模块一起,组成一个完整的“软”硬件环境。在这个环境下面开发
的软件,可以更大程度地接近最终的目标。
利用这种先进的EDA 工具环境,极大地方便了程序开发人员进行嵌入式开
发的工作。当完成一个“PC 软件”的开发之后,只要进行正确的移植,一个真
正的嵌入式软件就开发成功了。而移植过程是相对比较容易形成一套规范的流程
的,其中三个最重要的方面是:
考虑硬件对库函数的支持
符合目标系统上的存储器资源分布
应用程序运行环境的初始化
2.开发工具环境里面的库函数
如果用户程序里调用了跟目标相关的一些库函数,则在应用前需要裁剪这些
函数以适合在目标上允许的要求。主要需要考虑以下三类函数:
访问静态数据的函数
访问目标存储器的函数
使用semihosting(半主机)机制实现的函数
这里所指的C 库函数,除了ISO C 标准里面定义的函数以外,还包括由编
译工具提供的另外一些扩展函数和编译辅助函数。
2
- 3 -
2.1 裁剪访问静态数据的函数
库函数里面的静态数据,基本上都是在头文件里面加以定义的。比如CTYPE
类库函数,其返回值都是通过预定义好的CTYPE 属性表来获得的。比如,想要
改变isalpha() 函数的缺省判断,则需要修改对应CTYPE 属性表里对字符属性的
定义。
2.2 裁减访问目标存储器的函数
有一类动态内存管理函数,如malloc() 等,其本身是独立于目标系统而运行
的;但是它所使用的存储器空间需要根据目标来确定。所以malloc() 函数本身
并不需要裁剪或移植,但那些设置动态内存区(地址和空间)的函数则是跟目标
系统的存储器分布直接相关的,需要进行移植。例如堆栈的初始化函数
__user_initial_stackheap(),是用来设置堆(heap)和栈(stack)地址的函数,显
然针对每一个具体的目标平台,该函数都需要根据具体的目标存储器资源进行正
确移植。
下面是对示例函数__user_initial_stackheap() 进行移植的一个例子:
__value_in_regs struct __initial_stackheap __user_initial_stackheap(
unsigned R0, unsigned SP, unsigned R2, unsigned SL)
{
struct __initial_stackheap config;
config.heap_base = (unsigned int) 0x11110000;
// config.stack_base = SP; // optional
return config;
}
请注意上面的函数体并不完全遵循标准C的关键字和语法规范,使用了ARM
公司编译器(ADS 或RealView Compilation tool) 里的C 语言扩展特性。关于编译
器特定的C 语言扩展,请参考相关的编译器说明,这里简单介绍函数
__user_initial_stackheap() 的功能,它主要是返回堆和栈的基地址。上面的程序中
只对堆(heap) 的基地址进行了设置(设成了0x11110000),也就是说用户把
0x11110000 开始的存储器地址用作了动态内存分配区(heap 区)。具体地址的
确定是要由用户根据自己的目标系统和应用情况来确定的,至少要满足以下条
件:
0x11110000 开始的地址空间有效且可写(是RAM)
该存储器空间不与其它功能区冲突(比如代码区、数据区、stack 区等)
因为__user_initial_stackheap() 函数的全部执行效果就是返回一些数值,所
以只要符合接口的调用标准,直接用汇编来实现看起来更加直观一些:
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR r0,0x11110000
MOV pc,lr
如果不对这个函数进行移植,编译过程中将使用缺省的设置,这个设置适用
于ARM 公司的Integrator 系列平台。
(注意:ARM 的编译/连接工具链也提供了绕过库函数来设置运行时存储器模型
的方法,即程序里手动配置堆栈,也可在链接脚本里配置,请参阅ARM 公司其
3
剩余37页未读,继续阅读
杨帆_8318
- 粉丝: 880
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0