目录
0 引言
在之前的Linux最简驱动的实现中简要的写了一个Makefile文件,本博文对Makefile编译中涉及的编译器路径设置,Makefile编译文件,内核编译流程等进行系统的总结,最后会有简单的测试试验。
1 编译器路径设置
获取Linux源码后,一般需要自己设置一下编译器的路径,在源码目录下的Makefile文件中,设置CROSS_COMPILE变量,这个变量的值就是编译器的路径,编译的时候也是根据这个路径去找编译器的。我们在之前的搭建嵌入Linux开发环境博文中,也提到过安装交叉编译器,我们这里设置的变量值就是和安装的位置对应的。
2 Makefile编译文件
1)强制编译
强制编译就是,源码开发者强制要求编译进内核的文件。我们看下drivers目录下的Makefile文件,注意:
- obj-y += gpio/表示强制编译gpio目录下的
2)配置编译
配置编译,是驱动开发人员可以通过配置选择编译,演示如上,就不赘述了,注意:
- obj-$(CONFIG_PCI) 表示定义了CONFIG_PCI宏变量的话就会编译
3)依赖编译
依赖编译,是指一个驱动的编译是需要另外其他驱动的支持,这部分不需要写额外的编译脚本,只需要在Kconfig中配置即可,如显卡驱动VIDEO_JPEG_V2X中需要MEDIA_SUPPORT等驱动,那么编译VIDEO_JPEG_V2X时就需要把依赖的驱动选择上。
3 Linux内核编译流程分析
我们前面讲了make menuconfig命令、Menuconfig、Kconfig、.config文件、Makefile文件、make命令、源码、编译工具等,这么多的名词,现在是不是还有想糊涂?他们之间的关系又是什么样的呢?大体上分以下几步:
1)make menuconfig命令:执行后在Menuconfig可视化界面配置宏定义,scripts工具分析各级目录的Kconfig配置文件,其中也有源码内的Kconfig,共同形成了Menuconfig的各级目录;
2)开发人员根据需要进行宏变量的配置,是否进行编译,然后生成.config文件;
3)再通过make命令,调用makefile,生成二进制的镜像文件。
4 编译试验测试
测试下将LED驱动不编译进内核,因为用的开发板原来已经直接将LED驱动编译进去了,这里演示如何将LED驱动不编译进内核。
1)打开内核目录下的.config文件,查看当前LED驱动是已经被编译进去的,CONFIG_LEDS_CTL=y。
2)查看drivers/char目录下的Kconfig,可以看到已经加了LED驱动在menuconfig界面能显示的目录,默认是配置编译状态。
3)make menuconfig进入配置界面,取消LED驱动的编译配置。
4)编译生成二进制镜像文件zImage
5)连接开发板,先查看LED的驱动,目前是有的:
6)OTG烧录镜像文件,可以回顾之前的博客,这里没有之前那么复杂,因为其他的uboot和文件系统不动,只烧写zImage即可。
【小插曲1】几天不用SSH了,一连接就出现这问题,开始以为虚拟机出问题了,最后重启的电脑才OK的~~
- service ssh status 查看状态,都正常
- service ssh restart 重启也不行
【小插曲2】:很久不刷开发板了,结果OTG刷的时候,发现电脑无法识别Android设备,没有驱动了,最后使用驱动精灵安装的,这个方法比较好用:
- 先安装驱动精灵;
- 插好串口线和OTG线;
- 超级终端控制开发板进入uboot模式;
- 驱动精灵检测,识别未安装的驱动,安装即可。
5 小结
本博文总结了Makefile编译路径设置、编译流程分析和编译的在开发板试验测试,嵌入式开发就是个不断练习的过程,开发中我们会遇到各种各样的问题,能精准定位、快速解决,你就已经具备了不错的能力基础了,加油!
作于202105261150,已归档
———————————————————————————————————
本文为博主原创文章,转载请注明出处!
若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!
祝君升职加薪,鹏程万里!
转载:https://blog.csdn.net/w464960660/article/details/117262425