嵌入式Linux

关于linux系统的常见命令和vi编辑命令此篇不在多述,本专栏主要针对嵌入式Linux系统的驱动和应用开发部分的学习,理清在实际开发过程中重点会出现的问题和知识点。

软件包管理系统:软件包文件通常是一个存档文件,它包含已编译 的二进制文件和软件的其他资源,以及安装脚本。软件包文件同时也包含有价值的元数据,包括它们的依赖 项,以及安装和运行它们所需的其他软件包的列表。

unbuntu系统软件安装:以unbuntu系统为例,它包含了apt命令,apt命令是一个简洁的接口,可用于apt-get,apt-cache命令处理的常见操作。unbuntu系统下很多软件需要先行提供源码,使用源码自行编译,编译完成之后使用命令install来安装。我们利用软件包管理系统可以直接下载并且安装所有通过认证的软件。Unbuntu系统用的最多的就是apt-get和install命令。这种方法解决了linux平台下安装软件时产生的软件之间相互依赖的问题。apt命令可以实现软件自动下载,配置,安装二进制或源码的功能。install就是把编译之后的文件复制到目的位置。

更换软件源:刚刚下载好的unbuntu是国外源,导致下载速度慢甚至下载失败,换成国内源将提高下载速度。

配置网络:以前使用桥接来实现windows,ubuntu,和开发板三者之间的联通。现在使用NET配置ubuntu网络(ubuntu可以上网,借用window的,实现端口映射)会简单很多。设置方法P90。验证网络是否互通的方法P96,如果无法互通详查P99。在已经有net网络情况下,还设置一个桥接网络,这是让ubuntu在可以上网的同时,保证windows,ubuntu,开发板之间的联通,这样做的意义在于?unbuntu和开发板之间通过网线和USB网卡连接可以实现开发板通过网络下载unbuntu文件,开发板与windows(mabaxterm)通过串口连接可以实现mobaxterm命令操作开发板。

MobaXterm远程登录ubuntu(它也可以做串口助手),FileZilla传输文件  P103。文档中有错误:在链接时,不是127.0.0.1,而是在ifconfig命令下查找到的IP地址。在初次使用时,无法连接的原因是ubuntu系统中没有下载ssh服务。PIXHAWK通过USB串口连接到mobaxterm之后,mobaxtrem接收到乱码数据,而视频里的开发板通过USB串口连接mobaxterm之后是和unbuntu终端一样的界面,可以执行命令的,这是为什么呢?

从一个简单的hello程序看ubuntu的编译:在windows系统中写一个hello.c文件,然后使用FileZilla上传到ubuntu系统中的/home/book目录下。在ubuntu的终端中在/home/book目录下输入ls -l,查看是否有hello.c文件,然后运行gcc -o hello hello.c编译这个文件,然后执行./hello。

开发板的第一次操作:开发板的USB接口,网线接口,电源接口,注意接线和供电状态。串口驱动程序会在接口连接到电脑时由windows自动安装。将开发板网线接口接到电脑USB口。现在虚拟机使用NAT模式,虚拟机再添加一个桥接模式。视频P17。在windows系统中虚拟网络编辑器中选择网卡。然后设置虚拟机IP。在setting-network-ipv4。然后设置windows的IP。设置开发板的IP。设置静态模式。

下载工具链:使用git命令下载源码,放在指定的目录下。

配置交叉编译工具链:交叉编译工具链用来在ubuntu主机上编译应用程序,这些应用程序在ARM等平台上运行。设置交叉编译工具主要是设置PATH,ARCH和CROSS_COMPILE三个环境变量。P124。设置交叉编译工具链,测试环境变量和交叉编译器。

Source Insight:是一个大型源代码库工具,构建了符号信息的内部数据库,显示引用树,类继承图和调用树,加快了对不熟悉项目的代码理解。linux内核源码可以在ubuntu上下载之后通过文件传输工具filezilla传输到windows系统查看。使用Source Insight建立工程查看P128。

编译程序到开发板运行(APP程序):前面使用hello来编译之后运行的程序是用gcc编译的,是给PC的,不能在ARM板上运行。如果想要给开发板编译出程序,需要使用交叉编译工具链。比如使用命令:arm-linux-gnueabihf-gcc-o hello hello.c。把编译出来的hello文件拷贝到nfs服务目录下。nfs是网络文件系统,是开发板使用nfs协议通过网络读取unbuntu系统文件的一个过程。开发板在启动之后通过nfs挂载ubuntu目录的方式,将相应的文件拷贝到开发板上。最后添加可执行权限,并运行它。具体的命令行查看P135。

编译程序到开发板上(驱动程序):(1)在编译驱动程序之前,需要编译内核。在驱动程序中的头文件比如<asm/io.h>其中asm就是一个链接文件,指向asm-arm或者asm-mips,这就需要先配置编译内核才会生成asm这个连接文件。开发板上运行的内核和你自己编译的内核不一致的话,会导致一些问题,所以,在编译驱动程序之前,要把自己编译的内核放到开发板上。编译内核之前需要配置好工具链等一些环境变量。具体命令查看P137。打开内核文件之后使用make命令编译,然后make设备树,将文件拷贝到nfs处。(2)在编译完内核之后,要编译内核模块。进入内核源码目录之后,就可以编译内核模块了。把模块安装到nfs目录下备用,得到modules目录。P139。(3)安装内核和模块到开发板上。到目前为止,nfs目录下有zImage,uImage,dtb文件,并且有modules目录。在开发板启动进入linux后,通过nfs挂载ubuntu目录的方式,将文件拷贝到开发板上。最后重启开发板,他就是使用新的zImage,uImage,dtb,模块了。(4)开发板得到新的内核之后,我们需要给他新的驱动程序。把第一个驱动程序上传到ubuntu之后,修改它的makefile。设置KERN_DIR为内核的源码目录(绝对路径)。(5)在驱动程序目录下执行make命令即可编译驱动程序以及测试程序。然后将驱动程序和测试程序复制到nfs目录备用。(6)开发板启动之后通过nfs挂载ubuntu目录的方式,将驱动和测试文件复制到开发板上。然后安装驱动程序并验证是否成功。(在整个过程中,在unbuntu上对代码进行编译,对文件进行处理之后,在mabaxterm上使用串口与开发板进行通信,发送指令给开发板,然后开发板接收指令并执行,最后从ubuntu上读取资源,安装内核和驱动。这便是设置双网卡模式的意义。)

常见问题:P146。(1)disagree about version of symbol device_create安装驱动程序时,提示内核太老。解决办法是先编译内核,再安装驱动程序。(2)command  xxx not found 没有安装工具链,没有设置环境变量

1.搭建开发环境

2.启动开发板

3.获取源码

4.配置交叉编译工具

5.烧写整个系统或者更新部分系统

6.PC和开发板之间传输文件

应用开发的背后:以前面的hello程序为例,使用gcc编译是给PC的,使用配置好的交叉编译工具链编译之后可以在ARM板子上运行。观察hello.c文件:头文件stdio.h的作用是声明函数以及常量或者变量,头文件的位置在默认路径(编译器中的include目录下),头文件双引号表示在当前目录,编译时用-I选线来指定;printf函数在库中或者别的C文件中,如果在库中,可有默认路径或者指定路径,C文件用来定义或者实现define。交叉编译器中的头文件的默认路径:进入交叉编译器的目录,find -name "stdio.h",它位于Include目录下的根目录里。如果要指定头文件目录,编译时,加上-I<头文件目录>这样的选项。指定库文件目录:在编译时,加上-L<库文件目录>选项。

GCC编译器:源文件必须经过编译才可以生成可执行文件。在windows中,VSCode已经各种编译工具等装好了。在linux下即使使用集成开发工具,也需要掌握一些编译选项。要想在ARM平台上运行程序,必须使用交叉编译工具。一个c/C++文件要经过预处理,编译,汇编,链接才能变成可执行文件。常用的编译选项:-E,-c,-o,-I,-L,-1。如何编译多个文件:P343。如何制作和使用动态库。制作和使用动态库。GCC的编译指令有许多选项,自行查看P345。

Makefile的使用:在linux中使用make命令来编译程序,make命令所执行的动作依赖于makefile文件。规则:目标文件:依赖文件 tab键  命令。如果依赖文件比目标文件新或者没有目标文件,那么执行命令。makefile有两个函数:$(foreach var ,list,test)把list的每一个元素取出来赋给var之后把var改为test所描述的形式。$(wildcard pattern)pattern所列出的文件是否存在,把存在的文件列出来。P353。

通用makefile的使用:指定文件、目录、即时变量、延时变量。这部分比较难理解。

文件IO:在Linux中一切都是文件,普通文件,驱动程序,网络通信,所有的操作都是通过文件IO来操作的。标准IO的最大特点是在系统IO的基础上引入了一个用户buffer(数据缓冲区)。linux内核和APP之间由系统调用接口来访问Linux的服务。open,read,write是系统接口。文件IO内部机制:用户APP通过调用系统接口来触发异常,进入linux内核。通过汇编指令进入异常,把异常原因存入寄存器R7或者R8(程序状态寄存器),然后内核根据不同的原因调用不同的系统函数(函数指针)。 fd是文件句柄,这个句柄如何与具体的文件挂钩?每个进程有自己的文件句柄空间。当要通过指定句柄来执行某一个文件的时候,要指定哪个进程。当打开一个文件的时候,会返回一个file结构体,file结构体中有文件指针,记录文件的各种信息。在一个进程中,会有一个task_struct,这个结构体有fdt成员。fdt里面有fd数组,里面的元素就是一个文件的file结构体指针,对应一个文件。所以,fd是数组下标也是文件的句柄,可以访问这个文件的file结构体。打开同一个文件就是同一个进程?不同文件就是不同进程?两次打开同一个文件做不同的读写操作就是在同一个进程下占用不同的连续的两个句柄,这两个句柄都是指向同一个file结构体。

-------------------------------------------------------------------------------------------------------------------------------

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值