本文包含了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   -----清除打印信息

linux驱动之模块化编程小总结的更多相关文章

  1. linux驱动之模块化编程

    今天刚开始学习linux驱动的编写.在网上开了许多网友的博客,感觉比较好的摘抄下来,以便以后忘记可以随时查看.下面是摘抄文章的地址,非常感谢他们. http://blog.chinaunix.net/ ...

  2. linux驱动之模块化驱动Makefile

    本文摘自http://blog.csdn.net/lufeiop02/article/details/6446343 Linux驱动一般以模块module的形式来加载,首先需要把驱动编译成模块的形式. ...

  3. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  4. 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  5. 手把手教Linux驱动1-模块化编程,玩转module

    大家好,从本篇起,一口君将手把手教大家如何来学习Linux驱动,预计会有20篇关于驱动初级部分知识点.本专题会一直更新,有任何疑问,可以留言或者加我微信. 一.什么是模块化编程? Linux的开发者, ...

  6. Linux设备驱动开发详解-Note(5)---Linux 内核及内核编程(1)

    Linux 内核及内核编程(1) 成于坚持,败于止步 Linux 2.6 内核的特点 Linux 2.6 相对于 Linux 2.4 有相当大的改进,主要体现在如下几个方面. 1.新的调度器 2.6 ...

  7. 【Linux高级驱动】平台设备驱动机制的编程流程与编译进内核

    [平台设备驱动机制的编程流程] [如何将驱动静态的编译进内核镜像] 1.添加资源(dev-led.c) 1.1:一般来说,系统习惯上将资源放在arch/arm/plat-samsung/目录中 cp ...

  8. Linux驱动学习之常用的模块操作命令

    1.常用的模块操作命令 (1)lsmod(list module,将模块列表显示),功能是打印出当前内核中已经安装的模块列表 (2)insmod(install module,安装模块),功能是向当前 ...

  9. Linux下的C编程实战

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来, Linu ...

随机推荐

  1. React Navigation / React Native Navigation 多种类型的导航结合使用,构造合理回退栈

    React Navigation 更新到版本5已经是非常完善的一套导航管理组件, 提供了Stack , Tab , Drawer 导航方式 , 那么我们应该怎样设计和组合应用他们来构建一个完美的回退栈 ...

  2. Elasticsearch必知必会的干货知识二:ES索引操作技巧

    该系列上一篇文章<Elasticsearch必知必会的干货知识一:ES索引文档的CRUD> 讲了如何进行index的增删改查,本篇则侧重讲解说明如何对index进行创建.更改.迁移.查询配 ...

  3. bubble排序

    故事的起因:好久没有用bubble了,,,居然忘记了基本格式........ 经过:,,,,这可算是我学的第一个比较有用的"算法"啊...这怎么行! 结果: void bubbleSort (elem ...

  4. 企业权限管理(SSM整合)(总结)

    学于黑马程序员和传智播客联合做的教学项目 感谢 黑马程序员官网 传智播客官网 个人根据教程的每天的工作进度的代码和资料 密码:cti5 b站在线视频 微信搜索"艺术行者",关注并回 ...

  5. MacOS入门

    原文池建强的blog 对普通用户来说,用好Mac主要有三点: 1.理解OSX的基本结构和特点 2.掌握多手势和快捷键(少量即可,多多益善) 3.用好工具 一.理解OSX的基本结构和特点 Mac OS ...

  6. Python Cookbook(第3版) 中文版 pdf完整版|网盘下载内附提取码

    Python Cookbook(第3版)中文版介绍了Python应用在各个领域中的一些使用技巧和方法,其主题涵盖了数据结构和算法,字符串和文本,数字.日期和时间,迭代器和生成器,文件和I/O,数据编码 ...

  7. 31-关键字:final

    final:最终的 1.可以用来修饰:类.方法.变量 2.具体的: 2.1 final 用来修饰一个类:此类不能被其他类所继承. * 比如:String类.System类.StringBuffer类 ...

  8. 云计算&存储测试:FIO工具入门与实战

    一.关于FIO 1.1 简介 FIO是一个开源的I/O压力测试工具,主要是用来测试磁盘的IO性能,也可测试cpu,nic的IO性能.它可以支持13种不同的I/O引擎,包括:sync,mmap, lib ...

  9. 改变对象的字符串显示__str__repr

    改变对象的字符串显示 # l=list('hello') # # print(l) # file=open('test.txt','w') # print(file) class Foo: def _ ...

  10. “随手记”开发记录day15

    今天完成了前两天没有完成的增加“修改”功能.对于已经添加的记账记录,长按可以进行修改和删除的操作.