以Mini2440为例,其Linux内核目录为/opt/FriendlyARM/mini2440/linux-2.6.32.2,在linux-2.6.32.2(Linux内核目录)下的drivers目录下新建目录名为add_sub_Kconfig。

在add_sub_Kconfig目录下新建文件add_sub.c,add_sub.h,test_communication.c,代码如下:(例子来自《Linux驱动开发入门与实践 第2版》)

#ifndef ADD_SUB_H
#define ADD_SUB_H long add_integer(int a, int b); long sub_integer(int a, int b); #endif
#include <linux/init.h>
#include <linux/module.h> #include "add_sub.h" long add_integer(int a, int b)
{
return a + b;
} long sub_integer(int a, int b)
{
return a - b;
} EXPORT_SYMBOL(add_integer);
EXPORT_SYMBOL(sub_integer); MODULE_LICENSE("GPL");

在add_sub.c中通过EXPORT_SYMBOL导出宏,是内核知道其定义的函数可以被其他函数使用。

#include <linux/init.h>
#include <linux/module.h> #include "add_sub.h" static int a = ;
static int b = ;
static int AddOrSub = ; static int test_init(void)
{
int result = ;
printk("test init\n"); if(AddOrSub == )
{
result = add_integer(a, b);
}
else
{
result = sub_integer(a, b);
}
printk("The %s result is %d\n", AddOrSub == ? "Add" : "Sub", result); return ;
} static void test_exit(void)
{
printk("test exit\n");
} module_init(test_init);
module_exit(test_exit); module_param(a, int, S_IRUGO);
module_param(b, int, S_IRUGO);
module_param(AddOrSub, int, S_IRUGO); MODULE_LICENSE("GPL");

在test_communication.c中通过包含add_sub.h文件引入函数,即可使用。而module_param是模块加载是引入的参数。

在add_sub_Kconfig目录下新建Kconfig文件,有两个模块,这里构造一个菜单把它们包含进来。tristate表示模块可以选择编译进内核还是作为独立的模块,默认值m表示独立的模块。如果希望直接编译进内核可以使用boolean,然后默认值改为y。

menu "ADD_SUB_FUNCTION"
comment "ADD_SUB_FUNCTION" config ADD_SUB
tristate "ADD_SUB support"
default m config TEST_COMMUNICATIONA
tristate "ADD_SUB test support"
depends on ADD_SUB
default m endmenu

在add_sub_Kconfig目录下新建Makefile文件,在Kconfig中的config后写了ADD_SUB和TEST_COMMUNICATION,此处则写CONFIG_ADD_SUB和CONFIG_TEST_COMMUNICATION:

obj-$(CONFIG_ADD_SUB) += add_sub.o
obj-$(CONFIG_TEST_COMMUNICATION) += test_communication.o

在drivers目录下的Kconfig文件中添加:

source "drivers/add_sub_Kconfig/Kconfig"

在drivers目录下的Makefile文件中添加:

obj-$(CONFIG_ADD_SUB) += add_sub_Kconfig/

obj-$(CONFIG_TEST_COMMUNICATION) += add_sub_Kconfig/

回到/opt/FriendlyARM/mini2440/linux-2.6.32.2目录,执行:

make menuconfig,然后确认添加的模块已经打开。(此处选m编译为ko模块)

make modules,即可看到在add_sub_Kconfig目录下编译出的两个ko文件。

将两个ko文件下载到Mini2440上测试。

Linux下编写互相通信的驱动模块并将其加入到内核中的更多相关文章

  1. Linux下多任务间通信和同步-信号

    Linux下多任务间通信和同步-信号 嵌入式开发交流群280352802,欢迎加入! 1.概述 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式.信号可以直接进行用户空间进程和内核进程之间的 ...

  2. Linux下多任务间通信和同步-概述

    Linux下多任务间通信和同步-概述 嵌入式开发交流群280352802,欢迎加入! 在前面,我们学习了两种多任务的实现手段:进程和线程.由于进程是工作在独立的内存空间中,不同的进程间不能直接访问到对 ...

  3. Linux下多任务间通信和同步-消息队列

    Linux下多任务间通信和同步-消息队列 嵌入式开发交流群280352802,欢迎加入! 简介 消息队列简称为队列.消息队列就是一些消息的列表.用户可以在消息队列中添加消息和读取消息等.从这点上看,消 ...

  4. Linux下多任务间通信和同步-mmap共享内存

    Linux下多任务间通信和同步-mmap共享内存 嵌入式开发交流群280352802,欢迎加入! 1.简介 共享内存可以说是最有用的进程间通信方式.两个不用的进程共享内存的意思是:同一块物理内存被映射 ...

  5. Linux下编写-makefile-详细教程(跟我一起写-Makefile-Markdown整理版)

    目录 概述 关于程序的编译和链接 Makefile 介绍 Makefile的规则 一个演示例子 make是怎样工作的 makefile中使用变量 让make自己主动推导 另类风格的makefile 清 ...

  6. [转] Linux下编写脚本实现Daemon

    在Linux(以Redhat Linux Enterprise Edition 5.3为例)下,有时需要编写Service.Service也是程序,一般随系统启动用户不干预就不退出的程序,可以称为Se ...

  7. Ubuntu\Linux 下编写及调试C\C++

    一.在Ubuntu\Linux 下编写及调试C\C++需要配置基本的环境,即配置gcc编译器.安装vim编译器,具体配置安装步骤我在这里就不多说了. 二.基本环境配置完了我们就可以进入自己的程序编写了 ...

  8. Linux下编写和加载 .ko 文件(驱动模块文件)

    一..ko 文件介绍 .ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候插入内核,不需要时卸载. 二.优点 (1)这样可以缩小内核体积 ...

  9. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

随机推荐

  1. 个股和股票池的beta系数的估算

    个股的beta系数的估算 代码 def test_gg_beta(symbol='000895.sz', start='2018-01-01', plot_price=True, align_to=' ...

  2. Redis(二)冰叔带你了解Redis-哨兵模式和高可用集群解析

    前言    Redis 的 主从复制 模式下,一旦 主节点 由于故障不能提供服务,需要手动将 从节点 晋升为 主节点,同时还要通知 客户端 更新 主节点地址,这种故障处理方式从一定程度上是无法接受的. ...

  3. Redis 主从模式

    系统:Centos6.6x64安装目录:/usr/local/主:192.168.100.103从:192.168.100.104 ,下载安装: 安装依赖: # yum install gcc tcl ...

  4. JavaScript之对原生JavaScript对象及其原型扩展初探

    Object对象: //扩展:对JavaScript原生对象的扩展 //原理:原型对象 Object.prototype.keys = function(){ var keys = []; for(v ...

  5. 第16月第23天 atos

    1. grep --after-context=2 "Binary Images:" *crash xcrun atos -o zhiniao_adhoc_stg1.app.dSY ...

  6. mysql 案例 ~ pt-archiver 归档工具的使用

    一 简介:今天咱们来聊聊pt-archiver的使用 二 相关参数 相关参数1   --statistics 结束的时候给出统计信息:开始的时间点,结束的时间点,查询的行数,归档的行数,删除的行数,以 ...

  7. Freemarker list 的简单使用

    freemarker list (长度,遍历,下标,嵌套,排序) 1. freemarker获取list的size : Java ArrayList<String> list = new ...

  8. sqlldr和sqludr使用笔记

    导出语句: 参数:file=aaa    生成文件的名字 导入语句: 导出语句会生成一个控制文件(XX.ctl),导入语句直接使用这个控制文件就可以 readsize=  控制缓存大小,控制文件里面的 ...

  9. groovy与java中的多方法

    最近在学习groovy的时候从书里看到这么一个有趣的例子,刚开始我也猜错了: 最后测试答案是: son ----show 刚开始没理解,以为是num---show,但是后来看书上说是: test01接 ...

  10. NSIS程序安装包制作

    nsis下载地址:http://www.pc6.com/softview/SoftView_14342.html nsis使用: 启动NSIS程序主界面,选择"可视化脚本编辑器(VNISEd ...