三、Linux下程序编译以及调试
编写程序源码是在利用vi编辑器。关于vi编辑器的使用可以再网上查找一些详细的介绍。http://blog.csdn.net/xueziheng/article/details/2048054
1.GCC编译器流程(利用一段简单的源码做的实验)
Gcc命令详解 http://blog.csdn.net/casularm/article/details/316149
预处理:
这个阶段是对包含的头文件以及宏定义等进行处理,可以先预处理然后查看预处理后的结果。
-E是预处理之后停止编译。现在查看hello.i的部分内容:
编译阶段:
这个阶段GCC首先检查代码的规范性,然后翻译为汇编语言。利用-S来进行只编译不汇编,结果生成汇编代码。
汇编阶段:
这个阶段将.s文件转换为目标文件.o
链接阶段:
成功编译之后就进入链接阶段,完成链接之后,GCC就可以生成可执行文件。
以上就是GCC的整个编译流程。
2.函数库
静态函数库建立以及使用:
静态库是一系列目标文件的归档文件,文件名格式为libname.a,当链接到静态库时,链接器将会搜索静态库,从中提取出所需要的目标文件直接赋值到该程序的可执行文件ELF格式文件之中。
1.创建库程序
建立源程序:
建立静态库:
用到ar命令,关于这个命令的介绍http://blog.csdn.net/xuhongning/article/details/6365200
生成了,静态链接库libtest.a
使用静态链接库:
动态链接库建立与使用
动态链接库libname.so编译时不会被链接到目标代码中,在运行时才会被载入。
-->先利用-fPIC选项编译出目标文件
-->再用-shared选项生成动态链接库
-->使用动态链接库
3.gdb调试
调试时所有程序员都会经历的步骤,大多数情况下,调试的时间是占大部分的。看看gdb调试,推荐一篇文章:http://blog.csdn.net/haoel/article/details/2879
1.首先在编译时加入 -g 这样编译出来的可执行文件里才会包含调试信息
2.启动gdb 开始调试
3.查看文件 l(list) 列出源代码
4.根据行号设断点 b 7 在第7行设断点
5.运行代码 r(run)
6.查看变量p加上变量名
4.Makefile编写
Makefile的编写推荐一篇文章比较不错:跟我一起写Makefile.pdf
四、 Linux开发环境搭建
1. 交叉编译工具
在第一天的学习中已经安装好了交叉编译工具 http://forum.eepw.com.cn/thread/250307/1#9
今天看了下环境变量的设置。
2.WINDOWS下的超级终端以及LINUX下的MINICOM的安装于使用
WINDOWS下的超级终端设置:
也可以使用一般的串口助手。
LINUX下MINICOM安装以及设置:
安装完成,进行设置
回车进入设置界面
开始根据需要配置:
按相应的字母进行选择
在minicom的使用中用到三个按键的操作,CTRL-A Z(先同时按下CRTL和A,松开后再按下Z)来查看帮助。
在minicom中ttyS0代表COM1 ttyS1代表COM2。USB转串口,应该先将USB设备分配给虚拟机,如果虚拟机识别到会在/etc/目录下有ttyUSB0等。
3.LINUX下TFTP服务器搭建(不再重新安装一些软件,所以只贴出方法)
第1步:
安装tftp所需的软件。首先需要安装tftp-hpa,tftpd-hpa,前者是客户端,后者是服务程序,在终端下输入 sudo apt-get install tftp-hpa tftpd-hpa,安装tftp-hpa和tftpd-hpa。然后还需要安装xinetd,在终端下输入 sudo apt-get install xinetd,安装好xinetd。
第2步:
配置相关服务文件。进入根目录下的etc文件夹(cd /etc/),首先看目录中有没有一个xinetd.conf文件,如果没有则新建一个,有的话查看内容,看是否与下面的一致,若不一致则修改,内容如下:
# Simple configuration file for xinetd # # Some defaults, and include /etc/xinetd.d/ defaults { # Please note that you need a log_type line to be able to use log_on_success ont-size: 12pt; "> # log_type = SYSLOG daemon info } includedir /etc/xinetd.d
配置tftp服务器
sudo vi /etc/default/tftpd-hpa 将内容修改成 # /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/tftpboot" #这是你tftp服务器的工作目录,自行修改,注意,在新建工作目录时,最好修改其权限为777,命令sudo chmod 777 /tftpboot TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="-l -c -s"
然后进入xinetd.d文件夹(cd xinetd.d),查看是否有一个tftp文件,如果没有就新建一个,如果有的话就查看内容是否与下面的一致,不一致则修改,内容如下:
service tftp { socket_type = dgram wait = yes disable = no user = root protocol = udp server = /usr/sbin/in.tftpd server_args = -s /tftpboot #log_on_success += PID HOST DURATION #log_on_failure += HOST per_source = 11 cps =100 2 flags =IPv4 }
第5步:
修改所需文件夹的权限。需要修改的文件夹也就是上一步提到的那个服务器文件存放的文件夹,以我的配置文件为例,创建一个文件夹(sudo mkdir /tftpboot),然后把它可以设置成访问权限最宽松的(sudo chmod 777 /tftpboot),也可以设置成合适的权限。
第6步:
重新启动服务。sudo service tftpd-hpa restart,这也是我经常疏忽的一步,当配置好tftp的配置文件后,需要重新启动一下xinetd,在终端中输入 sudo /etc/init.d/xinetd reload,重新加载一下进程,再输入 sudo /etc/init.d/xinetd restart,重启服务。记住,每次修改完配置文件后,都需要重新启动一下服务。
执行次序:
sudo service tftpd-hpa restart sudo /etc/init.d/xinetd reload sudo /etc/init.d/xinetd restart
4.测试TFTP服务器
1.设置虚拟机网卡为桥接方式
2.查看虚拟机IP以及在超级终端中查看板子IP
在虚拟机的TFTP服务器目录放入一个文件,我放入的是aa.c
板子开始获取这个文件:
获取成功!!!
五、编译LINUX内核
今天尝试了一下编译内核,但是还没有完成哟,Linux内核中不同的目录结构里都有相应的makefile,而不同的makefile又通过彼此之间的依赖关系构成一个整体。共同完成建立依赖关系,建立内核等功能。内核的编译主要分为:内核配置,建立依赖关系,创建内核镜像。
看了看内核的配置,下载了一份内核源码:http://url.cn/MHdFRt
内核支持四种不同的配置方法,这几种方法只是与用户的交互界面不同,实现的功能都是一样的。每种方法都是通过读入一个默认的配置文件(根目录下“.config”隐藏文件)。可以手动修改,但是不推荐这种方法。
——>make config 基于文本的最为传统的配置界面。不推荐
——>make menuconfig 基于文本选单的配置界面 字符终端下推荐
——>make xconfig 基于图形窗口模式的配置界面 Xwindow下推荐
——>make oldconfig 自动读入.config配置文件,并且只要求用户设定前次没有设定过的选项。
一般都是采用make menuconfig
在敲入make menuconfig之后出现了错误,如下面代码:
*** 'make menuconfig' requires the ncurses libraries. *** *** Install ncurses (ncurses-devel) and try again. *** make[1]: *** [scripts/kconfig/dochecklxdialog] 错误 1 make: *** [menuconfig] 错误 2
这个错误的解决办法是按照需要安装ncurses-devel的库,但是,通过命令
sudo apt-get install libncurses5-dev
目前还在配置中,还没有进一步的进展,参考一片文档http://www.doc88.com/p-716936409366.html
六、内核配置(二)
整了一天,配置总是出错呀,,可能还会有内核配置三、四....
先确保根目录中的Makefile里面ARCH = arm
打开makefile 查找ARCH
“:=” 的意思是,它右边赋得值如果是变量,只能使用在这条语句之前定义好的,而不能使用本条语句之后定义的变量;
于此对应的是“=”,当它的右边赋值是变量时,这个变量的定义在本条语句之前或之后都可以;
而“?=”是指,该符号左边的变量,如果在本条语句之前没有定义过,则执行本语句,如果已经定义,那么本语句什么都不做
我就直接在Makefile最上面加上一句:
1.选择处理器类型。我用的是AT91SAM9X35
正在尝试着配置啊.....
问题很多......
一篇介绍内核配置的,挺详细的http://www.jinbuguo.com/kernel/longterm-3_10-options.html
七、内核配置(三)+NFS服务器搭建
今天看了看网上一些文章,内核配置,想去完全情况每项配置是什么,估计够呛,而且一点点的配置,对耐心是一大挑战。所以提倡的方法是,找一份厂商提供的配置代码,然后根据自己的需求再去添加或者删除一些配置。注意的是,自己不清楚的不要随便改动。
清除编译过程中的文件,然后找到厂商提供的配置文件
复制出来,然后加载
然后保存为.config
出现这种错误需要设置编译器的环境变量
make之后编译成功,然后 生成镜像:
这个错误是需要安装uboot-mkimage
然后再执行make uImage
【NFS服务器】(我是跟着这个配置的,直接贴过来)
1. 安装NFS
apt-get install nfs-kernel-server
安装nfs-kernel-server的同时会自动安装nfs-common和portmap
2. 配置NFS
(1) 配置portmap
dpkg-reconfigure portmap
在弹出的窗口中选N
(2) 配置/etc/hosts.deny
cp /etc/hosts.deny /etc/hosts.deny_backup
gedit /etc/hosts.deny
对任何文件改动前先做备份是新手的好习惯。禁止任何主机能和NFS服务器进行NFS连接,末尾加入:
###NFS DAEMONS
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
(3) 配置/etc/hosts.allow
cp /etc/hosts.allow /etc/hosts.allow_backup
gedit /etc/hosts.allow
允许我想要的主机和NFS服务器建立连接,末尾加入:
###NFS DAEMONS
portmap:192.168.128.153
lockd:192.168.128.153
rquotad:192.168.128.153
mountd:192.168.128.153
statd:192.168.128.153
若想设置某个网段的机器都能访问,则可 192.168.128.*
/etc/hosts.deny和/etc/hosts.allow设置对portmap的访问,采用这两个配置文件有点类似mask的意思,先在/etc/hosts.deny中禁止所有拥护对portmap的访问,再在/etc/hosts.allow中允许某些用户对portmap的访问。
(4) 重启portmap deamen
每次对/etc/hosts.deny和/etc/hosts.allow两个文件的修改后都要重启portmap daemon生效。
/etc/init.d/portmap restart
(5) 配置/etc/exports
NFS挂载目录及权限由/etc/exports文件定义。
cp /etc/exports /etc/exports_backup
gedit /etc/exports
若将服务器上的/home目录让 192.168.128.153 共享,在文件末尾加入:
/home 192.168.128.153 (rw,sync,no_root_squash)
其中rw是读写权限,只读为ro; sync数据同步写入内存和硬盘,async数据会先暂存在内存,而不立即写入硬盘; no_root_squash服务器共享目录用户的属性,如果用户是root,那么对于这个共享目录来说就具有root的权限。
(6) 重启NFS服务
每次对/etc/exports文件修改后都要重启nfs服务。
/etc/init.d/nfs-kernel-server restart
启动开发板之后,便可以挂载/home到/mnt
挂载服务器端共享文件夹(假设服务器端IP为192.168.128.150,将/home挂载到/mnt)
mount 192.168.128.150:/home /mnt
挂载成功!可见在客户端的/mnt目录下服务器192.168.128.150的/home下的内容!
NFS卸载
umount /mnt
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |