以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. 收集服务器网卡和IP信息

    收集服务器网卡和IP信息 Python2环境 #!/usr/bin/python2 # -*- coding:utf-8 -*- import os,sys import socket, fcntl, ...

  2. 19. SpringBoot_web开发-使用外部Servlet容器&JSP支持

    還沒有web.xml,生  配置tomcat 嵌入式Servlet容器:应用打成可执行的jar 优点:简单.便携: 缺点:默认不支持JSP.优化定制比较复杂 使用定制器[ServerPropertie ...

  3. 尚硅谷spring_boot课堂笔记

    尚硅谷spring_boot课堂笔记

  4. spfa判负环

    bfs版spfa void spfa(){ queue<int> q; ;i<=n;i++) dis[i]=inf; q.push();dis[]=;vis[]=; while(!q ...

  5. 20155319 2016-2017-2 《Java程序设计》第八周学习总结

    20155319 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 NIO与NIO2 - NIO使用频道(channel)来衔接数据节点 - read()将Re ...

  6. for XX in XX结构

    这是一个循环!! in 后面可跟range,enumerate,序列等 for i in [(1,2),(2,3),("gege",5)]: print (i) 执行结果: (1, ...

  7. mysql 5.7 ~ 新特性

    mysql 5.7特性 简介:mysql 5.7内存和线程性能方面的优化一 细节优化 参数:  1 innodb_buffer_pool    改进 innodb_buffer_pool可以动态扩大, ...

  8. JS的call方法的作用解释,简单易懂

    先看看关于call()的官方解释,“调用一个对象的一个方法,以另一个对象替换当前对象.”,看了这样的解释,或许让你更摸不着头脑了.看例子: var x = "我是全局变量"; // ...

  9. 2018-2019-2 网络对抗技术 20165227 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165227 Exp3 免杀原理与实践 **免杀** - 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. - 要做好免杀,就 ...

  10. Pytorch 各种奇葩古怪的使用方法

    h1 { counter-reset: h2counter; } h2 { counter-reset: h3counter; } h3 { counter-reset: h4counter; } h ...