找回密码
 注册
关于网站域名变更的通知
查看: 322|回复: 0
打印 上一主题 下一主题

迅为4412开发板实验_Makefile编译(下)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-12-17 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
4.5Makefile 文件
# U; @1 e# J# o/ O$ n8 [接前一小节的内容,继续介绍系统是如何一步一步编译出内核镜像的。
1 U# ?, i# s- m; I在这里仍然以 LEDS 小灯为例。
" \; o9 x# ^) S$ E% R  p; H9 c" I# b4.5.1 宏定义 LEDS_CTL 的使用
, W! A( [7 ?0 h' x如下图所示,led 驱动属于字符驱动,字符驱动一般是在源码目录“drivers/char/”下。3 q5 w% \# q- H' ?9 W. u
6 v4 ]4 R! o8 |7 u& p& k
如上图所示,这里要关注的文件只有框框中的三个“itop4412_leds.c”,
7 [2 X% T& H: \) W& d* I“itop4412_leds.o”,“Makefile”。
! x9 K! p+ b# P7 K$ Z$ Eitop4412_leds.c :比较好理解,就是 led 驱动的源码
5 i! p- @& C6 Iitop4412_leds.o :这个是生成最终 zImage 二进制的中间文件
8 k& A: K' {5 ?" D, ]/ \# WMakefile :就是 Make 命令所需要的文件
" Z" \5 `3 [% c- z/ l  `这里不关心 itop4412_leds.c 中的代码,只需先知道 itop4412_leds.c 的文件名即可。在源码目录中使用命令“vim drivers/char/Makefile”,如下图所示。
. G9 ?; l, E+ R- \7 y7 R! M5 u/ J$ |' ]+ R
打开“vim drivers/char/Makefile”文件之后,找到和 itop4412_leds.c 相关的文件,搜索“itop4412_leds”,如下图所示。
# f8 M$ A! V3 ?5 V! s7 |0 B: I# O+ d8 {# K! b0 p: b
如上图方框所示,就是编译 itop4412_leds.c 的脚本。这个脚本大家也只需要仿照写即可,严格的按照已有的例子来写即可。
0 G7 ~1 r& N, Q: o; T! V3 d3 L
, y4 A! L1 G3 D. B如果想添加类似的字符驱动,就可以在这个目录下添加。
+ C% n5 {& H, y4 q7 R% {4 |Kconfig、Makefile、menuconfig、“.config”文件大家就可以联系起来了。
/ x9 @8 p6 J1 b; G, m# c! Z4.5.2 Makefile 脚本语法简介
# K& j+ h8 S! Q( O' k% Y8 j8 V本小节介绍的语法是对内核源码子目录中 Makefile 进行简单的介绍,这部分是经常会用到的,也是需要掌握的。
  Q. k- ]8 c7 y5 i% ]$ \) ^常用的强制编译写法,还是在“drivers/char/Makefile”中,在 Top 行,如下图所示。/ l  `" M2 ~; E) z+ r6 b6 }: S
4 v7 H# k. d" J' p
上图中的这一行“obj-y += misc.o”,注意这里需要和内核自带的代码对齐。
2 M1 k9 N$ S9 R  h“加等号”右边的“misc.o”表示要编译 Makefile 目录下的“misc.c”文件,
4 T& j! o# v: y6 a“加等号”左边的“obj-y ”表示要编译,并链接进内核(链接进内核是 linux 源码中自带的工具处理的,驱动工程师完全不用关心具体是怎么实现的)/ `, j+ o/ d) |+ U+ J& s
如下图所示,就是 LEDS_CTL 的条件编译,也就是需要在 Kconfig 中定义,在menuconfig 中配置之后,编译器运行的时候找到对应的宏变量 LEDS_CTL 之后才会编译。1 _9 ~( {* ~( y3 o4 E' r3 H

  P+ G4 @8 p9 ?& _上图比较好理解,因为一直是以这个 LEDS_CTL 为例来讲解的。这种方式在写驱动的时候会经常使用到。
3 \+ K; r. x, a" o, t最后介绍一下目录层次的迭代,如下图所示,使用命令“vim drivers/Makefile”打开“drivers/char”上一层目录的 Makefile 文件。
# M' m' p" `6 P: {* \4 Z, \& g0 W. I
: W8 a. f3 [' L0 y- j+ l搜索关键词“char”,因为前面介绍到的字符变量在“char”目录下,如下图所示。
+ w1 h1 v" H% u+ j0 h! G8 X- I, q) L: h* D
上图中的语法也是很简单,只不过“加等号”右边有文件变为了文件夹。这里表示强制编译当前目录“/drivers”的下一级目录“/char”。在执行编译命令执行到这句的时候,就会先跳转到“/char”目录下的“Makefile”文件。
  C$ k! h: `* N8 i6 V4.6 Makefile 测试4 a  W3 X) x. J
本小节给大家做个简单的小实验,通过配置 menuconfig 中的 LEDS,来将内核编译进内核或者不编译进内核。/ J. c9 L* W; V/ S
4.6.1 将 LEDS 驱动不编译
5 q6 M. n6 n2 C# H进内核如下图所示,在给大家提供的源码中,解压之后默认状态就有将“itop4412_leds.c”编译进内核的中间文件“itop4412_leds.o”,如下图所示。
" V9 A  a! N, X+ i( m& l- f6 G  E, |* i7 B- T
如下图所示,使用命令“rm -RF drivers/char/itop4412_leds.o”删除掉 LEDS 驱动的中间文件“itop4412_leds.o”。
7 m+ Q7 R6 W5 v/ k2 Y) L+ Y) r# _, r; h+ y
如下图所示,使用命令“ls drivers/char/”查看一下,发现已经没有了“itop4412_leds.o”文件。
( v4 P5 C* n, U) Z* Y8 z. k
8 r+ d) Z5 A  \( K然后使用命令“make menuconfig”,打开配置工具,如下图所示。0 p2 A$ l3 _( |+ d$ i4 M
. r5 S/ c9 f/ D. S! `4 Q
打开之后,如下图所示。找到“Device Drivers ---> ”选项。
  [7 \0 r3 F" U& s! m% f& H3 B. O6 G+ Z$ t% i
如下图所示,进入到“Device Drivers ---> ”选项,找到选项“Character devices--->”。! Z; Z3 |; }. F' ~7 B' V

  r  Q8 p5 g9 k7 B: j如下图所示,找到选项“Enable LEDS config”,将 LEDS 的配置关闭
- K% t7 D. p/ G1 `* h
4 n2 k- x% K+ S) @3 h  R; s退出,保存,生成新的“.config”文件。
3 o' T6 X# ?2 O; M7 h3 m" E( q1 G( D( c2 Z
保存退出后,打开“.config”文件,可以发现“CONFIG_LEDS_CTL”没有配置。7 n3 x% f5 V/ w! i' [  \

7 c' I5 j, O  f1 J关闭“.config”文件,然后执行编译内核的命令“make”,如下图所示。% v6 m6 {: G8 m' D( H. t0 T

7 \1 ~" h4 T8 f* `如下图所示,编译完成。
  [4 S% h1 u6 d/ h1 T% b8 d) R, n( v' Z" f7 K2 z. Z6 H8 a
如下图所示,使用命令“ls drivers/char”查看 LEDS 驱动所在目录,发现并没有产生了中间文件。0 M' T0 a, @- t4 B2 T4 c: N9 d* [
  {8 v! F/ Z' J; `4 G, V5 ?- ^5 p
最后也可以将生成的文件“zImage”文件下载到开发板,会发现“/dev”目录中没有产生 LEDS 驱动的设备节点“leds”。
) B+ h* X8 O7 b4.6.2 将 LEDS 驱动编译进内核  \7 a( X' P: S* h) r
接上一小节,如下图所示,使用命令“make menuconfig”,打开 menuconfig 配置工具。
; |. `4 M+ M) Z! N, _" [# @  u& b  H+ ?2 {. L
进入“ Device Drivers --->”选项,然后进入“Character devices --->”选项,然后如下图所示,配置上“Enable LEDS config”。  D% l/ z! |7 ~" s2 P  O) J5 ]

2 M. J! M4 j. a3 u; C* n. H8 w- x保存退出。打开“.config”文件,可以发现“CONFIG_LEDS_CTL=y”已经配置。
- J' l) \* d9 F, l0 l
6 F1 V, p& G8 m' w8 j执行编译命令“make”,如下图所示,编译完成之后,使用命令“ls drivers/char/”可以看到“itop4412_leds.o”已经生成。
, }( v9 X: e2 t1 z& F4 A0 e9 K: i% r6 i3 X) b5 H
最后也可以将生成的文件“zImage”文件下载到开发板,会发现“/dev”目录中产生LEDS 驱动的设备节点“leds”,LED 灯的控制又恢复正常了。
% \; c5 X, |. C4 r/ }4 B6 `4.7 编译流程图解9 b& U. c% P) M+ m' G. J7 x
现在内核编译相关的知识已经全部介绍完,本节做一个小节。
1 b+ E; ], y. m% I' U: o. b下图已经将内核编译的全部过程包含。$ R) Y3 Q- x( @4 u3 Z$ Z# n

: I6 v- q, W1 D& J. _+ s如上图所示。* ~9 Y8 A# A" G& _9 |' ?  `1 ]0 M$ I
红色的线条表示配置文件 Kconfig 这一部分,在 Kconfig 中要定义针对具体驱动文件的宏变量。然后使用 menuconfig 工具生成新的”,config“文件。
( w7 h, @* e' q0 i- w' j7 N0 G黑色的线条表示编译文件 Makefile 这一部分,在 Makefile 中针对宏变量编译驱动文件。1 w0 f/ v0 O( G4 h; L
执行 make 命令之后,调用“.config”文件,配合各级目录中的 Makefile 文件编译具体的驱动源代码,将源代码编译成“.o”中间文件。- W+ u4 }0 n  i: F6 F5 x4 b
当中间文件全部编译完成之后,编译工具会生成一个非常精炼的“zImage”二进制文件。
* U% k) Q; y! Z3 r8 b& y8 X. H2 L  }5 x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 01:20 , Processed in 0.171875 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表