540 likes | 683 Views
回 顾. 第二章 基于 ARM 的 嵌入式软件开发. 1. 基于 ARM 的嵌入式系统软件开发流程 2. ADS1.2 开发工具介绍 3. ARM 系统编程库. 2.1 基于 ARM 的嵌入式系统软件开发流程. 嵌入式软件开发流程. 工程建立. 汇编代码 * .s. 源文件. C 程序 * .c. 编译. 链接脚本文件 * .ld. 存储映像文件 * .map. 调试. 命令脚本文件 * .cs. 固化. 软件开发的主要流程. 操作的两个环节: 编辑与编译链接代码排错环节 软件代码 Debug 和固化环节
E N D
第二章 基于ARM的 嵌入式软件开发 1. 基于ARM的嵌入式系统软件开发流程 2. ADS1.2开发工具介绍 3. ARM系统编程库
嵌入式软件开发流程 工程建立 汇编代码 *.s 源文件 C程序 *.c 编译 链接脚本文件 *.ld 存储映像文件 *.map 调试 命令脚本文件 *.cs 固化
软件开发的主要流程 • 操作的两个环节: • 编辑与编译链接代码排错环节 • 软件代码Debug和固化环节 • ADS CodeWarrior IDE环境下进行编辑、编译与排错; • 在AXD环境下进行代码的固化与Debug。
2.2 ADS 1.2 开发工具介绍 CodeWarrior IDE AXD Debuger
CodeWarrior IDE 使用 • 1 建立新项目(Project) • 2 添加源文件到项目中 • 3 设置项目的编译目标 • 4 编译该项目 • 5 Debug编译连接通过的项目
4 编译该项目 • 选择 Project ->Make菜单选项,完成下述功能: • 编译新添加或修改过和touch过的源文件,产生ELF对象文件; • 连接对象文件和库,产生一个ELF image文件; • 执行postlink操作,如将ELF 映像文件用fromELF工具转换成另外一种格式;
5 Debug编译链接通过的项目 • 缺省情况下,IDE会调用AXD调试器对Make通过的ELF image文件进行debug。选择Project ->Debug
6 从命令行Building项目 • 1. 从命令行来使用编译器
1). 编译C文件 main.c : • armcc -g -O1 -c main.c (for ARM) • tcc -g -O1 -c main.c (for Thumb) • 其中: • -g compiler添加debug tables. • -O1 compiler 在维护足够的调试信息的同时采用最佳优化算法 • -c compiler 只进行编译 • 2). 链接映像文件 • armlink main.o -o embed.axf • 其中: • -o 指定链接输出文件名 embed.axf. • 3). 用 armsd or AXD 载入映像进行调试运行
6 从命令行Building项目 • 2. 在命令行使用汇编器 • armasm -list addreg.lst addreg.s • armlink addreg.o -o addreg • 在Debugger中运行程序: • armsd addreg • step
2. AXD Debuger的使用 运行程序 添加断点 添加观察点 测试变量内容 测试寄存器 测试内存内容
是一个Benchmark 程序, 用来测试系统的整形运算处理性能的高低。 用Dhrystone性能进行描述,计算方法如下: Dhrystones/秒=处理器时钟 * 执行次数)/运行时间 在Demo中,最小运行时间不能小于2秒钟。 MIPS△: 业界用来衡量计算机系统性能的相对比较量。将VAX 11/780 作为一个参考机,其性能为1 MIP. VAX 11/780 每秒钟能够完成1757 Dhrystones . DEMO 程序功能介绍
1 运行程序步骤 • 1. 创建一个可执行的映像文件 • 2. 运行 AXD, 选择File→ Load Image • 3. 选择 Execute → Go (或者按 F5),相关文件的处理器视图被打开,并在缺省断点处停止 • 4. 若要重复执行程序,选择File → Reload Current Image,然后重复执行then repeat Steps 2,3步骤
2 添加断点 • 1. 选择File → Reload Current Image, • 2.选择 Execute → Go (或者按 F5), • 3.添加断点的三种方法: • 右键点击行,从弹出Menu中选 Toggle Breakpoint • 左键点击行,按F9, • 双击行的Margin部分 • 4.选择 System Views →Breakpoints编辑断点 • 5. 按F5 恢复执行加断点后的程序
2 添加断点 • 4.选择 System Views →Breakpoints编辑断点 • 设置循环运行断点750次后触发断点,程序停止。 • Processor Views → Variables ,检查run_Index值。 • 5. 按F5 恢复执行加断点后的程序
3. 添加观察点 • 1.选择File → Reload Current Image • 2.选择 Execute → Go (或者按 F5)到main() • 3. 按F5 执行到添加的断点 • 4. System Views →Watchpoints,在Watchpoints system View中点右键,选Add,对Watchpoints属性进行编辑。
4. 测试变量内容 • 1. 使用Variables processor view察看变量信息 • 1.选择File → Reload Current Image • 2.选择 Execute → Go (或者按 F5),允许到缺省断点Main • 3. 按F5 执行到断点 • 4. Processor Views → Variables打开变量窗口。窗口中可以察看Local和Global等变量。 • 5.右击窗口,选Properties…→Dec,显示变量十进制。 • 6.按F10,相当于选择Execute → Step单步执行,这时每一步产生的变量变化将反映在variables窗口中
5 测试变量内容(2) • 2. 察看变量的地址和内容 • 1~3. 同前 • 4. Processor Views → Watch打开Watch窗口。窗口可在多个Tab页中察看变量内容 • 5.点右键,选Add Watch,打开Add Watch窗口,可以添加需要观察变量 • 6.按F10,相当于选择Execute → Step单步执行,这时每一步产生的变量变化将反映在variables窗口中
6. 测试寄存器 • 1.选择File → Reload Current Image • 2.选择 Execute →Go (或者按 F5),允许到缺省断点Main • 3.Processor Views →Registers打开寄存器窗口 • 4.按F10单步执行,这时每一步产生的变量变化将反映在registers窗口中。
7. 测试内存内容 • 1.选择File → Reload Current Image • 2.选择 Execute → Go (或者按 F5),允许到缺省断点Main • 3. 按F5 执行到断点 • 4. Processor Views → Memory • 5.按F10单步执行,这时每一步产生的变量变化将反映在registers窗口中。
8. 修改内存内容 • 1.选择File → Reload Current Image • 2.选择 Execute → Go (或者按 F5),允许到缺省断点Main • 3. 从Search → Memory显示查找内存对话框 • 4. 双击内存窗口中的内容可以对其进行修改。 • 5. 按F5可按修改后的内容继续运行程序。
2.3 ARM系统编程库环境 1. 标准ARM C/C++运行库 2. Semihosting机制 3. 建立一个基于ARM C库的应用 4. ARM的混合编程
1. C/C++ 编程环境 • 如何能够在嵌入式系统开发中熟练正确的运用C语言开发高质量的应用程序是关键 • 嵌入式应用开发经常会用到: • 标准ARM库; • 用户自定义库; • C与汇编的混合编程(ATPCS)
2. 标准ARM C/C++运行库 • ARM开发工具提供两个运行库: • ANSIC C:提供ISO 的C库函数。库文件所在路径: 安装目录\lib\armlib • C++ :提供ISO C++ 标准库。库文件所在路径 安装目录\lib\cpplib • 两个标准ARM库使用ARM的semihosted环境运行,如文件的I/O操作。 • semihosted环境对ARMulator和Multi-ICE等都提供支持
ANSIC C库包含: 由ISO C library standard定义的函数. 在semihosted执行环境下用来实现C库函数的目标依赖的函数,可以根据应用的需要重新定义这些函数 被C / C++ compilers使用的help函数. C++ 库包含: Rogue Wave Standard C++ Library version 2.01.01 C++ compiler使用的help函数 其它未被 Rogue Wave library支持的C++ 函数 2. 标准ARM C/C++运行库
3. Semihosting 机制 • ARM目标的一个机制,联系应用代码到debuger所在宿主机的I/O请求。它允许C库函数使用主机上的显示和键盘功能。
4. 建立一个使用ARM C库的应用 • 使用 main()函数创建嵌入式应用程序. • 自动创建一C or C++ 能执行的环境,包括了以下操作: • 创建一个 stack • 如果需要,创建一个 heap • 初始化一部分标准ARM C库中的函数 • 程序自动支持ISO-defined functions 的使用 • 能够捕获 runtime errors 和signals ,还能够终止出错程序的执行或使程序正常退出。
4.1 建立一个使用semihosted 环境应用 • 需要提供下面两者之一的执行环境: • 使用缺省提供的标准 semihosting 函数 ,如ARMulator, Angel, and Multi-ICE • 实现你自己的semihosting SWI 软中断处理
4.2 建立一个non-semihosted 环境应用 • 1创建源代码实现目标相关的应用 • 2. 在源代码中添加__use_no_semihosting_swi 保护: • 汇编中:添加 __use_no_semihosting_swi • C中添加 #pragma import(__use_no_semihosting_swi). • 3.把新对象链接到应用中 。
5. ARMC/C++库注意事项 • ARM C/C++运行库是以二进制形式提供的 • 用户不能修改ARM C/C++运行库 • 一般情况下,在建立基于特定目标的应用程序时,只需要重新实现ARM C运行库中很少一部分函数
6. 用户自定义库 • ARM的库管理工具armar可以把一系列ELF对象文件收集到一起,并在库中进行维护。 • 对于特定目标的嵌入式应用系统,用户自定义库是不可缺少的,一般针对特定硬件的底层应用的开发来编制驱动库函数。