Realview MDK技术资料
- 格式:doc
- 大小:89.50 KB
- 文档页数:5
实验目录实验一、熟悉realview开发环境 (2)1.1 RealView MDK软件开发环境简介 (2)1.1.1 RealView MDK的突出特性 (2)1.1.2 产品模块介绍 (2)1.2RealView 使用 (5)1.2.1创建一个工程 (6)1.2.2 编译、链接工程 (8)1.2.3 程序调试 (11)1.2.4 工程选项页概述 (12)实验二、ARM指令集 (13)2.1 ARM汇编指令1 (13)2.2 ARM汇编指令2 (27)实验三、ARM汇编子函数调用 (30)实验四、Thumb汇编指令练习 (31)实验五、ARM处理器工作模式练习 (32)实验六、简单C语言程序实验 (33)实验七、汇编与C语言的相互调用实验 (34)实验八、C语言中内联汇编程序实验 (35)实验九、C语言中嵌入型汇编程序实验 (36)实验十、综合编程实验 (37)实验十一、I/O及串口通信编程实验 (38)实验十二、中断实验 (40)实验十三、实时时钟实验 (41)实验十四、看门狗控制实验 (42)实验十五、A/D转换实验 (43)实验十六 I2C串行通信实验 (44)实验十七 linux bootload实验 (45)实验一、熟悉realview开发环境1.1 RealView MDK软件开发环境简介RealView MDK全称RealView MDK中国版开发套件,源自德国Keil公司,被全球超过10万的嵌入式开发工程师验证和使用,是ARM公司目前最新推出的对各种嵌入式处理器的软件开发工具。
RealView MDK集成了业内最领先的技术,包括µVision3集成开发环境与RealView编译器,支持ARM7、ARM9和最新的Cortex-M3核处理器,自动配置启动代码,集成Flash烧写模块,强大的Simulation设备模拟,性能分析等功能,与ARM之前的工具包ADS等相比,RealView编译器的最新版本可将性能改善超过20%。
4、MDK的介绍与使⽤1.1.RVMDK简介RVMDK源⾃德国的KEIL公司,是RealView MDK的简称,RealView MDK集成了业内最领先的技术,包括µVision4集成开发环境与 RealView编译器。
⽀持ARM7、ARM9和最新的Cortex-M3核处理器,⾃动配置启动代码,集成Flash烧写模块,强⼤的Simulation设备模拟,性能分析等功能,与ARM之前的⼯具包ADS等相⽐,RealView编译器的最新版本可将性能改善超过20%。
1.2.MDK 4.12集成开发环境的组成MDK⼜称叫RVMDK,源⾃德国的KEIL公司,是RealView MDK的简称,RealView MDK 集成了业内最领先的技术,包括µVision4集成开发环境与 RealView编译器。
⽀持ARM7、ARM9和最新的Cortex-M3核处理器,⾃动配置启动代码,集成Flash烧写模块,强⼤的Simulation设备模拟,性能分析等功能,与ARM之前的⼯具包ADS等相⽐,RealView编译器的最新版本可将性能改善超过20%。
1.3.MDK⼯程的编辑1.3.1.新建RVMDK⼯程1)点击WINDOWS操作系统的【开始】?【程序】?【Keil uVision4】启动Keil uVision 或在桌⾯双击【Keil uVision4】快捷⽅式启动。
启动MDK4.12如图所⽰:2)点击之后,出现启动画⾯:1)点击“project---New uVision Project”新建⼀个⼯程2)在对话框,选择放在刚才建⽴的“新建⽂件夹”下,给这个⼯程取个名后保存,不需要填后缀:3)弹出⼀个框,在CPU类型下我们找到并选中“STMicroelectronics”下的STM32F103RB:4)出现⼀个提⽰框,是否复制STM32启动代码到⼯程⽂件夹,我们选择【是】,就可以看到STM32的启动代码⾃动添加进来了:5)到这⾥⼯程全部建⽴完毕1.3.2.建⽴⽂件建⽴⼀个⽂本⽂件,以便输⼊⽤户程序。
MDK简介MDK即RealView MDK(Microcontroller Development kit),是ARM 公司目前最新推出的针对各种嵌入式处理器的软件开发工具。
RealView MDK 集成了业内最领先的技术,包括uVision4 集成开发环境与RealView 编译器。
支持ARM7、ARM9 和最新的Cortex-M3/M1/M0 核处理器,自动配置启动代码,集成Flash 烧写模块,强大的Simulation 设备模拟,性能分析等功能,与ARM 之前的工具包ADS 等相比,RealView 编译器的最新版本可将性能改善超过20%。
Keil公司开发的ARM开发工具MDK,是用来开发基于ARM核的系列微控制器的嵌入式应用程序。
它适合不同层次的开发者使用,包括专业的应用程序开发工程师和嵌入式软件开发的入门者。
MDK包含了工业标准的Keil C编译器、宏汇编器、调试器、实时内核等组件,支持所有基于ARM的设备,能帮助工程师按照计划完成项目。
功能特点完美支持Cortex-M、Cortex-R4、ARM7谡ARM9系列器件。
业行领先的ARM C/C++编译工具链IDE集成开发环境,调试器和仿真环境确定的Keil RTX ,小封装实时操作系统(带源码)TCP/IP网络套件提供多种的协议和各种应用提供带标准驱动类的USB 设备和USB 主机栈为带图形用户接口的嵌入式系统提供了完善的GUI库支持ULINKpro可实时分析运行中的应用程序,且能记录Cortex-M指令的每一次执行关于程序运行的完整代码覆盖率信息执行分析工具和性能分析器可使程序得到最优化大量的项目例程帮助你快速熟悉MDK-ARM强大的内置特征符合CMSIS (Cortex微控制器软件接口标准)ARM编译工具ARM编译工具链(之前被称为ARM RealView编译工具)包含:ARM C/C++ 编译器(armcc)MicrolibARM Macro汇编器(armasm)ARM链接器(armLink)ARM工具(Librarian and FromELF)基于以上专门针对ARM架构的微控制器编译器,工程师可以使用C或者C++编写应用程序。
1.1.RVMDK简介RVMDK源自德国的KEIL公司,是RealView MDK的简称,RealView MDK集成了业内最领先的技术,包括μVision4集成开发环境与 RealView编译器。
支持ARM7、ARM9和最新的Cortex-M3核处理器,自动配置启动代码,集成Flash烧写模块,强大的Simulation设备模拟,性能分析等功能,与ARM之前的工具包ADS等相比,RealView编译器的最新版本可将性能改善超过20%。
1.2.MDK 4.12集成开发环境的组成MDK又称叫RVMDK,源自德国的KEIL公司,是RealView MDK的简称,RealView MDK 集成了业内最领先的技术,包括μVision4集成开发环境与 RealView编译器。
支持ARM7、ARM9和最新的Cortex-M3核处理器,自动配置启动代码,集成Flash烧写模块,强大的Simulation设备模拟,性能分析等功能,与ARM之前的工具包ADS等相比,RealView编译器的最新版本可将性能改善超过20%。
1.3.MDK工程的编辑1.3.1.新建RVMDK工程1)点击WINDOWS操作系统的【开始】Æ【程序】Æ【Keil uVision4】启动Keil uVision 或在桌面双击【Keil uVision4】快捷方式启动。
启动MDK4.12如图所示:2)点击之后,出现启动画面:1)点击“project---New uVision Project”新建一个工程2)在对话框,选择放在刚才建立的“新建文件夹”下,给这个工程取个名后保存,不需要填后缀:3)弹出一个框,在CPU类型下我们找到并选中“STMicroelectronics”下的STM32F103RB:4)出现一个提示框,是否复制STM32启动代码到工程文件夹,我们选择【是】,就可以看到STM32的启动代码自动添加进来了:5)到这里工程全部建立完毕1.3.2.建立文件建立一个文本文件,以便输入用户程序。
RealView MDK中结构体存储方式对于RISC机器来说,对齐访问可以提高效率。
ARM是RISC机器,因此在多数情况下它以对齐方式访问,即访问的地址一般是4或2的倍数。
但在某些特殊应用上,对齐访问可能会带来麻烦。
下面笔者以自身经历来说明有些情况是不允许对齐访问的,好在强大的MDK早就意料到这些特殊应用,并有相应的对策。
下面举例说明结构以对齐方式和非对齐方式存储的差别。
下面以三种不同的方式定义了结构体foo,见表一。
其中第一种是常用的(默认情况)定义方式。
第二种和第三种方式均以压缩方式存储,以非对齐方式访问。
其中第二种方式关键字__packed修饰整个结构体,表明整个结构体以压缩方式存储;第三种方式关键字__packed修饰结构体中的某个域,被修饰的域以压缩的方式存储。
而其它部分则采用非压缩方式。
当然在示例结构体foo中,后两种定义方法达到的效果一样。
在第一种方式中,结构体成员one占用两个字节;成员two占用两个字节;成员three占用4个字节;成员four占用4个字节。
而在第二种和第三种方式中它们分别占用1个字节、两个字节、一个字节、4个字节。
如果读者看到这还不是很清楚的话,那么请看其对应的汇编代码,见表二。
表一三种定义结构体方式对比表二三种定义结构体方式对应用汇编代码显然以压缩方式存储结构体节省了空间但浪费了时间。
以非压缩方工存储结构体加快了速度但浪费了空间。
知道了结构体以压缩和非压缩方式存储的特点以及如何使用关键字__packed后。
笔者给出在实际工作中遇到的必须使用压缩方式存储的一个例子。
大家知道FAT文件系统的DBR 区大小刚好为一个扇区(512字节)。
DBR 区有一系列关于系统的数据。
在处理时需要将其定义为一个结构体。
程序中对这个结构体进行初始化时,需要将整个扇区的内容拷贝给这个结构体。
因此这个结构体的大小正好为512字节。
当然这是在压缩存储的情况下。
试想如果以非压缩方式存储,结果将混乱不堪。
Realview MDK常见问题及解决方法解决方法:使用RVCT的fromelf.exe工具进行转换。
也就是说首先将源文件编译链接成*.axf的文件,然后使用fromelf.exe工具将*.axf格式的文件转换成*.bin格式的文件。
假设工程文件的名字为Axf_To_Bin,下面将具体说明这个操作步骤:1.打开Axf_To_Bin文件中的Axf_To_Bin.uv2工程文件;2.打开Options for Target‘Axf_To_Bin’对话框,选择User标签页;3.构选Run User Programs After Build/Rebuild框中的Run#1多选框,在后边的文本框中输入C:\Keil\ARM\BIN31\fromelf.exe--bin-o./output/Axf_To_Bin.bin./output/Axf_To_Bin.axf命令行;4.重新编译文件,在./output/文件夹下生成了Axf_To_Bin.bin文件。
在上面的步骤中,有几点值得注意的是:1.C:\Keil\ARM\BIN31\表示RV MDK的安装目录;2.fromelf.exe命令的具体语法格式如下:命令的格式为:fromelf[options]input_file命令选项如下:--help显示帮助信息--vsn显示版本信息--output file输出文件(默认的输出为文本格式)--nodebug在生成的映象中不包含调试信息--nolinkview在生成的映象中不包含段的信息二进制输出格式:--bin生成Plain Binary格式的文件--m32生成Motorola32位十六进制格式的文件--i32生成Intel32位十六进制格式的文件--vhx面向字节的位十六进制格式的文件t--base addr设置m32,i32格式文件的基地址--text显示文本信息文本信息的标志-v打印详细信息-a打印数据地址(针对带调试信息的映象)-d打印数据段的内容-e打印表达式表print exception tables-f打印消除虚函数的信息-g打印调试表print debug tables-r打印重定位信息-s打印字符表-t打印字符串表-y打印动态段的内容-z打印代码和数据大小的信息解决方法:用户可以自定义flash烧写算法,并把它们集成到Realview MDK中。
Realview MDK常见问题及解决方法解决方法:使用RVCT的fromelf.exe工具进行转换。
也就是说首先将源文件编译链接成*.axf的文件,然后使用fromelf.exe工具将*.axf格式的文件转换成*.bin格式的文件。
假设工程文件的名字为Axf_To_Bin, 下面将具体说明这个操作步骤:1.打开Axf_To_Bin文件中的Axf_To_Bin.uv2工程文件;2.打开Options for Target ‘Axf_To_Bin’对话框,选择User标签页;3.构选Run User Programs After Build/Rebuild框中的Run #1多选框,在后边的文本框中输入C:\Keil\ARM\BIN31\fromelf.exe --bin -o ./output/Axf_To_Bin.bin ./output/Axf_To_Bin.axf命令行;4.重新编译文件,在./output/文件夹下生成了Axf_To_Bin.bin文件。
在上面的步骤中,有几点值得注意的是:1.C:\Keil\ARM\BIN31\表示RV MDK的安装目录;2.fromelf.exe命令的具体语法格式如下:命令的格式为:fromelf [options] input_file命令选项如下:--help 显示帮助信息--vsn 显示版本信息--output file 输出文件(默认的输出为文本格式)--nodebug 在生成的映象中不包含调试信息--nolinkview 在生成的映象中不包含段的信息二进制输出格式:--bin 生成Plain Binary格式的文件--m32 生成Motorola 32位十六进制格式的文件--i32 生成Intel 32位十六进制格式的文件--vhx 面向字节的位十六进制格式的文件t--base addr 设置m32,i32格式文件的基地址--text 显示文本信息文本信息的标志-v 打印详细信息-a 打印数据地址(针对带调试信息的映象)-d 打印数据段的内容-e 打印表达式表print exception tables-f 打印消除虚函数的信息-g 打印调试表print debug tables-r 打印重定位信息-s 打印字符表-t 打印字符串表-y 打印动态段的内容-z 打印代码和数据大小的信息解决方法:用户可以自定义flash烧写算法,并把它们集成到Realview MDK中。
这些在RVMDK的用户手册中有详细的介绍。
具体的方法如下:定义一个新的Flash编程算法可以通过如下步骤配置一个新的Flash编程算法:1. 在..\ARM\Flash下新建一个空的子文件夹.2. 将已存在的某个Flash算法(如 ..\ARM\Flash\LPC_IAP_256)的内容拷贝到这个新文件中,并将此算法作为新算法的模板.3. 重命名工程文件LPC_IAP_256.UV2以表示新的Flash ROM设备名,如29F400.UV2并用μVision IDE将其打开.4. 在对话框Project - Options for Target - Output 中将所有的输出文件名(如 LPC_IAP_256)替换为新的设备名.5. 编辑FlashPrg.C文件并为EraseChip, EraseBlock及ProgramBlock定义函数代码.在函数Init和UnInit中编写算法所需的initializations和de-initialization代码.6. 在文件FlashDev.C中的struct FlashDevice中定义设备参数.7. 编译新的Flash编程算法.扩展名为*.FLX的输出文件包含新的编程算法.使用Configure FlashDownload 中的Add按钮可将此编程算法文件添加到目标应用中的μVision工程中.测试一个新的Flash编程算法在文件夹..\ARM\Flash\LPC_IAP_256\Test 下包含一个工程,它可以测试一个新的Flash编程算法.注意:新的Flash编程算法的生成需要RVCT的编译工具编译,例如可以用ADS, Realview MDK或者Realview DS 编译.使用GNU工具链不可能生成自己的Flash编程算法,然而,可以使用已存在的Flash 编程算法解决方法:这种情况一般是没有对总线等内部控制寄存器进行配置, 客户可以些一个初始化文件, 例如下面是针对S3C2410芯片和AM29160DB的Flash芯片进行配置的初始化文件:FUNC void Init_Board(void){_WWORD (0x53000000 ,0x00000000);_WWORD (0x4A000008 ,0xFFFFFFFF);_WWORD (0x4A00001C ,0x000007FF);_WWORD (0x4C000014 ,0x3);_WWORD (0x4C000004 ,0x0005c042);_WWORD (0x56000070 ,0x00280000);_WWORD (0x56000078 ,0x00000000);_WWORD (0x48000000 ,0x22111110);_WWORD (0x48000004 ,0x00000700);_WWORD (0x48000008 ,0x00000700);_WWORD (0x4800000C ,0x00000700);_WWORD (0x48000010 ,0x00000700);_WWORD (0x48000014 ,0x00000700);_WWORD (0x48000018 ,0x00000700);_WWORD (0x4800001c ,0x00018005);_WWORD (0x48000020 ,0x00000700);_WWORD (0x48000024 ,0x008e0459);_WWORD (0x48000028 ,0x000000B2);_WWORD (0x4800002c ,0x00000030);_WWORD (0x48000030 ,0x00000030);_WWORD (0x56000014 ,0x1);_WWORD (0x56000020 ,0xaaaa55aa);_WWORD (0x56000028 ,0xffff);_WWORD (0x56000024 ,0x0);}Init_Board();一般来说, 在烧写时,都应该有这样的一个初始化文件.解决方法:在图一中修改Flash存储芯片的映射地址. 图一中的Flash存储芯片为AM29F160DB, 存储容量为2M. 在公司的S3C2410开发板或者实验箱被映射到0x00000000处, 但是在LPC2138的开发板中被映射到地址0x80000000处, 所以要按图一的红色方框所示修改映射的起始地址.图一修改Flash存储芯片的映射地址解决方法:因为Realview MDK可以直接下载*.axf或者*.hex格式的文件,但是不能直接下载*.bin格式的文件,所以, 只能先将*.bin格式的文件转换成*.hex格式的文件,例如BIN2HEX工具可以转换(最大的转换容量为64K,如果超过这个容量,必须手动添加线型扩展地址或者找到更好的转换工具突破这个64K的限制).在转换的时候,一定要保证地址正确,否则将导致烧写不成功. 通过这种方法, 可以将启动代码(例如VIVI),Linux内核以及文件系统(例如CRAMFS),分扇区烧写到Flash存储芯片上.Realview MDK有两种类型的license,即单机版的LICENSE和浮动license.目前,公司只销售单机版的license,而公司内部使用的是浮动license,它允许25台计算机注册,但是只能有5台计算机同时使用,只有当正在使用浮动license计算机将license归还给服务器后,其他等待license的计算机才可以获得license而使用.在注册申请license时, 使用Realview MDK的计算机应该连接到英特网,并且在KEIL网站上填写注册信息的时候,邮箱一定不能填错, 因为license将发送到这个邮箱中. 如果使用Realview MDK的计算机没有联入因特网,也可以通过别的联网计算机在KEIL网站上注册,但是,必须注意,在填写CID时,必须是使用Realview MDK的那台计算机所生成的.当客户要升级Realview MDK时, 没有必要卸载Realview MDK, 只须覆盖安装即可. 如果客户想卸载Realview MDK(以便在另外一台计算机上安装使用),必须先卸载license. 万一客户没有卸载license,或者是由于客户的计算机的系统崩溃或硬件故障,导致Realview MDK不能使用,这时,只能向公司(目前由廖武负责)申请后台处理.还有一点需要说明一下,当客户卸载license后,只能在24小时以后在申请新的license, 也就是说,如果客户卸载license后,在本机重新申请或在其他计算机上申请时,最少要间隔24小时.解决方法:这种现象可能是由2中原因引起的: 第一, 没有调试初始化文件或设置不正确, 具体的格式参考问题三. 第二, 分散加载文件(链接脚本文件)的地址配置的不正确(即与开发板上的RAM地址映射不匹配). 分散加载文件的格式请参考问题八.程序正确编译生成目标文件以后, 就会链接成可执行的文件, 这个过程中要用到分散加载文件, 它决定可执行的代码在存储器中存放的位置, 这在复杂的程序(例如VIVI对Linux内核的引导)中是很重要的. 下面是一个简单的分散加载文件的例子:; *************************************************************; *** Scatter-Loading Description File generated by uVision ***; *************************************************************;Run in FlashLR_ROM1 0x00000000 { ; load regionER_ROM1 0x00000000 0x0200000 { ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO)}RW_RAM1 0x30000000 0x4000000 { ; RW data.ANY (+RW +ZI)}RW_IRAM1 0x40000000 0x00001000 {.ANY (+RW +ZI)}}在上面的例程中, 代码从地址0x00000000处开始存放,并且将RESET程序段放在最开始处, 而可读写的数据从地址0x30000000处开始存放. 分散加载文件的段的名字(例如LR_ROM1, ER_ROM1等)可以是任意的名字.RVCT3.0采用了POSIX格式的编译连接选项,所有的多字符选项前必须使用双下划线。