烧灼的意思
实验一 ADS开发环境实验
一、实验目的
1、掌握ADS开发环境的使用;
2、了解ADSModule工程基本结构和内容;绿萝的样子描写
3、掌握在ADS下建立工程进行开发的基本技巧。
二、实验内容
1、熟悉ADS开发环境中的各个组件;
2、建立并编译一个HELLOWORLD工程;
三、实验设备
1、硬件:
DM2410C实验系统;
PC机;
2、软件:
PC机操作系统(WINDOWS 2000);
ARM Developer Suite v1.2;
四、预备知识
1、了解ARM和S3C2410体系结构;
2、了解ARM和S3C2410汇编语言;
3、掌握C、C++语言。
4、已阅读过《DM2410实验系统使用说明》
五、基础知识
1、ADS简介
ADS是一个使用方便的集成开发环境,全称是“ARM Developer Suite”,它是由ARM公司提供的专门用于ARM相关应用开发和调试的综合性软件。它在易用性上比上一代的SDT开发环境有较大提高,是一套功能强大又易于使用的开发环境,目前的版本号是1.2。ADS囊括了一系列的应用,并有相关的文档和实例的支持。使用者可以用它来编写和调试各种基于ARM家族RISC处理器的应用。你可以使用ADS来编辑、编译、调试包括C、C++以及ARM汇编语言编写的程序。
ADS主要由以下部分构成:
ANSI C 编译器-armccand tcc
ISO / Embedded C++ 编译器-armcppand tcpp
ARM / Thumb 汇编器-armasm
Linker -armlink
Windows 集成开发环境-CodeWarrior
Debugger -AXD
armsd 可向前兼容
格式转换器-fromelf
库管理器-armar
C and C++ 库
指令级仿真器-ARMulator
同时包含
ARM Firmware Suite
ARM Application Library
RealMonitor
图1-1 ADS各组件之间的关系
在实验中我们接触最多,最直接的就是CodeWarrior和AXD Debugger这两个组件。在本节实验中我们主要会讲解如何在CodeWarrior 下建立工程,进行编译和连接,最终生成二进制文件。下一节会着重介绍如何用AXD Debugger进行下载和调试仿真。我们没有对其他组件进行详细介绍并不意味着其他模块没有发挥作用或者不重要,例如我们在编译生成二
进制镜象的时就是ANSI C 编译器-armccand tcc,ISO / Embedded C++ 编译器-armcppand tcpp,ARM / Thumb 汇编器-armasm以及Linker –armlink这些组件在完成这项工作。只是由于我们通过CodeWarrior环境进行操作可以在GUI界面下完成绝大部分工作,而不必直接和这些组件打交道,这是我们目前知道的在ARM下最方便最快捷的开发方式,关于其他组件的详细资料可以参见ADS下帮助文档或者直接访问ARM公司的网站。
图1-2 CodeWarrior基本界面
六、实验说明
1、ADSModule工程基本结构
一个能够独立运行的工程中首先应该包括对硬件设备进初始化的代码,其次是一些辅助性代码,例如辅助调试代码,和工程应用性代码,为这些代码服务的头文件以及为整个工程相配套辅助文件,如编译控制文件和工程文件等。在实验光盘\BSP目录下的ADSModule工程就是我们为这个实验系统定制的一个工程模板,实验系统ADS下的实验都是在ADSModule工程的基础上做相应的修改,添加应用部分实现的。如果针对这个实验系统做二次开发,也可以在这个工程的基础上很方便的进行。打开ADSModule文件夹,可以看到12个文件:
| | |
1 | 家长会家长代表发言稿大扫除英语2410init.s | 采用ARM汇编实现,包含了系统初始化部分中最开始的部分,也是最关键部分的代码,完成了对S3C2410 Exception向量,中断向量表,内存,内存控制器和堆栈的初始化,同时又通过Main函数接口给调用后面的代码留出了接口。 |
2 | 2410slib.h | 采用ARM汇编实现,主要完成了与MMU和CPSR相关的一系列辅助性函数。 |
3 | 2410slib.s | |
4 | 2410Main.c | C语言编写,完成功能。 |
5 | 2410lib.h | 用C语言实现了串口调用函数,字符串处理函数,端口初始化函数,CPU主频调整函数,Watchdog控制函数等一系列辅助函数。 |
6 | 2410lib.c |
7 | 2410addr.h | 分别使用汇编和C实现,定义了S3C2410芯片的特殊寄存器地址以及特殊寄存器的相应设定值。 |
8 | 2410addr.inc |
9 | Memcfg.inc | 根据实验系统的硬件,定义了每个BANK内存控制器相关的设定值,在2410init.s中被用来初始化内存控制器 |
10 | Option.h | 定义了一系列S3C2410可选择使用的主频,以及与之相配的寄存器设置参数,被用于2410init.s文件中设定S3C2410芯片主频 |
11 | Option.inc |
12 | Def.h | |
13 | ret.ini | |
14 | Scat | ADS编译时控制编译器和连接器按照一定的内存结构进行。 |
| | |
2、关键代码分析:
2.1 Exception Vectors代码分析
ASSERT :DEF:ENDIAN_CHANGE
[ ENDIAN_CHANGE
ASSERT :DEF:ENTRY_BUS_WIDTH
[ ENTRY_BUS_WIDTH=32
b ChangeBigEndian ;DCD 0xea000007
]
[ ENTRY_BUS_WIDTH=16
andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00
]
[ ENTRY_BUS_WIDTH=8
streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea
]
|
b RetHandler
]
b HandlerUndef ;handler for Undefined mode
b HandlerSWI ;handler for SWI interrupt
b HandlerPabort ;handler for PAbort
b HandlerDabort ;handler for DAbort
b . ;rerved
b HandlerIRQ ;handler for IRQ interrupt
b HandlerFIQ ;handler for FIQ interrupt
这段代码经过编译后将会被放在S3C2410芯片内部4K的BootSRAM开始处,也就是说这其实系统启动后会被最早调入内存和执行的代码,他完成了最关键的Exception Vectors初始化。
Exception Vectors |
Address | Exception | Mode in Entry |
0x00000000 | Ret | Supervisor |
0x00000004 | Undefined instruction | Undefined |
0x00000008 | Software Interrupt | Supervisor |
0x0000000C | Abort(prefetch) | Abort |
0x00000010 | Abort (data) | Abort |
0x00000014 | Rerved | Rerved |
0x00000018 | IRQ | IRQ |
0x0000001C | 牛肉和什么菜包饺子好吃FIQ | FIQ |
| | |
2.2 中断跳转代码分析
IsrIRQ
sub sp,sp,#4
stmfd sp!,{r8-r9}
ldr r9,=INTOFFSET ; 获得中断号
ldr r9,[r9]
ldr r8,=HandleEINT0 ;获得中断向量表基地址
add r8,r8,r9,lsl #2 ;计算偏移量
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!,{r8-r9,pc} ; 跳转进入中断处理函数
上面的代码通过INTOFFSET获得中断寄存器当中的中断号,然后通过HandleEINT0获得中断处理向量的基地址,根据中断号进行偏移,最终跳转到中断处理函数当中。
2.3 scat文件分析
LDR1 0x00000000
{
ROM1 0x00000000 0x1000 // 将镜象的第一部分限制在4K长度,从0地址开
{ // 始,刚好和芯片内部的4K BootRAM印合
2410init.o (Init, +First) // 限定这段内存当中只存放2410init.s编译形成的二进制代码
}
}
LDR2 0x30000000 // 镜象的第二部分从0x30000000开始,符合符合实验系统的硬件状况
{
RAM2 0x30000000
{
* (+RO) // 将其他全部的ReadOnly和ReadWrite属性的代
* (+RW) // 码放在这部分内存中0x30000000-0x30500000
}
RAM3 0x30500000
{
* (+ZI) // Zero Init属性的代码存放在0x30500000开始位置的内存中
}
}
娥眉山七、实验步骤
1、新建一个工程
Step1: 启动ADS
两人三足教案点击桌面开始程序ARM Developer Suite v1.2 CodeWarrior for ARM Developer Suite,弹出CodeWarrior for ARM Developer Suite的界面。
图1-3 从“程序”启动CodeWarrior
图1-4 CodeWarrior启动界面
Step2: 建立新的工程
郑钧个人资料
点击FileNew,弹出新建工程对话框。如图1-x新建工程后点击“确定”, 进入工程编辑界面。
图1-5 选择新建工程
图1-6 新建工程对话框
注意:在选择建立工程的文件夹时只需要指定到“D:\ADS实验”即可,ADS将自动建立工程文件夹。
图1-7 工程编辑界面
Step3: 拷贝工程相配套辅助文件
将“实验说明”中提到的“光盘目录\BSP\ADSmodel”文件夹下的12个文件拷贝到这个新建的文件夹中。我们可以看到这时文件夹中除了这十二个文件以外还有一个p工程项目文件和一个HELLOWORLD_Data文件夹,这个文件夹是用来保存编译好的二进制文件和编译临时文件。再从光盘上ADSmodel的工程文件夹中将ret.ini和scat两个文件拷贝到这个工程文件夹下,其中scat就是上面讲到的编译控制文件,ret.ini是一段初始化代码,将在“JTAG下载和调试实验”一节中具体讲解它的用途。