日期:2020-12-15
本实验例程路径:i.MX6UL终结者光盘资料/06_Linux驱动例程/07_gpioled_mutex
创建gpioled_mutex.c,内容如下(有省略) :
第 33 行,定义互斥体 lock。
第 45~58 行,在 open 函数中调用 mutex_lock_interruptible 或者 mutex_lock 获取 mutex,成功的话就表示可以使用 LED 灯,失败的话就会进入休眠状态,和信号量一样。
第 114 行,在 release 函数中调用 mutex_unlock 函数释放 mutex,这样其他应用程序就可以获取 mutex 了。
第 138 行,在驱动入口函数中调用 mutex_init 初始化 mutex。
互斥体和二值信号量类似,只不过互斥体是专门用于互斥访问的。
应用测试程序使用38.1.2中的应用测试程序即可。
1、编译驱动程序
添加Makefile文件,修改obj-m的值为 gpioled_mutex.o,内容如下:
首先我们在终端输入两个命令(设置两个环境变量):
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
然后使用“make”命令进行编译,生成gpioled_semaphore.ko驱动模块文件。
2、运行测试
将编译好的gpioled_mutex.ko驱动模块文件拷贝到/lib/modules/4.1.15目录下(检查开发板根文件系统中有没有“/lib/modules/4.1.15”这个目录,如果没有的话需要自行创建一下。开发板中使用的是光盘资料里面提供的busybox文件系统,光盘资料的“i.MX6UL终结者光盘资料\08_开发板系统镜像\03_文件系统镜像\01_Busybox文件系统”目录下)。输入下面命令加载模块:
depmod
modprobe gpioled_mutex
驱动模块加载成功如图 3.1所示:
驱动模块加载成功后,使用gpioled_atomic_test应用测试程序进行测试,测试流程和原子变量测试一样。使用下面的命令打开LED灯:
./gpioled_atomic_test /dev/gpioled 1 &
然后紧接着输入LED灯关闭命令:
./gpioled_atomic_test /dev/gpioled 0 &
运行结果如下:
可以看出和信号量的测试结果一样。
卸载模块命令:
rmmod gpioled_mutex