嵌入式系统开发工具.ppt
嵌入式Linux系统开发工具,课程安排,Linux常用命令Linux上程序编写Linux上程序编译Linux上程序调试嵌入式Linux交叉开发过程,Linux常用命令,用户切换,变更用户:su+用户名;不加用户名默认为root用户,用户管理,添加用户账号:useradd+用户名更改对于用户的账号密码:passwd+用户名更方便直接的方法是在图形界面下维护用户信息,Linux常用命令,系统管理命令,显示系统进程列表ps el:显示所有进程及PID、时间、程序名、执行者等信息ps aux:除了-el内容外,还显示CPU、内存占用率、进程状态 终止、挂起进程kill+PID:杀死PID对应进程kill-9+PID:强制杀死PID对应进程killall+程序名:杀死程序对应的运行进程ctrl+c:终止当前控制台运行的程序ctrl+z:挂起当前控制台运行的程序fg:继续挂起的程序kill l:显示系统信号,杀死进程依靠向进程发送信号,Linux常用命令,内存、磁盘管理命令,查看磁盘分区:fdisk-l查看磁盘空间占用情况:df(默认单位为KB)统计目录或文件占用空间的大小:du a+目录或文件(默认单位为KB),文件系统挂载命令,挂载文件系统:mout+选项+类型+设备文件名+挂载点如:挂载U盘 mount(t vfat)/dev/udisk/mnt/udisk设备文件名可以通过fdisk l 确定 卸载文件系统:umount+挂载点,Linux常用命令,文件创建,创建目录:mkdir p+目录名创建文件:touch+文件名创建链接:ln+目标+链接名硬链接:ln file file.hl符号链接:ln s file file.sl;ln s/home/jannzeng/wkdir,删除目录:rm fr+目录名删除文件:rm f+文件名移动目录或文件:mv+源文件或目录+目标文件或目录拷贝目录或文件:cp a 源文件或目录+目标文件或目录,文件删除、移动、拷贝,Linux常用命令,显示文件信息,显示文件信息显示详细信息:ls l+文件;不指定文件名则显示当前目录下所有文件;显示隐藏文件信息:ls al,将隐藏文件一并显示文件属性显示当前路径pwd,Linux常用命令,修改文件属性,修改指定文件所有者:chown+文件所有者+文件修改指定文件组所有者:chgrp+文件组所有者+文件修改指定文件访问权限:chmod+权限+文件符号标记权限:chmod a+w(a-w)(a=w),xnf八进制数权限:chmod 644 xnf-R选项标识递归设置当前目录及其子目录要在Linux上执行程序,程序文件必须带可执行权限将多个命令写到一个脚本文件,如run.sh为脚本文件增加可执行权限:chmod u+x run.sh执行脚本文件:./run.sh,实现命令批处理,Linux常用命令,压缩文件,对文件目录进行打包:tar+选项+打包后文件名+文件目录列表gzip格式:tar czvf/home/jannzengbz2格式:tar cjvf jannzeng.tar.bz2/home/jannzeng对文件目录进行解压:tar+选项+打包文件 gzip格式:tar xzvf bz2格式:tar xjvf解压到指定目录:tar xzvf C/,Linux常用命令,查找文件,在指定文件中搜索特定内容:grep+格式内容+文件及路径搜索etc目录及子目录下带jannzeng的文件:grep“jannzeng”/etc-r支持正则表达式:grep jann*/etc-r应用于管道:ps aux|grep smbd;ls l grep a在指定目录中搜索文件:find+路径+-name+格式文件名在当前目录及子目录下查找bak结尾的文件:find./-name*.bak,Linux常用命令,显示文件内容,连接并显示指定一个或多个文件:cat+选项+文件列表查看配置文件内容:cat/etc/profile;cat n/etc/profile;cat b/etc/profile合并文件:cat hello1.txt hello2.txt hello3.txt附加文件:cat hello1.txt hello2.txt显示一屏文本:more+文件从头开始显示一屏:more/etc/profile;moremore显示暂停下来后,可以在末行输入交互命令:回车,显示下一行空格/Ctrl+f,向下滚一屏Ctrl+b,回显上一屏q,退出more,Linux常用命令,显示文件,比more更好用的less,支持随意浏览文件回车,向下移动一行y,向上移动一行空格,向下滚一屏b,向上滚一屏/pattern,按pattern格式搜索;n,匹配下一个;N,匹配上一个显示文件最前行:head/etc/profle显示文件最末行:tail/etc/profile,Linux常用命令,比较文件,比较两个不同的文件或不同目录下的两个同名文件比较两个文件:diff ruNa hello1.c hello2.c比较两个文件,生成补丁文件:diff ruNa hello1.c hello2.c hello1.patch把生成的补丁文件应由在现有的代码上将hello2.c的改变合并到hell1.c:patch hello1.c hello1.patch cd/home/jannzeng;pach p2 hello1.c hello1.patch,Linux常用命令,IP地址维护,查看网络接口信息显示全部接口信息:ifconfig显示指定接口信息:ifconfig eth0配置网络接口信息暂停接口的工作:ifconfig eth0 down恢复接口的工作:ifconfig eth0 up配置网络地址:ifconfig eth0 192.168.1.10 netmask,测试网络状况,测试目标联通情况:指定测试次数:ping 192.168.1.1 c 3,Linux常用命令,man查看联机帮助,格式:man+选项+关键字通常用法man-k command1 查询所有类似帮助文件信man-f command1 查询以command1开头所有相关帮助信息列man 5 command1 通过直接定位5获得帮助信息选项说明-a选项:显示所有匹配项;-w选项:显示手册文件路径;数字:限定手册类型,默从第一种类型开始查找交互命令:回车,向下翻一行;空格,向下翻一页;b,向上翻一页/pattern,按pattern格式查;n:匹配下一个;N:匹配上一个,Linux常用命令,man查看联机帮助,格式:man+选项+关键字通常用法man-k command1 查询所有类似帮助文件信man-f command1 查询以command1开头所有相关帮助信息列man 5 command1 通过直接定位5获得帮助信息选项说明-a选项:显示所有匹配项;-w选项:显示手册文件路径;数字:限定手册类型,默从第一种类型开始查找交互命令:回车,向下翻一行;空格,向下翻一页;b,向上翻一页/pattern,按pattern格式查;n:匹配下一个;N:匹配上一个,课程安排,Linux常用命令Linux上程序编写Linux上程序编译Linux上程序调试嵌入式Linux交叉开发过程,Linux上程序编写,Linux下C开发过程,Linux上程序编写,文本编辑器种类,行编辑器:每次只能对一行进行操作:如Ed、Ex等全屏编辑器:可以对整个屏幕进行编辑,用户编辑的文件直接显示在屏幕上,修改的结果可以立即看出来,如Vi/Vim、Emacs等其实在Linux编辑文件,无非只有2种人:一种使用Vi/Vim,另一种使用EmacsVi只能使用字符文本命令操作,对环境要求不高,入门简单,但操作相对复杂些Emacs可以使用图形界面操作,操作相当简单些,但入门较麻烦,Linux上程序编写,Vi/Vim的使用,Vi用于修改操作系统的配置文件,编写脚本,以及编程和修改程序代码,在各种UNIX/Linux都是相应版本,甚至可以在嵌入式开发板运行。Vim是增强版Vi,自动支持对 配置文件,C程序,Shell脚本和Makefile脚本的语法高亮。Vim没有菜单,只能通过命令操作,有三种工作模式:命令行模式:用于命令快捷键输入模式:用于文本输入末行模式:用于辅助操作,如行号、查找、保存、退出等,Linux上程序编写,Vi/Vim的使用,Vi用于修改操作系统的配置文件,编写脚本,以及编程和修改程序代码,在各种UNIX/Linux都是相应版本,甚至可以在嵌入式开发板运行。Vim是增强版Vi,自动支持对 配置文件,C程序,Shell脚本和Makefile脚本的语法高亮。Vim没有菜单,只能通过命令操作,有三种工作模式:命令模式:用于命令快捷键插入模式:用于文本输入末行模式:用于辅助操作,如行号、查找、保存、退出等,Linux上程序编写,Vi/Vim模式切换,Linux上程序编写,Vi/Vim编辑命令,命令行模式下(n)dd-剪切n行,n不给则剪切当前行(n)yy-拷贝n行,n不给则拷贝当前行p-粘贴u-撤销当前操作,退回到上一次输入状态/+字符串+回车-查找指定字符串gg=G-对文件排版插入模式下ctrl+n-自动补全,Linux上程序编写,Vi/Vim编辑命令,末行模式下w+回车-保存当前输入;wq+回车-保存并退出;q!+回车-不保存退出行号+回车-定位到指定行%s/被替换字符串/替换字符串/g+回车-执行全局替换e+文件路径名-打开指定文件sp-拆分窗ctrl+w-切换窗口,Linux上程序编写,Vi/Vim配置,支持自主配置,支持插件全局配置文件/etc/.vimrc根用户配置文件/root/.vimrc;插件目录/root/.vim,课程安排,Linux常用命令Linux上编写C程序Linux上程序编译Linux上程序调试嵌入式Linux交叉开发过程,Linux上程序编译,Gcc简介,GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C+和Object C等语言编写的程序gcc功能强大,而且可以编译如C、C+、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言。gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译,Linux上程序编译,Gcc编译过程,Linux上程序编译,Gcc支持的文件惯用后续名,Linux上程序编译,预处理阶段,在该阶段,对包含的头文件(#include)和宏定义(#define、#ifdef等)进行处理。使用gcc的选项“-E”让gcc在预处理结束后停止编译过程:gcc E hello.c o hello.i,编译阶段,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作在检查无误后,gcc把代码翻译成汇编语言使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码:gcc S hello.i o hello.s,Linux上程序编译,汇编阶段,把编译生成的“.s”文件(汇编码)转换成目标文件(机器码)使用gcc的选项“-c”只汇编,不链接:gcc c hello.s o hello.o,链接阶段,这里涉及到一个重要概念:库函数例如“printf”函数:在预处理中包含进”stdio.h”中只有函数声明,没有定义函数实现系统把这些函数的实现都放到名为的库文件中去Gcc会到系统默认的库搜索路径”/usr/lib”下查找,链接到函数库,从而调用”printf”函数库有静态库(“*.a”)和动态库(“*.so”),默认使用动态库链接动态库:gcc hello.o o hello链接静态库:gcc static hello.o o hello,Linux上程序编译,Gcc常用选项,Linux上程序编译,Gcc告警选项,Linux上程序编译,Gcc优化选项,gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数不同的优化级别对应不同的优化处理工作“-O”主要进行线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化“-O2”除了完成所有“-O1”级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等“-O3”则还包括循环展开和其他一些与处理器特性相关的优化工作使用原则:调试时不使用任何优化选项,最终发行的时候才考虑对其优化,Linux上程序编译,Gcc库选项,用于对静态库、动态库的打包与链接,Linux上程序编译,Gcc宏选项,-Dmacro用于编译阶段定义宏,将在C语言学习中展开使用,Gcc调试选项,-g:用于在可执行文件包含调试信息用于进行gdb调试gcc-Wall-g-I./inc main.c src/add.c-o main,课程安排,Linux常用命令Linux上编写C程序Linux上程序编译Linux上程序调试嵌入式Linux交叉开发过程,Linux上程序调试,Gdb简介,gdb调试器是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具它没有图形化的友好界面,但是它强大的功能也足以与微软的VC工具等媲美,Linux上程序调试,Gdb帮助,gdb的命令很多,gdb把之分成许多个种类,help命令列出gdb的命令种类如果要看种类中的命令,可以使用help 命令也可以直接help 来查看命令的帮助。在gdb下,可以敲击两次TAB键来补齐命令的全称,如果有重复的,gdb会全部出来。,(gdb)helpList of classes of commands:aliases-Aliases of other commandsbreakpoints-Making program stop at certain pointsdata-Examining datafiles-Specifying and examining filesinternals-Maintenance commandsType help followed by a class name for a list of commands in that class.Type help followed by command name for full documentation.Command name abbreviations are allowed if unambiguous.,(gdb)help callCall a function in the program.The argument is the function name and arguments,in the notation of thecurrent working language.The result is printed and saved in the valuehistory,if it is not void.,Linux上程序调试,Gdb使用过程,编译带调试信息的可执行文件启动gdb进行调试,$gcc-g test.c-o test$gdb testGNU gdb Red Hat Linux(6.3.0.0-1.21rh)Copyright 2004 Free Software Foundation,Inc.GDB is free software,covered by the GNU General Public License,and you arewelcome to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB.Type show warranty for details.This GDB was configured as i386-redhat-linux-gnu.Using host libthread_db library/lib/libthread_db.so.1.(gdb),Linux上程序调试,Gdb使用过程,查看源代码:l(list),(gdb)l1#include 2 int sum(int m);3 int main()4 5 int i,n=0;6 sum(50);7 for(i=1;i=50;i+)8 9 n+=i;10(gdb)l11 printf(The sum of 150 is%d n,n);12 13 14 int sum(int m)15 16 int i,n=0;17 for(i=1;i=m;i+)18 19n+=i;20 21 printf(The sum of 1m is=%dn,n);20,Linux上程序调试,Gdb使用过程,设置断点:b(breakpoints)查看断点情况:info b,(gdb)b 6Breakpoint 1 at 0 x804846d:file test.c,line 6.,(gdb)info bNum Type Disp Enb Address What1 breakpoint keep y 0 x0804846d in main at test.c:6,Linux上程序调试,Gdb使用过程,运行程序:r(run)监视调用堆栈情况:bt(backtrace),(gdb)rStarting program:/root/workplace/gdb/testReading symbols from shared object read from target memory.done.Loaded system supplied DSO at 0 x5fb000Breakpoint 1,main()at test.c:66 sum(50);,(gdb)b 19(gdb)cBreakpoin 2,sum(m=50)at test.c:1919printf(“The sum of 1-m is%dn”,n);(gdb)bt#0sum(m=50)at test.c:19#10 x080483e8 in main()at test.c:6,Linux上程序调试,Gdb使用过程,查看变量:p(printf)单步运行:n(next)/s(step),(gdb)p n$1=0(gdb)p i$2=134518440,(gdb)nThe sum of 1-m is 12757 for(i=1;i=50;i+)(gdb)ssum(m=50)at test.c:1616 int i,n=0;,恢复程序运行:c(continue),(gdb)cContinuing.The sum of 1-50 is:1275Program exited with code 031.,Linux上程序调试,Gdb工作环境相关命令,Linux上程序调试,Gdb设置断点与恢复命令,Linux上程序调试,Gdb查看源代码相关命令,Linux上程序调试,Gdb查看运行数据相关命令,Linux上程序调试,使用Gdb注意事项,在gcc编译选项中一定要加入”-g”只有在代码处于“运行”或“暂停”状态时菜能查看变量值设置断点后程序在指定行之前停止:断点行并未执行,课程安排,Linux常用命令Linux上编写C程序Linux上程序编译Linux上程序调试嵌入式Linux交叉开发过程,嵌入式Linux交叉开发,交叉开发概念,嵌入式软件所运行的环境通常是配置比较低的智能设备如:只有较低的CPU主频,非常小的内存,没有硬盘象传统桌面软件开发那样,直接在嵌入式设备上编辑,编译和调通常不可行几乎所有的嵌入式开发领域都采用交叉开发(Cross-Developer)的方法:整个流程是在两个不同设备交互进行用配置较高的桌面机来编辑和编译程序在最终的嵌入式设备上运行程序,嵌入式Linux交叉开发,交叉开发环境,在一个完整嵌入式开发环境里,用于编辑和编译的PC机称为host,嵌入式设备称为targethost和target通过一些物理连线相连:串口、网口、并口host和target的CPU架构通常不一致:host为intel的,target为arm、m68k等在嵌入式Linux开发环境里,host和target都运行于Linux操作系统,如教学用的Arm-Linux嵌入式开发环境:基于intel架构CPU,运行于桌面版(RHEL5)Linux系统的PC机作为host基于arm架构CPU,运行于嵌入式版Linux系统的开发板作为target两者通过网口和串口交互,嵌入式Linux交叉开发,交叉开发环境,主机(host)编译好的软件要“嵌入”到目标(target)机运行,需要满足以下2个要求host(intel体系架构)上能编译出target架构(arm架构)的软件软件能从host“嵌入”到target运行,嵌入式Linux交叉开发,配置物理连接,通过串口连接host和target用串口线将PC机和开发板连通配置putty串口,通过putty串口登录到开发板修改开发板IP配置文件,使得本地连接和开发板eth0在同一网段:如都在192.168.1.*通过网口连接host和target用网线将PC机和开发板连通使用控制台ping开发板IP,确认与开发板网络联通使用putty验证可以通过telnet登录开发板,嵌入式Linux交叉开发,交叉工具链,交叉工具链的本质交叉工具链用于在host上将源代码编译成满足target体系架构的软件交叉工具链本身属于运行在host上的工具软件集交叉工具链是host架构的软件,却能编译出target架构的软件arm-linux交叉工具链运行在intel架构的linux软件集能编译出arm架构的linux软件完整的arm-linux工具链,跟X86 Linux对应,包含arm-linux-gcc、arm-linux-ar、arm-linux-strip等arm-linux交叉工具链本身也是通过开源代编译构建的,嵌入式Linux交叉开发,安装交叉工具链,将工具链软件包解压到根目录如:tar xvzf arm-linux-gcc-*.*.*.tgz-C/(注:*表示版本号)成功后工具软件集安装在/usr/local/arm/*.*.*目录下将工具链所在路径加入环境变量PATH直接设在/etc/profile文件使所有用户都生效:在export PATH之上添加行pathmuge/usr/local/arm/*.*.*/binsource/etc/profile使得新PATH生效which arm-linux-gcc验证是否成功安装,嵌入式Linux交叉开发,交叉开发实例,host上用vim编写源代码#include int main(void)printf(“Embedded cross-development!n”);return 0;,host上编译运行验证无误gcc main.c o mainfile main:main为intel架构的./main,嵌入式Linux交叉开发,交叉开发实例,host上交叉编译arm-linux-gcc main.c o mainfile main:验证是arm架构的将软件“嵌入”到目标机基于Linux文件系统的“嵌入”直接通过文件拷贝实现:两种方式通过U盘拷贝通过NFS网络共享拷贝通过U盘拷贝在PC机上将main拷贝到U盘将U盘插入开发板,查看开发板分区:cat/proc/partitions通过分区信息确定U盘设备文件:例如SCSI盘一般为sda1挂载U盘:mount/dev/sda1/mnt/udsik,则从/mnt/udsik可以访问所有U盘文件将main从U盘拷贝到开发板:cp/mnt/udsik/main/soft,嵌入式Linux交叉开发,交叉开发实例,通过nfs网络共享拷贝确认在RHEL5上能ping通开发板在RHEL5上设置NFS共享,并启动NFS共享服务在开发板上挂载NFS共享文件夹:mout t nfs o nolock,rw 192.168.12:/home/jannzeng/mnt/nfs则从开发板/mnt/nfs可以访问RHEL5的/home/jannzeng上所有文件将main从RHEL5拷贝到开发板在开发板上运行程序./main,嵌入式Linux交叉开发,功能分布,嵌入式Linux交叉开发,远程调试概念,GDB调试需要在运行环境(target)中启动GDB调试器但GDB调试器过于庞大,一般的target没有足够的资源供其运行折中的做法是将GDB调试分成2部分在target上运一个较小的stub(插桩):gdbserver在host上运行调试器:arm-linux-gdb当target进行单步调试时,插桩(gdbserver)将调试信息传给桌面调试器(arm-linux-gdb)桌面调试器(arm-linux-gdb)接收到调试信息从而改变源码的PC指针位置,嵌入式Linux交叉开发,安装远程调试环境,在host安装arm-linux-gdb将arm-linux-gdb拷贝到arm-linux工具链目录验证安装成功:which arm-linux-gdb在开发板上安装gdbserver确认gdbserver是arm架构的:file gdbserver把gdbserver拷贝到开发板/usr/sbin目录下验证安装成功:which gdbserver,嵌入式Linux交叉开发,GDB远程调试架构,嵌入式Linux交叉开发,远程调试步骤,编译带调试信息的程序:arm-linux-gcc g main.c o main将main拷贝到开发板(通过NFS):cp/mnt/nfs/main/soft注意:远程调试要求host,target两端有相同可执行程序,并且host端要有源码和目标文件在开发板启动gdbserver:gdbserver:12345 main格式为gdbserver host IP:这里不指定主机ip表示任意主机可能通过TCP从12345号端口调试程序main,嵌入式Linux交叉开发,远程调试步骤,在主机开发目录启动arm-linux-gdb开发目录是指项目源代码以及目标文件所在目录在arm-linux-gdb上远程连接gdbserverset remotetimeout 30target remote 192.168.1.254:12345连接成功后在arm-linux-gdb上发布调试命令进行调试(与gdb调试命令一致)打断点到入口:b main启动程序运行:c(注意:不能用run,因为程序已经在开发板上被gdb启动),