2.17k likes | 2.33k Views
嵌入式系统程序设计. 大连理工大学软件学院 嵌入式系统工程系 赖晓晨. 高级语言编写 的源代码文件 主机系统 目标处理器的 汇编语言编写 的源代码文件. 交叉编译器. 目标文件. 目 标 系 统. 连接器 / 加载器. 目标文件. 交叉汇编器. 目标文件. 交叉开发环境. 嵌入式系统软件开发流程. 嵌入式系统开发工具链. ★. ★. ★. ★. 嵌入式系统开发工具链概述 交叉开发环境的建立. 开发环境分类. 开发环境分类: 运行平台:本地开发环境、交叉开发环境 商业角度:收费工具、免费工具. GNU 工具链.
E N D
嵌入式系统程序设计 大连理工大学软件学院 嵌入式系统工程系 赖晓晨
高级语言编写 的源代码文件 主机系统 目标处理器的 汇编语言编写 的源代码文件 交叉编译器 目标文件 目 标 系 统 连接器/ 加载器 目标文件 交叉汇编器 目标文件 交叉开发环境 嵌入式系统软件开发流程
嵌入式系统开发工具链 ★ ★ ★ ★ • 嵌入式系统开发工具链概述 • 交叉开发环境的建立
开发环境分类 • 开发环境分类: • 运行平台:本地开发环境、交叉开发环境 • 商业角度:收费工具、免费工具
GNU工具链 • GNU工具链: • GNU Tools:全称(GNU Development Toolchains) • GNU Tools交叉开发环境:全称(GNU Cross-Plateform Development Toolchains) • GNU既支持本地程序开发,又支持交叉编译
GNU开发工具简介 • GNU开发工具 • 自由软件 • 完备的工具链: GCC、binutils、gdb、GNU make、patch、CVS 、开发库 • 命令行方式:使用稍复杂、功能强大 • 下载: www.gnu.org
ARM平台GNU开发工具(续) • 基于ARM9平台的GNU开发工具(linux) • arm-linux-as • arm-linux-gcc • arm-linux-g++ • arm-linux-ld • arm-linux-objcopy • 下载:www.arm.linux.org.uk
GNU Tools开发工具组成 • GNU Tools是linux环境下最主要的开发工具集,主要有以下几个部分: • 编译开发工具:把源程序编译为可执行文件,如gcc。 • 调试工具:对执行程序进行源码或汇编级调试的软件,如gdb。 • 软件工程工具:用于协助多人开发或大型软件项目的管理的软件,如make、cvs等。
一、Linux开发工具链简介 1. GCC(GNU Compiler Collection) • 支持C、C++、ADA、Object C、Java、Fortran、PASCAL等语言。 • 主要包括: • cpp:GNU C编译器的预处理器。 • gcc:符合ISO标准的C编译器。 • g++:基本符合ISO标准的C++编译器。 • gcj:GCC的java前端。 • gnat:GCC的GNU ADA 95的前端。
一、Linux开发工具链简介 2. binutils • 是一组二进制工具程序集合,是辅助GCC的主要软件。 • 主要包括: • as:GNU汇编器 • ld:GNU链接器 • ar:创建归档文件,向库中添加/提取obj文件 • nm:列出obj文件中的符号 • objcopy:复制和转化obj文件
一、Linux开发工具链简介 2. binutils • 主要包括: • objdump:显示对象文件的信息 • ranlib:根据归档文件中内容建立索引 • readelf:显示elf格式执行文件中的各种信息 • size:显示object文件和执行文件各段的总大小 • strings:显示文件中可以打印的字符 • strip:去掉执行文件中多余的信息(如调试信息) • gprof:用来显示图表档案数据
一、Linux开发工具链简介 • gdb:GNU调试器。可以用来调试C、C++和其他语言编写的程序。如加一些图形前端(如DDD),可以在图形环境下调试程序。 • GNU make:是一个用来控制可执行程序生成过程、从其他源码文件中生成可执行程序的程序。它允许用户生成和安装软件包,而无需了解生成、安装软件包的过程。
一、Linux开发工具链简介 • diff/diff3/sidff:比较文本差异的工具,也可以用来生成补丁。 • patch:补丁安装程序,可根据diff生成的补丁来更新程序 • 版本控制系统:可以帮助管理程序的历史版本。 • RCS(Revision Control System) • CVS(Concurrent Version System) • SVN(Subversion)
ARM平台GNU开发工具 • 基于ARM7平台的GNU开发工具(uclinux) • arm-elf-as • arm-elf-gcc • arm-elf-g++ • arm-elf-ld • arm-elf-objcopy
二、GNU交叉开发环境的建立 • 编译源码配置安装GNU交叉开发环境。 • 源码包下载 • 解压缩 • 建立配置目录 • 配置 • 直接安装二进制形式的工具链 • 编译 • 安装 • 测试
二、GNU交叉开发环境的建立(续) • 1. 从GCC的网(http://gcc.gnu.org/)下载资源 • 供下载的文件有两种形式(格式不同,内容一致): gcc-4.1.1.tar.gz gcc-4.1.1.tar.bz2
二、GNU交叉开发环境的建立(续) • 2. 解压缩 • 在当前目录下生成名为gcc-4.1.1的源码目录 • 文件gcc-4.1.1/INSTALL/index.html包含了安装gcc4.1.1的详细说明。
二、GNU交叉开发环境的建立(续) • 3. 建立配置目录 • 建立一个和目录gcc-4.1.1同级的目录,命名为gcc-conf,作为保存配置文件的目录
二、GNU交叉开发环境的建立(续) • 4. 配置 • 配置通过执行如下脚本 • cd gcc-conf • ../gcc-4.1.1/configure --prefix=/usr/local/gcc-4.1.1 --enable-threads --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-language=c,c++
二、GNU交叉开发环境的建立(续) • 5. 编译 • 在配置目录下执行make命令 • 6. 安装 • 在配置目录下执行make install指令,即可将编译好的可执行文件复制到安装目录下
二、GNU交叉开发环境的建立(续) • 7. 测试 • 切换到安装目录下,执行./gcc,显示"no input file",表示安装成功 • 对于编译好的工具链来说 • 图见下页 #mkdir -p /usr/local/arm #cd /usr/local/arm #tar -xjvf cross-2.95.3.tar.bz2 #./arm-linux-gcc -v
编辑器 ★ ★ • 操作模式 • 进入和退出vi • 光标移动 • 删除文本 • 查找和替换 • 复制和粘贴 • 保存文本块 • 与shell交互
vi简介 • linux编辑器:ex、edit、ed、vi、emacs • vi(visual interface):是一个功能强大的,快速命令驱动的全屏幕编辑器。类比DOS的edit • vi和vim
一、操作模式 • vi具有两种基本的操作模式 • 命令模式(指令模式):此模式下的按键当作指令来处理。 • 输入模式:可进行文本的录入。
一、操作模式(续) • 切换到输入模式的命令(输入文本位置不同) • 新增:‘a’,从从当前光标之后输入文本。‘A’,从光标所在行末尾输入新的文本。 • 插入:‘i’,从光标前开始插入文本。‘I’,从光标所在行的第一个非空格字符前开始插入文本。 • 开始:‘o’,从光标所在行下新增一行并进入输入模式。‘O’,从光标所在行上新增一行并进入输入模式。 • 从输入模式按esc进入命令模式
二、进入和退出vi • 进入vi,在提示符下: • vi • vi 文件名 • 退出vi,在指令模式下: • :q,退出 • :wq,存盘后退出 • :q!,不存盘强制退出 • :x,强制存盘退出 以冒号开始的命令要回车后才能执行
三、光标移动 • 基本移动: • h:向左移动一列 • j或+ :向下移动一列 • k或-:向上移动一列 • l:向右移动一列 • nh,nj,nk,nl表示按某方向移动n行(列),任何模式下,方向箭头可以控制方向
三、光标移动(续) • 移动多个位置: • :n回车:将光标移动到第n行 • :$回车或L:将光标移动到最后一行 • M:将光标移动到当前屏幕中央行 • H:将光标移动到当前屏幕第一行
三、光标移动(续) • 按单词移动: • w:将光标移动到下一个单词头 • b:将光标移动到前一个单词头 • e:将光标移动到下一个单词尾 • 组合:nw、nb、ne
三、光标移动(续) • 按字符移动: • $:将光标移动到当前末尾 • ^或0:将光标移动到当前行首 • n|:将光标移动到当前行的第n个字符 • fm:将光标移动到当前行的下一个字符m处 • 光标返回原处 • 两个单引号‘’
三、光标移动(续) • 翻页: • Ctrl+d:下翻半屏 • Ctrl+u:上翻半屏 • Ctrl+f:下翻一屏 • Ctrl+b:上翻一屏 • 显示和取消行号 • :set number:显示行号 • :set nonumber:取消显示行号
四、删除文本 • 指令模式下: • x:删除光标处的一个字符 • dd:删除光标所在行 • r:修改光标所在字符 • R:进入改写状态 • s:删除光标所在字符,并进入输入状态 • S:删除光标所在行,并进入输入状态
四、删除文本(续) • 指令模式下: • dw:删除单词 • D:删除从光标到行末的所有字符 • dfm:删除从光标到第一个字符m间的文本 • :nd:删除第n行 • :n,$d:删除从第n行到最后一行,n为数字
五、查找和替换 • 指令模式下: • /string:从当前位置向前查找字符串string • ?string:从当前位置向后查找字符串string • 继续查找: • n:沿前述查找方向继续查找同一字符串 • N:沿前述查找方向的反方向继续查找同一字符串
五、查找和替换(续) • 继续查找: • rm:替换当前字符为m,替换后仍为命令模式 • R:替换当前字符后的一系列字符,替换后变为输入模式 • s:多个字符替换单个字符 • cw:单词替换 • cc:行替换 • C:替换当前行剩余部分 • cfm:低缓当前字符到指定的字符m
六、复制和粘贴 • 指令模式下: • yy:复制当前行 • dd:剪切当前行(删除) • p、P:粘贴剪切板上的内容到当前行位置
六、复制和粘贴(续) • 指令模式下: • 把某(几)行复制并粘贴到某行后 :mcopyn 把m行复制并粘贴到第n行后 :m,ncopy $ 把m-n行复制并粘贴到末行后 :.,$ copy 0 把当前行到末行复制并粘贴到文件头 • 把copy改为move即为移动文本块
七、保存文件块 • 指令模式下: • 保存文本块 :m,n write file:把第m到第n行另存为文件file • 保存文本块,并直接覆盖掉已有(如果有)文件 :n write! file 把第n行强行另存为文件file • 向文件追加文本 :n write >> file 把第n行追加到文件file末尾
八、与shell交互 • 指令模式下: • 读某文件的内容到当前打开文件 :n read a 把文件a中的内容读到当前打开文件的第n行后 • 在vi中执行shell命令 :!pwd • 在vi中执行shell命令,并把结果添加到vi中 :n read! pwd 把pwd执行结果插入到第n行后
gcc编译器 ★ ★ ★ • GCC简介 • gcc的基本用法 • 警告提示功能 • 代码优化 • 常用选项
一、GCC简介 • GCC:GNU Compiler Collection • 能够编译c、c++、Object C, 通过前端模块扩展还可支持java、fortran、pascal、ada、modula-3等。 • 提供了30多条警告信息和3个警告级别 • gcc与g++
A. GCC简介 • GCC:GNU Compiler Collection • 能够编译c、c++、Object C, 通过前端模块扩展还可支持java、fortran、pascal、ada、modula-3等。 • 提供了30多条警告信息和3个警告级别 • gcc与g++ gcc和g++的区别在于: 当你的程序中出现using namespace std等带有C++特性的语句时,如果用gcc编译,必须显式指明这个程序要用C++标准库编译。而g++可以直接编译
C. gcc是高效的编译器 #include <stdio.h> main() { printf("hello world\n"); } g++编译后 4.6k tc++3编译后 7.8k bc45编译后 53.8k vc6编译后 184k
D. 编译过程 • 用gcc编译程序时,分为四个阶段: • 预处理(pre-processing) • 编译(compiling) • 汇编(assembling) • 链接(linking) • 程序员可以根据需要在任何一阶段停止
二、gcc的基本用法 • 语法格式: • gcc [option] [filenames] • option为编译器所需要的选项,filenames为相关文件名称 • 举例(单文件) • gcc -o hello hello.c • 把hello.c文件编译为hello
二、gcc的基本用法(续) • 举例(多文件) • gcc m1.c m2.c -o hello • 把源文件m1.c和m2.c编译链接为可执行文件hello