嵌入式linuxC语言开发工具.ppt_第1页
嵌入式linuxC语言开发工具.ppt_第2页
嵌入式linuxC语言开发工具.ppt_第3页
嵌入式linuxC语言开发工具.ppt_第4页
嵌入式linuxC语言开发工具.ppt_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式应用程序设计 第二章 嵌入式Linux C语言程序开发工具,2,2.1嵌入式Linux下C语言概述 2.2 编辑器vim 2.3 编译器gcc 2.4 调试器GDB 2.5 make工程管理器 2.6 autotools(不讲) 2.7小结,本章课程:,3,2.1嵌入式Linux下C语言概述,嵌入式Linux程序设计以C语言为主体,还涉及到shell编程,php/python脚本编程等 C语言最早是由贝尔实验室的Dennis Ritchie为了UNIX的辅助开发而编写的,它是在B语言的基础上开发出来的。尽管语言不是专门针对UNIX操作系统或机器编写的,但它与UNIX系统的关系十分紧密。由于它的硬件无关性和可移植性,使C语言逐渐成为世界上使用最广泛计算机语言。 ANSI C标准,流行的C语言编译系统以它为基础,4,2.1 嵌入式Linux下C语言概述,C语言有如下特点: C语言是“中级语言”。它把高级语言的基本结构和语句与低级语言的实用性结合起来。可以像汇编语言一样对位、字节和地址进行操作。 C语言是结构化的语言。 C语言功能齐全。指针支持。 C语言可移植性强。,5,2.1嵌入式Linux下C语言概述,嵌入式Linux C程序开发环境 编辑器(vim) 编译链接器(gcc) 词法、语法和语义分析,中间代码的生成与优化,符号表管理,出错处理等 调试器(gdb) 项目管理工具(Make) 自动化控制与管理编译过程,使程序员将精力集中在代码编写上 善于调试代码,解决Bug是优秀程序员的必备能力,6,2.2 编辑器vim,2.2.1 vi的基本模式 2.2.2 vi的基本操作,7,2.2.1 vi的基本模式,标准模式(Normal mode) 通常进入vim后默认处于标准模式(或者称为命令模式)。在此模式下任何键盘的输入都是作为命令来对待。命令的输入通常是不回显的,只显示执行的结果。 插入模式(Insert Mode) 用户只有在插入模式下才可以进行字符输入,用户按Esc键可回到命令行模式下。 命令行模式(Command-line mode) 在此模式下,用户可以将文件保存或退出vim,也可以设置编辑环境,如寻找字符串、列出行号等。 可视模式(Visual mode) 在此模式下,通过移动光标选择文本,选中的文本将反白显示,这样提供高效、直观的编辑功能。用户按下ESC键可回到命令行模式。,8,2.2.2 vi的基本操作,1. vim的进入、保存和退出 进入vim可以直接在命令终端下键入vim 文件名,vim可以自动载入所要编辑的文件或是开启一个新的文件。如在shell中键入vim hello.c(新建文件)则可进入vim环境。进入vi后屏幕左方会出现波浪符号,凡是具有该符号就代表此列目前是空的。此时进入的是命令行模式。 要退出vim可以在命令行模式下键入“:q”(不保存并退出)或“:q!”(不保存并强制退出)或“:wq”(保存并退出)指令则是保存之后再离开(注意冒号)。,9,2.2.2 vi的基本操作,10,2.2.2 vi的基本操作,2. 光标的移动 除了使用标准光标键移动光标之外,vim还提供了很多复杂的光标移动方式。,11,2.2.2 vi的基本操作,3. 文本编辑 文本编辑包括输入、修改、复制、粘贴、删除(可以用Del键和Backspace键)和恢复等操作 。,12,2.2.2 vi的基本操作,4. 查找与替换 vim的查找和替换功能都支持正则表达式,可以匹配非常复杂的关键字,功能非常强大。,13,Vim的使用技巧重在积累,14,2.3 编译器gcc,2.3.1 GCC的简介 2.3.2 GCC的编译流程 2.3.3 GCC的常用编译选项,15,2.3.1 GCC的简介,GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C+和Object C等语言编写的程序。gcc不仅功能强大,而且可以编译如C、C+、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言 gcc又是一个交叉平台编译器,支持的硬件平台很多,如alpha、arm、avr、hppa、i386、m68k、mips、powerpc、sparc、vxworks、x86_64、MS Windows、OS/2等等。它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。,16,2.3.1 GCC的简介,gcc的编译流程分为了4个步骤,分别为: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking),17,18,2.3.1 GCC的简介,GCC使用的基本语法为: gcc option | filename,19,2.3.2 GCC的编译流程,预处理阶段 处理的主要作用是通过预处理的内建功能对一些可预处理资源进行等价替换,最常见的可预处理资源有:文件包含、条件编译、布局控制和宏处理等。,20,文件包含:#include是最为常见的预处理,主要将指定的文件代码组合到源程序代码之中。 条件编译:#if、#ifdef、#ifndef、#if defined、#endif、#undef等也是常用的预处理,主要是在编译时进行选择性编译,有效地控制版本和编译范围,防止对文件的重复包含等重要功能。 布局控制:#progma功能因后面的参数不同而不同,例如 使用#progma pack(1)可以内存变量的1个字节对齐,使得结构变量的成员分配到连续的内存块,等价于_attribute_(packed)。 宏替换:#define的主要功能是定义符号常量、函数功能、重新命名、字符串符号的拼接等各种功能。 其他的预处理有:#line是用于修改预定义宏_LINE_(当前所在的行号)和_FILE_(当前源文件的文件名);#error / #warning分别用于输出一个错误/警告信息;等等。,21,gcc的选项“-E”可以使编译器在预处理结束时就停止编译,选项“-o”是指定GCC输出的结果,其命令格式为如下所示。 gcc E o 目标文件 编译文件 例如: $ gcc E o hello.i hello.c 查看hello.i,分析宏处理,22,2.3.2 GCC的编译流程,编译阶段 编译器在预处理结束之后,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,就开始把代码翻译成汇编语言,gcc的选项“-S”能使编译器在进行汇编之前就停止。 由表2.6可知,“.s”是汇编语言原始程序,因此,此处的目标文件就可设为“.s”类型。 $ gcc S o hello.s hello.i,23,2.3.2 GCC的编译流程,汇编阶段 汇编阶段是把编译阶段生成的“.s”文件生成目标文件,读者在此使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。如下所示。 $ gcc c hello.s o hello.o,24,2.3.2 GCC的编译流程,链接阶段。 完成了链接之后,gcc就可以生成可执行文件,其命令如下所示。 $ gcc hello.o o hello 运行该可执行文件,出现正确的结果。 $ ./hello hello, embedded world 库函数printf的实现在libc.so.6中 最简单的程序也用到了系统函数库(C运行时库) 理解这个编译的过程是撰写Makefile的基础,25,2.3.3 gcc的常用编译选项,gcc有超过100个的可用选项,包括总体选项、警告和出错选项、优化选项和体系结构等相关选项。 (1)常用选项,26,-I的理解 改为:#include “my.h”,27,2.3.3 gcc的常用编译选项,(2)库相关选项,28,使用函数库作为程序模块,动态库重用性强,升级方便 函数库能够节省内存和存储器的资源 静态库(.a后缀)是一系列的目标文件的归档,静态链接时,静态库中的目标文件会被复制到程序的可执行文件中去 动态库(libname.so.major.minor.release)不具有“复制”操作,程序运行时载入。动态库可以实现共享,也称为共享库,易于升级,29,静态库例子 动态库例子 动态库的搜索路径,LD_LIBRARY_PATH环境变量,/etc/ld.so.conf 软件依赖库,xxx-devel.rpm,包含了头文件和库文件 理解-I,-L非常重要,30,2.3.3 gcc的常用编译选项,(3)警告和出错选项,31,写代码过程中,消除所有警告,保证代码规范,32,2.3.3 gcc的常用编译选项,(4)优化选项 gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3 开发调试过程中,关闭优化 产品最终发行时,开启优化,33,2.3.3 gcc的常用编译选项,(5)体系结构相关选项,34,2.4 调试器GDB,GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具,它是一种强大的命令行调试工具。一个合格的调试器需要有以下几项基本功能。 能够运行程序,设置所有能影响程序运行的参数。 能够让程序让指定的条件下停止。 能够在程序停止时检查所有参数的情况。 能够根据指定条件改变程序的运行。 Debug是一门艺术,35,2.4.1 gdb使用流程,进入GDB gdb test 查看文件l 设置断点 b 6 查看断点处情况 info b 运行代码 r 查看变量值 p n / p i 单步运行 n 恢复程序运行 c 观察变量 watch n 退出GDB q,36,例子,37,2.4.2 gdb基本命令,1工作环境相关命令,38,2.4.2 gdb基本命令,2设置断点与恢复命令,39,2.4.2 gdb基本命令,3gdb中源码查看相关命令,40,2.4.2 gdb基本命令,4gdb中查看运行数据相关命令,41,f ormat: x, u, d, o, s, Size (单位) u, b, h, w, g,42,2.4.2 gdb基本命令,5gdb中修改运行参数相关命令 gdb还可以修改运行时的参数,并使该变量按照用户当前输入的值继续运行。它的设置方法为:在单步执行的过程中,键入命令“set 变量设定值”。,43,2.4.3 gdbserver远程调试,使用交叉调试工具实现远程调试。 gdb调试器提供了两种不同的远程调试方法,即stub(插桩)方式和gdbserver方式。 gdbserver本身的体积很小,能够在具有很小内存的目标系统上独立运行,因而非常适合嵌入式开发。 stub方式则需要通过链接器把调试代理和要调试的程序链接成一个可执行的应用程序文件,而且stub需要修改异常处理和驱动程序等。 gdbserver要求宿主机和目标系统采用同一系列的操作系统,而stub没有这种限制,甚至目标系统可以没有操作系统。gdbserver比较适合于调试嵌入式平台上的应用程序,而stub比较适合于调试bootloader和内核等系统程序。,44,2.4.3 gdbserver远程调试,用gdb+gdbserver的方式调试嵌入式平台上的Linux应用程序 安装arm-linux-gdb 安装gdbserver 远程调试 上机过程中演示讲解,45,2.5 make工程管理器,2.5.1 Makefile基本结构 2.5.2 Makefile变量 2.5.3 Makefile规则 2.5.4 make管理器的使用,46,大的代码量(*.c,*.h) 希望有一个方法,可以自动识别发生更新的文件,避免输入繁琐的命令来完成编译 让程序员把注意力放在“代码本身”,而不是“编译代码”上,47,2.5.1 Makefile基本结构,在一个Makefile中通常包含如下内容。 需要由make工具创建的目标体(target),目标体通常是目标文件、可执行文件或是一个标签。 要创建的目标体所依赖的文件(dependency_file)。 创建每个目标体时需要运行的命令(command)。 它的格式为: target: dependency_files command command必须与Tab键开头 执行make与make target_name Makefile 与 makefile,48,P43的例子 分析依赖关系,49,Makefile中的变量 自定义变量 预定义变量 自动变量 环境变量 变量名 变量名能包含“:” “#” “=” 如何引用变量名 “=” 与 “:=”,50,2.5.2 Makefile变量,Makefile中常见预定义变量,51,2.5.2 Makefile变量,Makefile中常见自动变量,52,2.5.3 Makefile规则,隐式规则 隐含规则能够告诉make怎样使用传统的技术完成任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列出即可。make会自动搜索隐式规则目录来确定如何生成目标文件。 make的隐式规则指出:所有“.o”文件都可自动由“.c”文件使用命令“$(CC) $(CPPFLAGS) $(CFLAGS) -c file.c o file.o”生成 。,53,2.5.3 Makefile规则,隐式规则,Makefile中常见隐式规则目录,一个.c 对应 一个 .h,54,2.5.3 Makefile规则,模式规则 模式规则不同于隐式规则,是用来定义相同处理规则的多个文件的,模式规则能引入用户自定义变量,为多个文件建立相同的规则,简化Makefile的编写。 模式规则的格式类似于普通规则,这个规则中的相关文件前必须用“%”标明。,OBJS = kang.o yul.o CC = gcc CFLAGS = -Wall -O -g david : $(OBJS) $(CC) $ -o $ %.o : %.c $(CC) $(CFLAGS) -c $ -o $,55,2.5.4 make使用,56,Iptraf软件的Makefile,57,在网上查询一下,如何写一个智能的Makefile,添加一个.c文件与.h文件,无需编辑Makefile 用Make管理大型项目是比较复杂的,支持协同开发 Shell脚本 环境变量,58,Linux下的GNU软件大都用autotools来制作Makefile 自己动手编译一个软件源代码 解压 ./configure 收集系统信息,定制配置(./configure help) 生成Makefile config.log,config.h make make install make clean make dist,59,2.7 实验内容,2.7.1 vim使用练习 2.7.2 用gdb调试程序的bug 2.7.3 编写包含多文件的makefile,60,2.7.1 vim使用练习,实验目的 通过指定指令的vim操作练习,使读者能够熟练使用vim中的常见操作,并且熟悉vim的几种模式,如果读者能够熟练掌握实验内容中所要求的内容,则表明对vim的操作已经很熟练了。 实验内容,(11)将光标移动到最后一行的行尾。 (12)粘贴复制行的内容。 (13)光标移到“si:sysinit:/etc/rc.d/rc.sysinit”。 (14)删除该行。 (15)存盘但不退出。 (16)将光标移到首行。 (17)插入模式下输入“Hello,this is vi world!”。 (18)返回命令行模式。 (19)向下查找字符串“0:wait”。 (20)再向上查找字符串“halt”。 (21)强制退出vim,不存盘。,(1)在“/root”目录下建一个名为“vim”的目录。 (2)进入“vim”目录。 (3)将文件“/etc/inittab”复制到“vim”目录下。 (4)使用vim打开“vim”目录下的inittab。 (5)设定行号,指出设定initdefault(类似于“id:5:initdefault”)的所在行号。 (6)将光标移到该行。 (7)复制该行内容。 (8)将光标移到最后一行行首。 (9)粘贴复制行的内容。 (10)撤销第9步的动作。,分别指出每个命令处于何种模式下?,61,2.7.2 用gdb调试程序的bug,实验目的 通过调试一个有问题的程序,使读者进一步熟练使用vi操作,而且熟练掌握gcc编译命令及gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,希望读者认真调试。 实验内容 (1)使用vi编辑器,将以下代码输入到名为greet.c的文件中。 (2)使用gcc编译这段代码,注意要加上“-g”选项以方便之后的调试。 (3)运行生成的可执行文件,观察运行结果。 (4)使用gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。 (5)纠正错误,更改源程序并得到正确的结果。,62,2.7.3 编写包含多文件的makefile,实验目的 通过对包含多文件的makefile的编写,熟悉各种

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论