本文包含了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. C++与正则表达式入门

    什么是正则表达式? 正则表达式是一组由字母和符号组成的特殊文本, 当你想要判断许多字符串是否符合某个特定格式:当你想在一大段文本中查找出所有的日期和时间:当你想要修改大量日志中所有的时间格式,在这些情 ...

  2. 玩LOL间歇性卡顿(FPS突然降低又马上恢复)?Windows10间歇性卡顿?

    一..问题描述: LOL时:画面突然死掉,不能操作:FPS突然降低,从三位数降到两位数(150 -> 6).我最开始就是从LOL这里观测到的,因为游戏是卡顿最直观.最明显的表现.之后才发现不玩游 ...

  3. vue学习(十二) 指令v-if v-show 控制页面标签的显示与隐藏

    //html <div id="app"> <input type="button" value="toggle" @cl ...

  4. spring学习(四)使用注解代替xml配置

    用的是IDEA的maven工程,pom.xml文件导包依赖省略 一.书写要导入容器的实体类 import org.springframework.beans.factory.annotation.Va ...

  5. python基础--14大内置模块(上)

    python的内置模块(重点掌握以下模块) 什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类 ...

  6. 构建一个基于事件分发驱动的EventLoop线程模型

    在之前的文章中我们详细介绍过Netty中的NioEventLoop,NioEventLoop从本质上讲是一个事件循环执行器,每个NioEventLoop都会绑定一个对应的线程通过一个for(;;)循环 ...

  7. String字符串缓冲区、StringBuffer

    String字符串缓冲区 1.StringBuffer类 StringBuffer又称为可变字符序列,字符串缓冲区支持可变的字符串, StringBuffer是个字符串的缓冲区,即就是它是一个容器,容 ...

  8. Get与Post的区别?(面试官最想听到的答案)

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  9. Django学习路33_url 地址及删除元素 delete() 和重定向 return redirect('路径')

      保存日期 def create(request): '''新增一本图书''' # 1.创建BookInfo对象 b = BookInfo() b.btitle = '流星蝴蝶剑' b.bpub_d ...

  10. 什么是PHP 面向对象

    PHP 面向对象 在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象. 在现实 ...