本文包含了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. 2n皇后问题-------递归 暴力求解题与分布讨论题

    问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一 ...

  2. 今天上午完成了devicescan,发送了rar包到yzx3233@sina.com

    今天上午完成了devicescan,发送了rar包到yzx3233@sina.com 可以正常扫描和输入了. 还有一个最后的问题,就是选择退出后,程序还在后台

  3. MyBatis动态插入的实现

    mybatis通过定义前缀后缀和分割字符来拼接sql语句,实现动态插入的功能 <insert id="addNewsTypeByNewsId"> insert into ...

  4. Dom运用1

    1.简单计算器 <!-- 第一个数--> <input type="text"> <!-- 符号复选框--> <select name=& ...

  5. Skill 脚本演示 ycNetToPin.il

    https://www.cnblogs.com/yeungchie/ ycNetToPin.il 通过选中一个 instance ,分析与其连接且同时选中的 wire 上含有的 netName ,自动 ...

  6. 6.3 省选模拟赛 Decompose 动态dp 树链剖分 set

    LINK:Decompose 看起来很难 实际上也很难 考验选手的dp 树链剖分 矩阵乘法的能力. 容易列出dp方程 暴力dp 期望得分28. 对于链的情况 容易发现dp方程可以转矩阵乘法 然后利用线 ...

  7. three.js 自制骨骼动画(一)

    上一篇郭先生解析了一下官方的骨骼动画案例,这篇郭先生就要做一个稍微复杂一点的骨骼动画了,就拿一个小人下手吧.在线案例请点击博客原文.话不多说先上大图 骨骼动画在GUI上面都有体现.制作骨骼动画的步骤在 ...

  8. Newbe.Claptrap 框架如何实现多级生命周期控制?

    Newbe.Claptrap 框架如何实现多级生命周期控制?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Lifetime Scope. 特别感谢 kotone 为本文提供的校对建议 ...

  9. sqlzoo刷题 SELECT from Nobel Tutorial

    SELECT from Nobel Tutorial 1.Change the query shown so that it displays Nobel prizes for 1950. SELEC ...

  10. MySQL面试题!新鲜出炉~

    01.Mysql 的存储引擎,myisam和innodb的区别? 答:1.MyISAM 是非事务的存储引擎,适合用于频繁查询的应用.表锁,不会出现死锁,适合小数据,小并发. 2.innodb是支持事务 ...