5.基于ARM的嵌入式程序设计

上传人:马*** 文档编号:243133337 上传时间:2024-09-16 格式:PPT 页数:58 大小:9.12MB
返回 下载 相关 举报
5.基于ARM的嵌入式程序设计_第1页
第1页 / 共58页
5.基于ARM的嵌入式程序设计_第2页
第2页 / 共58页
5.基于ARM的嵌入式程序设计_第3页
第3页 / 共58页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,嵌入式系统开发与应用,第五章 基于,ARM,的嵌入式程序设计,5.1,两种常见的,ARM,编译开发环境,5.2 ARM,汇编语言程序设计,5.3,嵌入式,C,语言程序设计基础,5.4,嵌入式,C,语言程序设计实例,5.5,嵌入式,C,语言程序设计技巧,5.6 C,与汇编语言混合编程,5.7,基于,Embest,IDE for ARM,环境的软件开发实例,5.1,两种常见的,ARM,编译开发环境,ADS/SDT IDE,开发环境:它由,ARM,公司开发,使用了,CodeWarrior,公司的编译器;,集成了,GNU,开发工具的,IDE,开发环境:它由,GNU,的汇编器,as,、,交叉编译器,gcc,、,和,链接器,ld,等组成。,5.2 ARM,汇编语言程序设计,ARM,汇编中的文件格式,ARM,汇编语言语句格式,ARM,汇编语言编程的重点,ARM,汇编程序实例,5.2.1 ARM,汇编中的文件格式,ARM,源程序文件(可简称为源文件)可以由任意一种文本编辑器来编写程序代码,它一般为文本格式。在,ARM,程序设计中,常用的源文件可简单分为以下几种,:,源程序文件,文件名,说,明,汇编程序文件,*,.S,用,ARM,汇编语言编写的,ARM,程序或,Thumb,程序。,C,程序文件,*,.C,用,C,语言编写的程序代码。,头文件,*,.H,为了简化源程序,把程序中常用到的常量命名、宏定义、数据结构定义等等单独放在一个文件中,一般称为头文件。,5.2.2 ARM,汇编语言语句格式,ARM,汇编语言语句格式如下所示:,symbol,instruction | directive | pseudo-instruction,;,comment,其中:,instruction,为指令。,directive,为伪操作。,pseudo-instruction,为伪指令。,symbol,为符号。,comment,为语句的注释。,ARM,汇编语言程序格式,ARM,汇编语言是以段(,section,),为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。一个,ARM,源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。,举例说明,ARM,汇编语言源程序的基本结构,AREA EXAMPLE,,,CODE,,,READONLY,ENTRY,start,MOV r0,,,#10,MOV r1,,,#3,ADD r0,,,r0,,,r1,END,本程序的程序体部分实现了一个简单的加法运算。,5.2.3,ARM,汇编语言编程的重点,ARM,数据处理操作,设置条件码,汇编语言子程序调用及返回,跳转表思想,ARM,与,Thumb,之间的状态转换及函数的相调用,ARM,数据处理操作,ARM,中数据的处理有以下三种形式:,简单的寄存器操作,立即数操作,寄存器移位操作,设置条件码,ARM,的任何数据处理指令都能通过增加“,S,”,操作码来设置条件码(,N,,,Z,,,C,和,V,)。,条件执行,ARM,指令集不同寻常的特征是每条指令(除了某些,v5T,指令)都可以是条件执行的。,条件转移,在程序中,可以通过条件码的使用让,微处理器决定是否进行转移,还可用来控制循环的退出。,汇编语言子程序调用及返回,子程序的调用,在,ARM,汇编语言中,子程序调用是通过,BL,指令来完成的。,BL,指令的语法格式如下:,BL,subname,其中,,subname,是被调用的子程序的名称。,子程序的返回,在返回调用子程序时,转移链接指令保存到,LR,寄存器(,r14,),中的值需要拷贝回程序寄存器,PC,(,r15,)。,跳转表思想,在程序设计中,有时为使程序完成一定的功能,需要调用一系列子程序中的一个,而决定究竟调用哪一个由程序的计算值确定。跳转表是解决该问题的有效方案。跳转表是利用程序计数器,PC,在通用寄存器文件中的可见性来实现的,如下例所示:,ARM,与,Thumb,间的状态转换及函数的相调用,状态切换的实现,ARM/Thumb,之间的状态切换是通过一条专用的转移交换指令,BX,来实现的。,BX,利用,Rn,寄存器中目的地址值的最后一位来判断跳转后的状态。当最后一位为,0,时,表示转移到,ARM,状态;当最后一位为,1,时,表示转移到,Thumb,状态,如下图所示。,ARM,与,Thumb,间的状态转换及函数的相调用,ARM/Thumb,之间的函数调用,在同一状态下的子程序调用,通常只需要一条指令实现调用:,BL function,实现返回也只需要从,LR,恢复,PC,即可:,MOV PC,,,LR,在不同状态下的子程序调用中,就需要进行状态之间的切换,需要考虑到以下几点:,需要由,BX,来切换状态,因为,BL,不能完成状态切换。,需要在,BX,之前先保存好,LR,,,BX,不能自动保存返回地址到,LR,。,需要,用“,BX LR,”,来返回,不能使用“,MOV PC,,,LR,”,,,返回时要仔细考虑保存在,LR,中最低位的内容是否正确。,5.2.4ARM,汇编程序实例,简单的,ARM,指令程序,数据块复制,利用跳转表实现程序跳转,ADS,编译环境下的汇编代码与,GNU,编译环境下有较多不同点,主要是符号及伪操作的不同。,5.3,嵌入式,C,语言程序设计基础,5.3.1,C,语言“预处理伪指令”在嵌入式程序 设计中的应用,5.3.2,嵌入式程序设计中的函数及函数库,5.3.3,嵌入式程序设计中常用的,C,语言语句,5.3.4,嵌入式程序设计中,C,语言的变量、数 组、结构、联合,5.3.1C,语言,“预处理伪指令”在嵌入式程序设计中的应用,“预处理命令”可以改进程序设计的环境,提高编程效率,一般以,#,号打头 ,可分为以下三种 :,文件包含,宏定义,条件编译,文件包含,文件包含伪指令可将头文件包含到程序中,头文件中定义的内容包括符号常量、复合变量原型、用户定义的变量类型原型和函数的原型说明等。编译器编译预处理时用文件包含的正文内容替换到实际程序中。,文件包含伪指令的格式,#include,;,标准头文件,#include,“,头文件名,.h,”,;,自定义头文件,#include,宏标识符,宏定义,宏定义伪指令分为:简单宏、参数宏、条件宏、预定义宏及宏释放。,简单宏,:,# define,宏标识符 宏体,参数宏:,# define,宏标识符(,形式参数表),宏体,条件宏定义:,#,ifdef,宏标识符,#,ifndef,宏标识符,#,undef,宏标识符,#define,宏标识符,宏体,#define,宏标识符,宏体,#else,#else#,undef,宏标识符,#define,宏标识符,宏体,#define,宏标识符,宏体,#,endif,#endif,条件编译,条件编译伪指令是写给编译器的,指示编译器在满足某一条件时仅编译源文件中与之相应的部分。其格式如右框中所示:,#if,(,条件表达式,1,),#,elif,(,条件表达式,2,),#,elif,(,条件表达式,n,),#else,#,endif,5.3.2,嵌入式程序设计中的函数及函数库,函数是,C,语言程序设计的核心。一个较大的,C,语言程序一般是由一个主函数和若干个子函数组成,每个函数完成一个特定的功能。函数之间也可以相互调用。,函数的格式,:,定义性说明格式 :,存储类说明符,类型说明符 修饰符 标识符 (参数表),函数体,原型说明格式 :,extern,类型说明符,修饰符,标识符(参数表)函数体,嵌入式程序设计中的函数及函数库,函数库是为了减少编程工作量,将一些常用的功能的函数放在函数库中供公共使用。,它包括,C,的标准库函数,也包括一些用户自己编写非标准库。,例如,,44,blib.h,是,根据基于,S3C44B0X,处理器的开发板及其功能模块编写的一个,C,语言函数库。它不属于,C,语言的标准库。,5.3.3,嵌入式程序设计中常用的,C,语言语句,C,语言语句格式为:,标号:,语句,;,C,语言语句很多,,常用到的有以下几种:,条件语句,swith,语句,循环语句,5.3.4,嵌入式程序设计中,C,语言的变量、数组、结构、联合,变量,存储类型,类型说明符,修饰符,标识符,初值, ,,标识符,初值,;,数组,一维数组:,类型说明符,标识符,常量表达式,初值,初值,,;,char,标识符, =“,字符串”;,二维数组:,类型说明符 标识符,mn ,初值表,初值表,;,指针数组和数组指针,类型说明符,*,标志符,常量表达式, =,地址,地址,,;,类型说明符 (*标志符), =,数组标识符,;,嵌入式程序设计中,C,语言的变量、数组、结构、联合,结构说明,存储类说明符,struct,结构原型名,类型说明标识符,,标识符,;,类型说明标识符,,标识符,;,标识符,=,初值表, ,,标识符,=,初值表,;,嵌入式程序设计中,C,语言的变量、数组、结构、联合,联合说明,存储类说明符, union,联合原型名,类型说明符,标识符,,标识符,;,类型说明符,标识符,,标识符,;,标识符,=,初值表,,标识符,初值表,;,5.4,嵌入式,C,语言程序设计实例,5.4.1,S3VCE40,开发板,测试程序实例,5.4.2,嵌入式,C,语言程序编写的简单构架,5.4.3,Flash,测试代码介绍,5.4.1,S3VCE40,开发板的,测试程序实例,我们以,S3VCE40,开发板上的各个功能模块的整个测试程序为例,介绍如何运用,C,语言进行基于,ARM,的嵌入式程序设计。该程序完成的功能如下所示:,实验板加电时数码管八段全亮;,LED1,、,LED2,轮流闪烁(频率近,1Hz,);,使用,PC,键盘操作;串口终端输出信息如图:,然后使用开发板上的,PC,键盘选择各部分功能测试操作,如下图:,程序源代码介绍,整个测试程序主文件,main.c,的代码构成图如下图所示,由,BootLoader,启动程序进入,C,语言主函数,main(),入口。,5.4.2,嵌入式,C,语言程序编写的简单构架,#include,预,编译指令,个,C,语言代码,一般要用,#include,编译指令将所需要的头文件加到该程序中,这是很有必要的,尤其是对编写较大的程序代码时。随后是定义一些外部变量,并对程序中的函数进行声明。,主函数,main,(),的编写;,在每一个,C,语言代码中,一定要有一个,main,(),函数,在该函数中完成该程序文件所要完成的各个功能,一般是通过调用各个子函数来完成。当然,它也可以调用其他文件中的函数。,完成相应功能的各个功能函数的编写。,各个函数之间可以相互调用。,5.4.3Flash,测试代码介绍,下面给出,功能测试程序中,Flash,测试程序的代码结构图:,5.5,嵌入式,C,语言程序设计技巧,5.5.1,变量定义,5.5.2,参数传递,5.5.3,循环条件,5.5.1,变量定义,在变量声明的时候,最好把所有相同类型的变量放在一起定义,这样可以优化存储器布局。,由下例可以看出:,对于局部变量类型的定义,使用,short,或,char,来定义变量并不是总能节省存储空间。有时使用,32,位,int,或,unsinged,int,局部变量更有效率一些,如下图所示:,变量定义中,为了精简程序,程序员总是竭力避免使用冗余变量。但有时使用冗余变量可以减少存储器访问的次数这可以提高系统性能。,5.5.2,参数传递,为了使单独编译的,C,语言程序和汇编程序能够互相调用,定义了统一的函数过程调用标准,ATPCS,。,ATPCS,定义了寄存器组中的,R0R3,作为参数传递和结果返回寄存器,如果参数数目超过四个,则使用堆栈进行传递。,内部寄存器的访问速度是远远大于存储器的,所以要尽量使参数传递在寄存器里面进行,即应尽量把函数的参数控制在四个以下。,5.5.3,循环条件,计数循环是程序中十分常用的流程控制结构,一般有以下两种形式:,for,(,loop=1,;,loop New Workspace,,,系统弹出工程创建对话框 。,在,Project name,编辑框中输入新建工程名,led_int,,,Location,编辑框中输入保存该工程的目录路径,C:EmbestIDEEV4510led_int,。,选择,OK,按钮,创建新工程,led_int,,,集成环境将创建与工程同名的,workplace,和,project,。,在工作区窗中选择右键菜单创建源文件夹并添加相关源文件 。,工程的建立和配置,工程,配置,工程创建完成后,需要对工程进行配置,,Embest,IDE,才能正确的编译、链接和调试等。,选择,Project Settings,菜单项,弹出工程配置对话框,如下图所示,。,工程配置包括处理器的选择、仿真器配置、调试配置、目录配置、编译配置、汇编配置、链接配置,工程配置是整个软件开发过程中非常关键的一步。,5.7.5,在,RAM,中调试软件,软件的调试既可以在,ROM,区也可以在,RAM,区完成,由于,RAM,区可以很方便地读写,访问速度高,因此软件开发过程中的调试只要硬件条件许可,都应该在,RAM,区完成。,软件调试前需要完成以下几步:,编译链接工程,连接仿真器、评估板,程序下载,5.7.6,软件的固化,在,RAM,中调试通过的程序与最终固化到电路板的,Flash,中的程序有所区别,需要做以下改动:,在汇编器的预定义选项中设置,ROM=1,,,或者直接在,init.s,文件中增加 “,.,equ,ROM ”,。,在链接器的链接文件中选择,ldscript.flash,。,重新编译程序。然后使用,Elf to Bin,工具将,led_int.elf,文件转换成二进制指令格式文件,led_int.bin,。,最后使用,Embest,Flash Programmer,将,led_int.bin,下载到电路板的,Flash,中,如图所示。,5.7.7,程序在,Flash,中调试,程序在,Flash,中与在,RAM,中调试工程配置不同:,调试选项中不需要执行脚本文件,该工作在启动文件中完成,需要将连接后行为(,Action after connected,),选项改为无(,None,);,调试过程也有所不同:,连接仿真器后,无需再执行下载(,Download,),程序操作;,如果要从启动程序的入口开始调试程序,先必须执行复位(,reset,),命令,此时程序将停在零地址处;,程序在,Flash,中调试时最多可以设置两个硬件断点。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!