近来在做一个项目,须要使用linux内核定时器精确控制时间。因为时间有限,并且曾经也没从事过驱动的开发,只能从网上下载一个反例来学习,消化后再更改。并且在调试该事例的过程中就碰到了一大堆麻烦,但经过一个晚上的鏖战,还好都解决了。我认为这个过程十分值得记录出来,第一给自己留个笔记,之后遇见类似问题解决上去就得心应手了,第二,晒下来和你们分享,本人是个半道剃度学linux的新手,希望诸位前辈不吝请教!
下载到的程序在附件上面完整的
下载的程序在文件夹second里,有三个文件:定时器驱动程序:second.c驱动测试程序:second_test.c
make文件:Makefile
将文件夹拷贝到虚拟机fedora的/root目录下,cd/root/second步入程序所在目录,之后用viMakefile更改内核所在路径,我的内核在/opt/FriendlyARM/mini6410/linux/linux-2.6.36路径下,
所以KERNELDIR=前面改为/opt/FriendlyARM/mini6410/linux/linux-2.6.36
改了之后,输入命令make,结果下来了两个错误,例如implicitdeclarationoffunction'kmalloc',都是说second.c用到的某个函数没有定义linux 定时器程序,发觉这两个函数都是内核函数,可以判定一定是少包含了头文件linux 定时器程序,后来发觉确实是这样的,在头文件申明的部位加上#include,再make一下,出现一下信息
make-C/opt/FriendlyARM/mini6410/linux/linux-2.6.36M=/root/myproject/secondmodules
make[1]:Enteringdirectory`/opt/FriendlyARM/mini6410/linux/linux-2.6.36'
Buildingmodules,stage2.
MODPOST1modules
make[1]:Leavingdirectory`/opt/FriendlyARM/mini6410/linux/linux-2.6.36'
错误没有了,驱动程序编译成功,生成second.ko文件
下边就是要将second.ko加载到设备中去,输入insmodsecond.ko,结果又出现错误了:
errorinsertingsecond.ko:-1Deviceorresourcebusy
查看cat/proc/devices,发觉设备号为252的被另外一个设备驱动bsg占用,而我是用register_chrdev_region(devno,1,"second")来静态分配设备号的,看宏定义中有#defineSECOND_MAJOR252,定义的设备号刚好也是252,被占用的设备号是不能被申请的,所以出现该驱动装载错误。解决方式就是将second.c的设备号由252改为224,即#defineSECOND_MAJOR252,之后再用makeclean清除原先的编译痕迹,再make一次,之后用insmodsecond.ko再试衣着载百度网盘LINUX,没有报错,装载成功。用cat/proc/devices查看设备号分配,有224second这一行,设备驱动加载成功linux操作系统安装,下边构建设备节点文件。
输入mknod/dev/ustcc2240命令。224是设备号。
输入ls/dev/查看dev目录,可以找到second这个节点文件,节点文件构建成功。下边我们就可以通过测试程序来试验内核定时器驱动了。
用gcc-osecond_testsecond_test.c
编译测试文件,生成了second_test文件,之后输入./second_test,于是定时器就开始工作了,每隔1秒出现两行:
currentjiffiesis11035
secondsafteropen/dev/second:126
currentjiffiesis11135
secondsafteropen/dev/second:127
currentjiffiesis11235
secondsafteropen/dev/second:128
currentjiffiesis11335
......
内核定时器使用成功。
second.rar(85.87KB,下载次数:57)
2013-04-0821:58上传
点击文件名下载附件
内核定时器