- 论坛徽章:
- 0
|
最近在做一个项目,需要使用linux内核定时器精确控制时间。由于时间有限,而且以前也没从事过驱动的开发,只能从网上下载一个例子来学习,消化后再修改。但是在调试该例子的过程中就遇到了一大堆麻烦,但经过一个下午的奋战,还好都解决了。我觉得这个过程非常值得记录下来,第一给自己留个笔记,以后遇到类似问题解决起来就得心应手了,第二,晒出来和大家分享,本人是个半路出家学linux的菜鸟,希望各位大神不吝赐教!
下载到的程序在附件里面完整的
下载的程序在文件夹second里,有三个文件:定时器驱动程序:second.c 驱动测试程序:second_test.c
make文件:Makefile
将文件夹拷贝到虚拟机fedora的/root目录下,cd /root/second进入程序所在目录,然后用vi Makefile修改内核所在路径,我的内核在/opt/FriendlyARM/mini6410/linux/linux-2.6.36路径下,
所以KERNELDIR=后面改为/opt/FriendlyARM/mini6410/linux/linux-2.6.36
改了以后,输入命令make,结果出来了两个错误,比如implicit declaration of function 'kmalloc',都是说second.c用到的某个函数没有定义,发现这两个函数都是内核函数,可以判断一定是少包含了头文件,后来发现确实是这样的,在头文件声明的部位加上#include <linux/slab.h>,再make一下,出现一下信息
make -C /opt/FriendlyARM/mini6410/linux/linux-2.6.36 M=/root/myproject/second modules
make[1]: Entering directory `/opt/FriendlyARM/mini6410/linux/linux-2.6.36'
Building modules, stage 2.
MODPOST 1 modules
make[1]: Leaving directory `/opt/FriendlyARM/mini6410/linux/linux-2.6.36'
错误没有了,驱动程序编译成功,生成second.ko文件
下面就是要将second.ko加载到设备中去,输入insmod second.ko,结果又出现错误了:
error inserting second.ko: -1 Device or resource busy
查看cat /proc/devices,发现设备号为252的被另外一个设备驱动bsg占用,而我是用register_chrdev_region(devno, 1, "second")来静态分配设备号的,看宏定义中有#define SECOND_MAJOR 252,定义的设备号正好也是252,被占用的设备号是不能被申请的,所以出现该驱动装载错误。解决方法就是将second.c的设备号由252改为224,即#define SECOND_MAJOR 252,然后再用make clean清理原来的编译痕迹,再make一次,然后用insmod second.ko再试着装载,没有报错,装载成功。用cat /proc/devices查看设备号分配,有224 second这一行,设备驱动加载成功,下面建立设备节点文件。
输入mknod /dev/ustc c 224 0 命令。224是设备号。
输入ls /dev/ 查看dev目录,可以找到second这个节点文件,节点文件建立成功。下面我们就可以通过测试程序来试验内核定时器驱动了。
用gcc -o second_test second_test.c
编译测试文件,生成了second_test文件,然后输入./second_test,于是定时器就开始工作了,每隔一秒出现两行:
current jiffies is 11035
seconds after open /dev/second :126
current jiffies is 11135
seconds after open /dev/second :127
current jiffies is 11235
seconds after open /dev/second :128
current jiffies is 11335
......
内核定时器使用成功。
second.rar
(85.87 KB, 下载次数: 57)
|
|