本文包含了linux驱动模块化编程的基本,包括创建多线程,延时,以及makefile

以一个实例来说明

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/sched.h>
#include<linux/init.h>
#include<linux/timer.h>
#include<linux/kthread.h>
#include<linux/delay.h>
#include<linux/sched.h>
#include<linux/completion.h>
#include<linux/signal.h>
#include <asm/processor.h>
#include <asm/system.h>
#include <linux/param.h>
#include<linux/gpio.h>
#include "gpio-sama5d3-test.h" //如果没有对应的.h文件,请注释 //static DECLARE_COMPLETION(my_completion);
static struct task_struct *task; int flag = ; int my_function(void *arg)
{
// printk(" in %s()\n", __FUNCTION__); allow_signal(SIGKILL); //使得线程可以接收SIGKILL信号
mdelay(); printk("should stop: %d\n",kthread_should_stop()); while (!signal_pending(current) && !kthread_should_stop()) //使得线程可以被杀死,也可以在rmmod的时候结束
{
printk(" jiffies is %lu\n", jiffies);
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(HZ * ); //这两句是为了延时5s,在这5s内,处理器会处理其他进程。
printk("should stop: %d\n",kthread_should_stop());
} printk("Leaving my_function\n");
flag = ; return ;
}
static int __init sama5d3_gpio_init(void)
{
printk("SAMA5D3 gpio init!\n") ; task = kthread_run(my_function,NULL,"my_function");
// printk("<1> init wait_for_completion()\n");
return ;
} static void __exit sama5d3_gpio_exit(void)
{
int ret ;
printk("sama5d3 gpio exit!\n");
if(!flag)
{
if(!IS_ERR(task))
{
ret = kthread_stop(task);
printk(KERN_INFO "First thread function has stopped ,return %d\n", ret);
}
}// printk("task_struct: 0x%x",task);
printk(" Goodbye\n");
return;
} module_init(sama5d3_gpio_init);
module_exit(sama5d3_gpio_exit); MODULE_AUTHOR("HUANGJJY");
MODULE_DESCRIPTION("GPIO driver for sama5d3");
MODULE_LICENSE("GPL");

makefile如下:

ifeq ($(KERNELRELEASE),)

#KERNEL_DIR = /home/user/project2/ATMEL/linux-at91/      //如果是交叉编译,此为内核路径
KERNEL_DIR ?= /lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
#CROSS_COMPILE = /home/user/project2/ATMEL/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux/bin/arm-linux-gnueabihf-
#CC = $(CROSS_COMPILE)gcc //如果是交叉编译,此为交叉编译工具链名称和路径
#INCLUDE = $(PWD)/gpio-sama5d3-test.h //如果.c文件有.h文件,这是.h的路径 modules:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules
#$(MAKE) -I$(INCLUDE) -C $(KERNEL_DIR) M=$(PWD) modules //如果该.c文件有.h文件,则用此编译语法
.PHONY:modules clean
clean:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean else
obj-m := gpio-sama5d3-test.o endif

编写完上述两个文件后,保存退出。

#  make

会生成.ko文件

# insmod ****.ko   -------挂载驱动

#lsmod   --------查看挂载的驱动

#rmmod ***.ko  ------卸载驱动

#dmesg   or  dmesg | tail -20   查看驱动打印信息

#dmesg -c   -----清除打印信息

最新文章

  1. ubuntu安装ANSYS17.2全过程
  2. linux网卡驱动移植
  3. java笔记--枚举总结与详解
  4. How to using x++ code create GL journal[AX2012]
  5. java web 学习十三(使用session防止表单重复提交)
  6. [iOS基础控件 - 6.9] 聊天界面Demo
  7. iOS报错Expected selector for Objective-C method
  8. JAVA为什么会空指针异常
  9. poj1011 Sticks(dfs+剪枝)
  10. 深入浅出Node.js (5) - 内存控制
  11. LDA-线性判别分析(三)
  12. Delphi下URL汉字编码解码的两个函数
  13. Lua中的weak表——weak table(转)
  14. 使用C#操作文件
  15. linux 下正则匹配时间命名格式的文件夹
  16. python写GUI
  17. grep基础用法
  18. 查看cookie的快捷方法
  19. 牛客国庆集训派对Day4 I-连通块计数(思维,组合数学)
  20. swift - 画图截取图片 - 保存相册

热门文章

  1. 玩LOL间歇性卡顿(FPS突然降低又马上恢复)?Windows10间歇性卡顿?
  2. Java8线程池ThreadPoolExecutor底层原理及其源码解析
  3. Spring main方法中怎么调用Dao层和Service层的方法
  4. 学习python的几个资料网站
  5. 使用 you-get 下载免费电影或电视剧
  6. ASP.NET Core 监听SQL Server数据库的实时信息
  7. PHP log1p() 函数
  8. Virtuoso 中的窗口_1
  9. Codeforces Round #654 (Div. 2) A~E 题解
  10. luogu P3180 [HAOI2016]地图 仙人掌 线段树合并 圆方树