嵌入式系统开发实验一.docx
- 文档编号:27009922
- 上传时间:2023-06-25
- 格式:DOCX
- 页数:30
- 大小:900.74KB
嵌入式系统开发实验一.docx
《嵌入式系统开发实验一.docx》由会员分享,可在线阅读,更多相关《嵌入式系统开发实验一.docx(30页珍藏版)》请在冰豆网上搜索。
嵌入式系统开发实验一
ADS集成环境下应用程序开发过程
1.实验目的
1.1理解启动代码
功能
硬件初始化,引导C代码
特征
通常用汇编语言编写,程序复位运行入口点,代码量非常小
程序流程
Ⅰ、设置中断、异常入口
Ⅱ、关中断
Ⅲ、硬件寄存器初始化(GPIO配置、总线配置、PLL时钟)
Ⅳ、初始化栈指针
Ⅴ、数据区初始化
Ⅵ、C入口函数调用BLMain
1.2掌握ADS集成环境下应用程序开发过程
Ⅰ、JTAG仿真器的应用
Ⅱ、应用程序功能
Ⅲ、硬件驱动
Ⅳ、应用
Ⅴ、应用程序特征
Ⅵ、通常用C语言或者嵌入式汇编语言编写
Ⅶ、程序较复杂,代码量较大
2.实验容
2.1安装ADS
Ⅰ、安装ADS
Ⅱ、安装ARMLicense
Ⅲ、编译
2.2用ADS创建工程
Ⅰ、配置ADS
Ⅱ、添加文件、编写程序
Ⅲ、C或汇编程序
2.3编译
Ⅰ、配置编译、汇编和连接参数
Ⅱ、编写连接脚本文件
Ⅲ、编写连接脚本文件
2.4调试
Ⅰ、连接调试器
Ⅱ、下载程序
Ⅲ、运行、调试
3.实验过程
3.1ADS1.2开发环境的创建
3.1.1ADS1.2概述
由于嵌入式控制器收其本身资源的限制,其应用程序不能再其自身上开发。
因此开发其应用程序,还需要一台PC机,我们可以把这台PC称为“宿主机”。
在“宿主机”上开发需要安装有集成开发环境。
ADS就是ARM的集成开发环境。
ADS全称为ARMDevelopmentSuit,是ARM公司推出的新一代ARM集成开发工具。
它主要包括编译器、器、调试器、C和C++库等,是ARM公司推出的新一代ARM集成开发工具。
其最新版本是ADS1.2,该版本支持包括Windows和Linux在的多种操作环境。
ADS1.2的组成如下。
1.编译器
ADS提供多种编译器,以支持ARM和Thumb(在ARM体系中数据和指令采用16位字长)指令的便宜,主要有
armcc:
是ARMC编译器
tcc:
是ThumbC编译器
armcpp:
是ARMC++编译器
tcpp:
是ThumbC++编译器
armasm:
是ARM和Thumb的汇编语言编译器
2.器
armlink是ARM器。
该命令既可以将编译得到的一个或多个多个目标文件和相关的一个或多个库文件进行,生成一个可执行文件,也可以将多个目标文件成一个目标文件,以供进一步。
3.符号调试器
armsd是ARM和Thumb的符号调试器,能进行源码级的程序调试。
用户可以在用C或汇编语言编写的代码中进行单步调试、设置断点、查看变量值和存单元的容。
4.FromELF
将ELF格式的文件转换为各种格式的输出文件,包括bin(二进制)格式映像文件,Motorola32为S格式映像文件、Intel32位格式映像文件和Verilog十六进制文件。
FromELF命令也能够为输入映像文件产生文本信息,例如代码和数据长度。
5.armar
Armar是ARM库函数生成器,它将一系列ELF格式的目标文件以库函数的形式集合在一起。
用户可以把一个库传递给一个器以代替几个ELF文件。
6.CodeWarrior
CodeWarrior集成开发环境(IDE)为管理和开发项目提供了简单多样化的图形用户界面,用户可以使用ADS的CodeWarriorIDE为ARM和Thumb处理器开发用C、C++或者ARM汇编语言编写的程序代码。
一般来说我们会使用CodeWarrior集成开发环境来开发我们的C语言程序。
7.调试器
ADS中含有3个调试器,即AXD、Armsd和ADW/ADU。
在ARM体系中,可以选择多种调试方式,如Multi-ICE(Multi-processorIn-CircuitEmulator)、ARMulator或Angel。
(1)Multi-ICE是一个独立的产品,是ARM公司自己的JTAG在线仿真器,而不是由ADS提供的。
(2)ARMulator是一个ARM指令仿真器,集成在ARM的调试器AXD中,提供对ARM处理器的指令集成的仿真,为ARM和Thumb提供精确的模拟。
用户可以再硬件尚未做好的情况下开发程序代码,利用模拟器方式进行调试。
(3)Angel是ARM公司常驻在目标机Flash中的监控程序,只需通过RS232C串口与PC主机相连,就可以对基于ARM架构处理器的目标机进行监控器方式的调试。
8.C和C++库
ADS提供了ANSIC库函数和C++库函数,支持被编译的C和C++代码。
用户可以把C库中的与目标相关的函数作为自己应用程序的一部分。
重新进行代码的实现。
3.1.2ADS1.2的安装
在\YLE2440W用户光盘(V1.6)\实用工具的目录下有一个嵌入式系统开发ADS1·2破解版.zip的文件,解压后运行SETUP.EXE。
根据安装向导一步一步完成ADS集成开发环境的安装。
需要注意的是,如图3-1所示,选择IntallLicense。
图3-1
如图3-2所示,选择LinseedFileToBeInstalled。
单机"Browse",选择CRACK目录下的license.dat文件即可安装许可证。
图3-2
安装并注册成功后,CodeWarrior集成开发环境就可以使用了。
如图3-3所示。
图3-3
3.2ADS集成开发环境的使用
3.2.1建立一个新工程
点击Windows操作系统的【开始】->【程序】->【ARMDeveloperSuitev1.2】->【CodeWarriorforARMDeveloperSuite】启动MetrowerksCodeWarrior,运行后的界面如图3-4所示。
图3-4
选择【File】->【New】,出现如图3-5所示对话框。
图3-5
ADS为用户提供了7个模板,分别是:
Ⅰ、ARMExecutableImage:
用于由ARM指令的代码生成一个ELF格式的可执行映像文件;
Ⅱ、ARMObjectLibrary:
用于由ARM指令的代码生成一个armar格式的目标文件库;
Ⅲ、EmptyProject:
用于创建一个不包含任何库或者源文件的工程;
Ⅳ、MakefileImporterWizard:
用于将VC的nmake或者GNUmake文件转入到CodeWarriorIDE工程文件;
ThumbARMExecutableImage:
用于由ARM指令和Thumb指令的混合代码生成一个可执行的ELF格式的映像文件;
ThumbARMExecutableImage:
用于由Thumb指令创建一个可执行的ELF格式的映像文件;
ThumbObjectLibrary:
用于由Thumb指令的代码生成一个armar格式的目标文件库。
一般情况下均选择“ARMExecutableImage”,然后在“Projectname:
”栏输入工程的名称,在“Location:
”栏指定路径,在本例中工程名为Expe1_LED,存储路径为E:
\ADSProject。
设置好后点击确定。
这时候会出以工程名命名的.mcp对话框,如图3-6所示。
图3-6
有三个标签页,风别为Files,LinkOrder,Targets。
默认的是第一个Files。
在该标签页下,在空白处点击鼠标右键,选中“AddFiles…”可以把用到的源程序添加到工程中。
也可以选择新建一个文件编辑源码。
下面我们分别介绍这两种方法。
首先我们说下添加源程序到工程中。
如图3-6,在Files标签选项卡下单击鼠标右键,选中“AddFiles…”
要使用ADS新建一个文件编辑源码可以有两种方法,第一种是直接点击工具栏上按钮,在弹出的对话框中输入源码,也可以在菜单栏上点击【文件】->【新建】,然后选择File选项卡,如图3-8所示。
在“FileName”中输入文件的名字,点击确定。
也可以勾上Addtoproject前面的复选按钮,然后在Targets中勾上DebugRel,这样源码就添加到工程中了。
如果不勾上Addtoproject前面的复选按钮,那么编辑好源码后,需要按照前面添加源码的方法把添加源码到工程中去了。
在弹出的对话框中输入程序源码(见附录一),注意:
ARM汇编语言程序源代码中允许有空行,可以在汇编程序中加上一个空白行,来增加程序的可阅读性。
此外需要注意的是:
指令,指示符,伪指令前必须加空格或者Tab制表符,这就是说指令,指示符,伪指令不可以从行的最左边开始书写,即不能顶格书写。
在ARM汇编语言程序中,所有标号必须在一行的最左边的位置开始书写,标号的后面不要加“:
”。
指令,指示符,寄存器名可以用小写字母也可以用大写字母来表示,但不能大小写字母相杂。
当一行写不下时,可以用反斜线‘\’作为这一行最后的符号,然后另起一行接下去写,这样汇编器会将这两行代码看作一行代码。
需要注意的是,如果在被引号括住的字符串中使用反斜线‘\’,则反斜线‘\’不能起到续行的作用。
每行的长度限制一般在128~255个字符串之间。
分号‘;’除非在字符串常量中出现,否则它的出现就表示着注释的开始,此注释直至行尾结束。
可以将注释单独列为一行。
所有注释被汇编器忽略。
编辑好源码并保存添加到工程后还不能编译和,还需要进行一些配置。
在如图3-6所示的对话框上面有一些按钮和选项卡,我们把鼠标移到上面的时候会出现一些提示,如图所示
•DebugRelSettings…工程设置,如地址设置、输出文件设置、编译选项等,其中DebugRel为当前的生成目标(targetsystem)。
•SynchronizeModificationDates同步修改日期,检查工程中每个文件的修改日期,若发现有更新(如使用其它编辑器编辑源文件),则在Touch栏标记“√”。
•Make编译连接(快捷键为F7)。
•Debug启动AXD进行调试(快捷键为F5)。
•Run启动AXD进行调试,并直接运行程序。
•ProjectInspector工程检查,查看和配置工程中源文件的信息
选择菜单栏【Edit】->【DebugRelSetting…】出现如图所示的对话框
1.Target设置选项
TargetName文本框显示了当前的目标设置
Linker选项供用户选择要使用的器。
在这里默认选择的是ARMLinker,使用该器,将使用armlink编译器和汇编器生成的工程中的文件相应的目标文件。
在这个设置中海油两个可选项,None表示不适用任何器,如果使用None,则工程中的所有文件都不会被编译或汇编器处理。
ARMLibrarian表示将编译或汇编得到的目标文件转换为ARM库文件。
对于本例,使用默认的器ARMLinker。
Pre-linker:
目前CodeWarriorIDE不支持该选项
Post-Linker:
选择在完成后,还要对输出文件进行的操作。
我们一般希望生成一个可以烧写到Flash中去的二进制代码,所以在这里选择ARMfromELF,表示在生成映像文件后,再调用FromELF命令将含有调试信息的ELF格式的映像文件转换成其他格式的文件。
设置好后如图所示
2.LanguageSettings设置选项
我们实验采用的汇编语言编写,因此要使用到汇编器。
选择LanguageSettings下选择ARMAssembler。
如图所示在Target选项卡下ArchitectureorProcessor的下拉菜单中选择ARM920T(CPU的类型)。
在FloatingPoint选择Nofloatingpoint。
ByteOrder中选择LittleEndi。
InitialState中选择ARM。
如果使用C语言编写程序,也需要在ArchitectureorProcessor的下拉菜单中选择ARM920T。
设置好后如图所示
3.Linker设置
单击ARMLinker,在Output选项卡中设定程序的代码段地址,以及数据的地址。
在ROBase文本框中填写程序代码存放的起始地址,RWBase文本框中填写程序数据存放的起始地址。
注意:
RWBase地址必须是SDRAM的地址。
如图所示
在Option选项卡中,Imageentrypoint文本框填写程序代码的入口地址,其他保持不变,如果是在SDRAM中运行,则可以再0x30000000~0x33ffffff中选值,这是64MSDRAM的地址,但是这里用的是起始地址,所以必须把用户的程序空间给留出来,并且还要留出足够的程序使用的数据空间,所以必须把用户的程序空间给流出来。
并且还要留出足够的程序使用的数据空间,而且还必须是4字节对齐的地址(ARM状态)。
通常入口点Imageentrypoint为0x30000000,RO_base也为0x30000000。
如图所示
在Layout选项卡中,在Placeatbeginningofimage选项组里要填写项目的入口程序的目标文件名,例如,在本例中整个工程项目的入口程序是asm_led.s,那么应该在Object/Symbol文本框中填写其目标文件名asm_led.o,在Section文本框中填写程序入口的起始段标号。
它的作用是通知编译器,整个项目的开始运行,是从该段开始的。
单击ARMfromELF选项卡,在Outputfilename文本框中设置输出文件名*.bin,前缀名可以自己取,在Outputformat下拉列表中选择Plainbinary,这是设置要下载到flash中的二进制文件。
如图所示。
到这里,设置就基本上完成了,可以对工程进行编译和了。
可以点击CodeWarriorIDE的菜单栏【Project】->【make】菜单,也可以直接在.mcp对话框上点击按钮编译工程。
在Errors&Warnings对话框中警告和错误都为0
3.2.2使用AXD进行代码仿真、调试
项目建立并加入相应的文件后,“目标机”和“宿主机”通过JTAG仿真器进行连接,然后用AXD进行代码仿真、调试。
首先将使用并口电缆将计算机并口和JTAG仿真小板连接起来,并把JTAG仿真小板和开发板的JTAG接口用20芯排线连接到SDT插座上。
并按动将JTAG小板上的红色按钮,调制Wiggler。
(注:
以下操作均在windowsXP下操作)在\YLE2440W用户光盘(V1.6)\实用工具目录下,解压ArmDebug,复制ArmDebug文件夹GIVEIO.SYS拷贝到C:
\WINDOWS\system32\drivers目录下。
运行ArmDebug文件夹下“安装驱动.exe”就会弹出一个界面窗口,先点击“remove”,再点击上面的“INSTALL”按键,出现提示信息“serviceispartiallyinstalled”.然后在点击下面的“INSTALL”按键,出现下面提示信息,如下图所示,说明安装成功。
安装好后,重启下开发板。
运行ArmDebug文件夹下ARM9.exe,选择Wiggler,如果安装成功,并且连线
正确,装会检测到ARM920T,如下图如示:
不要关闭ARM9调试代理,在CodewarriorIDE环境下,点击.mcp对话框上面的Debug按钮,显示如图所示对话框。
点击菜单栏【Options】->【ConfigureTarget…】,弹出ChooseTarget对话框,如图所示,选择Configure。
出现如图所示Remote_Aconnection对话框。
点击Select按钮,如图所示,选择ARMEthernetdriver,点击OK。
在图选择Configure,出现如图所示对话框,输入IP地址127.0.0.1,点击OK
设置好后在Remote_Aconnection对话框点击OK,再在ChooseTarget对话框点击OK,出现如图所示对话框。
点击是如果目标系统正确了,会看到程序下载的进度条显示。
进度消息框消失后,显示当前执行代码视窗,蓝色指针指向第一条执行的语句。
如图所示。
当工程编译连接通过后,也可以通过【开始】菜单启动AXD。
点击【File】选择【LoadImage…】加载ELF格式的可执行文件,即*.axf文件。
说明:
当工程编译连接通过后,在“工程名\工程名_Data\当前的生成目标”目录下就会生成一个*.axf调试文件。
比如工程Expe1_LED,当前的生成目标Debug,编译连接通过后,则在…Expe1_LED\Expe1_LED_Data\DebugRel目录下生成Expe1_LED.axf文件。
加载调试文件(即*.axf文件),用户就可以操作AXD运行调试工具条中的工具按钮实现程序运行调试。
AXD运行调试工具条如图1.13所示,调试观察窗口工具条如图1.14所示,文件操作工具条如图1.15所示。
运行调试工具条
全速运行(Go)
停止运行(Stop)
单步运行(StepIn),与Step命令不同之处在于对函数调用语句,StepIn命令将进入该函数。
单步运行(Step),每次执行一条语句,这时函数调用将被作为一条语句执行。
单步运行(StepOut),执行完当前被调用的函数,停止在函数调用的下一条语句
运行到光标(RunToCursor),运行程序直到当前光标所在行时停止。
设置断点(ToggleBreakPoint)
打开寄存器窗口(ProcessorRegisters)
打开观察窗口(ProcessorWatch)
打开变量观察窗口(ContextVariable)
打开存储器观察窗口(Memory)
打开反汇编窗口(Disassembly)
加载调试文件(LoadImage)
重新加载文件(ReloadCurrentImage)。
由于AXD没有复位命令,所以通常使用Reload实现复位(直接更改PC寄存器为零也能实现复位)。
在AXD中点击‘GO’图标,则程序开始全速运行,我们可以看到实验板上D8~D14不停的闪烁着。
4.ARM汇编与C语言混合编程实例
此程序实现开发板上的LED灯实现流水灯的功能,先要新建一个工程名为asm_c,然后新建源文件init.s和main.c,输入代码(源码见附录2),如下所示:
按照前面调试的方法,调试程序。
附录一
实验一源码及其说明
图1
图2
图3
图4
在开发板关盘YLE2440W用户光盘(V1.6)\原理图\原理图_PDF格式目录下YLE24xx_DEV_V2.0.pdf文件中我们可以找到如图1所示的LED连接图。
然后我们可以在YLE2440-CORE-V1.0.pdf文件中找到这几个LED灯所连接的IO口,如图2所示,因此我们可以知道这四个LED灯连接在MCU的F口上。
因此我们需要知道这几个口的地址。
打开\YLE2440W用户光盘(V1.6)\芯片资料目录下um_s3c2440a_rev10.pdf文件,在第九章I/OPORTS中我们可以找到F口对应的地址,如图3,图4所示。
了解了LED灯的连接之后,设计程序的思路就出来了,流程图如图5所示
图5
具体算法如下:
;定义端口E寄存器预定义
rGPFCONEQU0x56000050
rGPFDATEQU0x56000054
rGPFUPEQU0x56000058
AREAInit,CODE,READONLY;该伪指令定义了一个代码段,段名为Init,属性只读
ENTRY;程序的入口点标识
ResetEntry
;下面这三条语句,主要是用来设置I/O口GPF7为输出属性
ldrr0,=rGPFCON;将寄存器rPCONE的地址存放到寄存器r0中
ldrr1,=0x5500
strr1,[r0];将r1中的数据存放到寄存器rPCONE中
;下面这三条语句,主要是禁止GPF端口的上拉电阻
ldrr0,=rGPFUP
ldrr1,=0xff
strr1,[r0]
ldrr2,=rGPFDAT;将数据端口F的数据寄存器的地址附给寄存器r2
ledloop
ldrr1,=0x7f
strr1,[r2]
bldelay
ldrr1,=0xbf
strr1,[r2]
bldelay
ldrr1,=0xdf
strr1,[r2]
bldelay
ldrr1,=0xef
strr1,[r2]
bldelay
bledloop
;下面是延迟子程序
delay
ldrr3,=0xfffff;设置延迟的时间
delay1
subr3,r3,#1;r3=r3-1
cmpr3,#0x0;将r3的值与0相比较
bnedelay1;比较的结果不为0(r3不为0),继续调用delay1,否则执行下一条语句
movpc,lr;返回
END;程序结束符
C和汇编混合编程源码
init.s
AREAInit,CODE,READONLY;该伪指令定义了一个代码段,段名为Init,属性只读
ENTRY
RestEntry
movsp,#0x0c700000;建立栈指针
IMPORTMain
BLMain
END
main.c
#include"stdio.h"
#definerGPFCON(*(volatileunsigned*)0x56000050)
#definerGPFDAT(*(volatileunsigned*)0x56000054)
#definerGPFUP(*(volatileunsigned*)0x56000058)
voiddelay()
{
inti=0,j=0;
for(i=0;i<100;i++)
for(j=0;j<=10000;j++);
}
voidMain()
{
rGPFCON=0x5500;
rGPFUP=0xff;
rGPFDAT=0xff;
while
(1)
{
rGPFDAT=0x7f;//D8点亮
delay();//延时
rGPFDAT=0xbf;//D9点亮
delay();//延时
rGPFDAT=0xdf;//D10点亮
delay();//延时
rGPFDAT=0xef;//D11点亮
delay();//延时
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 开发 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)