vscode使用笔记

Makefile

# KERNELDIR表示内核源码路径
KERNELDIR := /home/szm/linux/IMX6ULL/szm_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga
# 表示当前路径,即pwd
CURRENT_PATH := $(shell pwd)

# 将chadevbase.c编译成模块
obj-m := chadevbase.o

build : kernel_modules


# 具体的编译命令,后面的 modules 表示编译模块,-C 表示将当前的工作目录切
# 换到指定目录中,也就是 KERNERLDIR 目录。M 表示模块源码目录,“make modules”命令
# 中加入 M=dir 以后程序会自动到指定的 dir 目录中读取模块的源码并将其编译为.ko 文件。
kernel_modules:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

clean:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

 另一种形式:KERNELDIR ?= /lib/modules/$(shell uname -r)/build

KERNELDIR指的是内核库文件的路径,你的代码中使用的是内核提供的函数,而这些函数也是有具体实现的,在连接成一个内核模块时要说明这些库文件在哪里,方便链接程序把它们连接成一个完成的模块。
“?=”:如果这个KERNELDIR为空说明你没有指定内核库文件的路径,那么它就会给KERNELDIR赋值,因为顶层Makefile通过这个环境变量知道内核库文件在哪里。
KERNELDIR=/lib/modules/$(shell uname -r)/build;
其中 shell uname -r 说的是调用shell里头的uname指令 你可以uname -r看看呢是什么,他表示的是内核版本号。一般来说我们构造内核树时,它把内核库统一保存在/lib/modules/内核版本号/build目下。

centos的内核源码可以使用 yum install kernel-devel指令安装。而我阿里云ECS centos8上已经安装了内核源码,路径是:/usr/src/kernels/4.18.0-348.7.1.el8_5.x86_64

$(shell pwd) 获取当前脚本所在的绝对路径

clean:每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个“修养”。 

你要编译驱动程序,不再是跟原本编译应用程序那样可以在当前目录下直接make就好。
因为编译内核驱动的时候,是要用到内核文件里的头文件,还有内核提供的接口函数,要借助于内核文件夹里的makefile来编译你写好的驱动源代码,如果按一般的操作,你就得把源代码放到内核文件夹指定的目录下,然后再在那个目录下得makefile里添加一些语句,比如obj -m什么的(把相应的驱动代码编译成模块),然后到内核文件夹的顶层目录make,生成相应的模块文件,其中.ko就是要用到的。
把一些驱动编译成模块,和编译进内核的区别,你可以去了解下。。编译成模块用的是-m。
而为了方便你可以在任何目录下直接用make来编译驱动代码;就有以下这指令:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
-C 指定的就是内核文件夹所在的地方
M=当前路径
make modules指的是编译模块(还有make bzImage等指令)
.ko文件就是用insmod命令插入到内核中,在去添加相应的设备文件,就可以在内核里跑起来了。 

在vscode下打开终端,默认当前目录为helloworld文件夹下,执行make命令

产生这些文件:
helloworld.mod.c helloworld.mod.o modules.order helloworld.ko helloworld.o

后缀名为.ko的文件就是我们开发板需要的模块驱动文件,将helloworld.ko拷贝到开发板文件系统里的/lib/module/4.1.15/中,这里是通过nfs环境,(后面会有详细的教程).

在开发板中cd到/lib/module/4.1.15/,执行insmod helloworld.ko命令将helloworld驱动加载到内核,在开发板终端会看到"hello world init !"的信息
5.要卸载驱动只需要在当前目录下执行rmmod helloworld.ko,就可以卸载helloworld驱动,会看到终端有"hello world exit !"的信息

以上就是一个最简单的helloworld的linux 驱动设计方式,只是输出了信息,没有涉及soc上的硬件操作,比如gpio,中断,i2c,spi,lcd等等,当然我们的驱动开发远没有这么简单,后面我会详细介绍

 头文件找不到问题

1. 先make,再用vscode打开
如果不编译就打开,会缺少很多文件,linux在编译的过程中会产生一些头文件。

2. 仍然爆红,则是头文件路径配置问题,vscode找不到需要的头文件。
ctrl+左键 点击爆红的地方,直到 不能点击 为止,此时的文件就是需要配置路径的文件,例如 glibconfig.h找不到 如下图

vscode使用笔记_第1张图片

 此时,可以使用linux的find命令,一般库都在/usr目录 ,我们进入/usr目录查找,如下图

vscode使用笔记_第2张图片

然后将路径写入 c_cpp_properties.json ,如下图所示,/** 的写法能够递归查找下面的所有文件,不过直接写 /usr/** 好像不行( 待解决),所以我往下写了一级,红箭头的两行是我添加的,用逗号分隔。 

vscode使用笔记_第3张图片

你可能感兴趣的:(linux,linux,vscode)