1、基于基于ARMARM的的 嵌入式软件开发嵌入式软件开发1.1.基于基于ARMARM的嵌入式系统软件开发流程的嵌入式系统软件开发流程2.ADS1.22.ADS1.2开发工具介绍开发工具介绍3.ARM3.ARM系统编程库系统编程库2.1 2.1 基于基于ARMARM的嵌入式系统的嵌入式系统软件开发流程软件开发流程 嵌入式软件开发流程工程建立源文件编译调试固化 汇编代码 *.sC程序 *.c链接脚本文件 *.ld存储映像文件*.map命令脚本文件*.cs软件开发的主要流程n操作的两个环节:q编辑与编译链接代码排错环节q软件代码Debug和固化环节nADS CodeWarrior IDE环境下进行编辑
2、、编译与排错;n在AXD环境下进行代码的固化与Debug。2.2 ADS 1.2 2.2 ADS 1.2 开发工具介绍开发工具介绍CodeWarrior IDEAXD DebugerCodeWarrior IDE 使用n1 建立新项目(Project)n2 添加源文件到项目中n3 设置项目的编译目标n4 编译该项目n5 Debug编译连接通过的项目1.建立新项目(Project)1.2 添加源文件到项目中3 设置项目的编译目标n选择 Project-Make菜单选项,完成下述功能:q编译新添加或修改过和touch过的源文件,产生ELF对象文件;q连接对象文件和库,产生一个ELF image文件
3、;q 执行postlink操作,如将ELF 映像文件用fromELF工具转换成另外一种格式;4 编译该项目5 Debug编译链接通过的项目n缺省情况下,IDE会调用AXD调试器对Make通过的ELF image文件进行debug。选择Project-Debug6 从命令行Building项目n1.从命令行来使用编译器Compiler nameCompiler variantSource languageCompiler output armccCC32-bit ARM codetccCC16-bit Thumb code armcppC+C or C+32-bit ARM codetcppC+
4、C or C+16-bit Thumb coden1).编译C文件 main.c:qarmcc-g-O1-c main.c (for ARM)qtcc-g-O1-c main.c (for Thumb)q其中:n-g compiler添加debug tables.n-O1 compiler 在维护足够的调试信息的同时采用最佳优化算法n-c compiler 只进行编译n2).链接映像文件qarmlink main.o-o embed.axf q其中:q-o 指定链接输出文件名 embed.axf.n3).用 armsd or AXD 载入映像进行调试运行6 从命令行Building项目n2.在
5、命令行使用汇编器qarmasm-list addreg.lst addreg.sqarmlink addreg.o-o addregq在Debugger中运行程序:narmsd addreg nstep2.AXD Debuger的使用运行程序添加断点添加观察点测试变量内容测试寄存器测试内存内容DEMO 程序功能介绍n是一个Benchmark 程序,用来测试系统的整形运算处理性能的高低。n用Dhrystone性能进行描述,计算方法如下:qDhrystones/秒=处理器时钟*执行次数)/运行时间n在Demo中,最小运行时间不能小于2秒钟。nMIPS:q业界用来衡量计算机系统性能的相对比较量。将V
6、AX 11/780 作为一个参考机,其性能为1 MIP.qVAX 11/780 每秒钟能够完成1757 Dhrystones.1 运行程序步骤n1.创建一个可执行的映像文件n2.运行 AXD,选择File Load ImageLoad Imagen3.选择 ExecuteExecute Go Go(或者按 F5),相关文件的处理器视图被打开,并在缺省断点处停止n4.若要重复执行程序,选择File Reload Current Image ,然后重复执行,然后重复执行 then repeat Steps 2,3步骤2 添加断点n1.选择File Reload Current Image ,n2.
7、选择 ExecuteExecute Go Go(或者按 F5),n3.添加断点的三种方法:q右键点击行,从弹出Menu中选 Toggle BreakpointToggle Breakpointq左键点击行,按F9,q双击行的Margin部分n4.选择 System Views BreakpointsSystem Views Breakpoints 编辑断点n5.按F5 恢复执行加断点后的程序2 添加断点n4.选择 System Views BreakpointsSystem Views Breakpoints 编辑断点q设置循环运行断点750次后触发断点,程序停止。qProcessor Vie
8、ws Variables,检查run_Index值。n5.按F5 恢复执行加断点后的程序3.添加观察点n1.选择File Reload Current Image n2.选择 ExecuteExecute Go Go(或者按 F5)到main()n3.按F5 执行到添加的断点n4.System Views WatchpointsSystem Views Watchpoints,在 WatchpointsWatchpoints system Viewsystem View中点右键,选AddAdd,对,对WatchpointsWatchpoints属性进行编辑。4.测试变量内容n1.使用使用Var
9、iables processor viewVariables processor view察看变量信息察看变量信息q1.1.选择选择File File Reload Current Image Reload Current Image q2.2.选择选择 Execute Go(Execute Go(或者按或者按 F5)F5),允许到缺省断点,允许到缺省断点MainMainq3.3.按按F5 F5 执行到断点执行到断点q4.4.Processor Views Processor Views Variables Variables 打开变量窗口。窗口中打开变量窗口。窗口中可以察看可以察看Local
10、Local和和GlobalGlobal等变量。等变量。q5.5.右击窗口,选右击窗口,选PropertiesProperties DecDec,显示变量十进制。,显示变量十进制。q6.6.按按F10F10,相当于选择,相当于选择Execute Execute StepStep单步执行,这时单步执行,这时每一步产生的变量变化将反映在每一步产生的变量变化将反映在variablesvariables窗口中窗口中5 测试变量内容(2)n2.察看变量的地址和内容察看变量的地址和内容q13.13.同前同前q4.4.Processor Views Processor Views Watch Watch 打开
11、打开WatchWatch窗口。窗口窗口。窗口可在多个可在多个TabTab页中察看变量内容页中察看变量内容q5.5.点右键,选点右键,选Add WatchAdd Watch,打开,打开Add WatchAdd Watch窗口,窗口,可以添加需要观察变量可以添加需要观察变量q6.6.按按F10F10,相当于选择,相当于选择Execute Execute StepStep单步执行,这单步执行,这时每一步产生的变量变化将反映在时每一步产生的变量变化将反映在variablesvariables窗口中窗口中6.测试寄存器n1.1.选择选择File File Reload Current Image Rel
12、oad Current Image n2.2.选择选择 Execute Go(Execute Go(或者按或者按 F5)F5),允许到缺,允许到缺省断点省断点MainMainn3.3.Processor Views Processor Views RegistersRegisters打开寄存器窗口打开寄存器窗口n4.4.按按F10F10单步执行,这时每一步产生的变量变化单步执行,这时每一步产生的变量变化将反映在将反映在registersregisters窗口中。窗口中。7.测试内存内容n1.1.选择选择File File Reload Current Image Reload Current
13、Image n2.2.选择选择 Execute Go(Execute Go(或者按或者按 F5)F5),允许到缺,允许到缺省断点省断点MainMainn3.3.按按F5 F5 执行到断点执行到断点n4.Processor Views Memoryn5.5.按按F10F10单步执行,这时每一步产生的变量变单步执行,这时每一步产生的变量变化将反映在化将反映在registersregisters窗口中。窗口中。8.修改内存内容n1.1.选择选择File File Reload Current Image Reload Current Image n2.2.选择选择 Execute Go(Execut
14、e Go(或者按或者按 F5)F5),允许到缺,允许到缺省断点省断点MainMainn3.3.从从Search Search Memory显示查找内存对话框显示查找内存对话框n4.双击内存窗口中的内容可以对其进行修改。双击内存窗口中的内容可以对其进行修改。n5.按按F5可按修改后的内容继续运行程序。可按修改后的内容继续运行程序。2.3 ARM2.3 ARM系统编程库环境系统编程库环境 1.标准ARM C/C+运行库2.Semihosting机制3.建立一个基于ARM C库的应用4.ARM的混合编程1.C/C+编程环境n如何能够在嵌入式系统开发中熟练正确的运用C语言开发高质量的应用程序是关键n嵌
15、入式应用开发经常会用到:q标准ARM库;q用户自定义库;qC与汇编的混合编程(ATPCS)2.标准ARM C/C+运行库nARM开发工具提供两个运行库:qANSIC C:提供ISO 的C库函数。库文件所在路径:安装目录libarmlibqC+:提供ISO C+标准库。库文件所在路径安装目录libcpplibn两个标准ARM库使用ARM的semihosted环境运行,如文件的I/O操作。nsemihosted环境对ARMulator和Multi-ICE等都提供支持2.标准ARM C/C+运行库nANSIC C库包含:q由ISO C library standard定义的函数.q在semihost
16、ed执行环境下用来实现C库函数的目标依赖的函数,可以根据应用的需要重新定义这些函数q被C/C+compilers使用的help函数.nC+库包含:q Rogue Wave Standard C+Library version 2.01.01qC+compiler使用的help函数q其它未被 Rogue Wave library支持的C+函数3.Semihosting 机制nARM目标的一个机制,联系应用代码到debuger所在宿主机的I/O请求。它允许C库函数使用主机上的显示和键盘功能。4.建立一个使用ARM C库的应用n使用 main()函数创建嵌入式应用程序.n自动创建一C or C+能执
17、行的环境,包括了以下操作:q创建一个 stackq如果需要,创建一个 heapq初始化一部分标准ARM C库中的函数n程序自动支持ISO-defined functions 的使用n能够捕获 runtime errors 和signals,还能够终止出错程序的执行或使程序正常退出。4.1 建立一个使用semihosted 环境应用n需要提供下面两者之一的执行环境:q使用缺省提供的标准 semihosting 函数,如ARMulator,Angel,and Multi-ICEq实现你自己的semihosting SWI 软中断处理4.2 建立一个non-semihosted 环境应用n1创建源代
18、码实现目标相关的应用n2.在源代码中添加_use_no_semihosting_swi 保护:q汇编中:添加 _use_no_semihosting_swiqC中添加#pragma import(_use_no_semihosting_swi).n3.把新对象链接到应用中。5.ARMC/C+库注意事项 nARM C/C+运行库是以二进制形式提供的n用户不能修改ARM C/C+运行库n一般情况下,在建立基于特定目标的应用程序时,只需要重新实现ARM C运行库中很少一部分函数6.用户自定义库nARM的库管理工具armar可以把一系列ELF对象文件收集到一起,并在库中进行维护。n对于特定目标的嵌入式
19、应用系统,用户自定义库是不可缺少的,一般针对特定硬件的底层应用的开发来编制驱动库函数。7.C与汇编混合编程及ATPCSn混合编程的两种方式:q内嵌汇编n适用于汇编代码简单的情况,可直接嵌入到C语言程序中q将C和汇编分别加到项目中,通过ATPCS来完成相互调用。n汇编代码复杂。8.1 内嵌汇编n语法格式:_asm(“汇编指令”)或者:_asm 指令1 指令nn特点q内嵌汇编的操作数可以是C语言的表达式,可以是char、short、int等类型的无符号数。qC程序中的标号可被内嵌的汇编指令使用q内嵌汇编不支持用于内存分配的伪操作8.2 ATPCSARM-Thumb Procedure Call Stantardn目的:q是单独编译的C语言程序和汇编语言程序之间能够互相调用。nATPCS 规定了子程序调用过程中:q寄存器使用规则q数据栈使用规则参数的传递规则总 结