嵌入式实战—应用open调用内核open,应用close调用内核close通信程序
我的学记|刘航宇的博客

嵌入式实战—应用open调用内核open,应用close调用内核close通信程序

刘航宇
4年前发布 /正在检测是否收录...
温馨提示:
本文最后更新于2021年06月18日,已超过1383天没有更新,若内容或图片失效,请留言反馈。

应用open调用内核open,应用close调用内核close通信程序

1.在TM命令窗口中,不要进入sudo -s,先创建一个普通目录 mkdir liu
2.下载已经配置好的Makefile文件(在虚拟机liunx系统浏览器输入tiie.cn网址,找到本文,下载Makefile文件),将这个文件移动到创建的liu文件夹内,如果下载后名称不是Makefile,重命名下载的文件为Makefile

::(你懂的) ::(你懂的) 不是我吹,我的云盘下载速度吊打某度云,免费不限速

3.进入root模式 ,创建驱动程序: hello.c程序, vim hello.c 注意不要改名字,否则可能会报错,这个makefile配置的是hello.c不能改名字的!!!非高手怕报错,将下面所有东西,全部放在liu文件夹内
提示:下面程序直接在liunx浏览器里面复制即可,不用敲,很多同学容易敲错,报错找不到问题所在。

程序中liuhangyu可改成你的名字
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/kdev_t.h>
#include <linux/fs.h>   //file_operations 
MODULE_LICENSE ("GPL");
int i = 10;
struct file_operations ops;
struct cdev mycdev;
int major = 100;
int minor = 1;
dev_t dev;
int j= 0;
int k= 0; 
int myopen(struct inode *pinode,struct file *pfile)
{
    j++;
    printk(KERN_INFO "liuhangyu myopen run j= %d\n",j);
    return 0;
} 
int myclose(struct inode *pinode,struct file *pfile)
{
    k++;
    printk(KERN_INFO "liuhangyu myclose run k= %d\n",k);
    return 0;
}
void liuhangyu_init(void)
{
    int ret;
    mycdev.owner=THIS_MODULE;
    dev = MKDEV(major,minor);
    ret = register_chrdev_region(dev,1,"liuhangyu");
    if(ret==-1)
    {
        printk(KERN_INFO "dev cant't use\n");
        ret = alloc_chrdev_region(&dev,1,1,"liuhangyu");   //automatic allocation dev
        if(ret==0)
        {
            printk(KERN_INFO "alloc : major= %d\n",MAJOR(dev));
        }
        else
        {
            printk(KERN_INFO "alloc error\n");
            return ; 
        }
    }
    else
        {
        printk(KERN_INFO "dev can use\n");
        }
    ops.owner=THIS_MODULE;
    ops.open=myopen;
    ops.release=myclose;
    cdev_init(&mycdev,&ops);
    cdev_add(&mycdev,dev,1);  //mycdev send dev,equipment 1
    return ;
 }  
 static int  __init hello_init (void)
{
    i ++;
    liuhangyu_init();    //init
    printk (KERN_INFO "driver init,i = %d\n",i);
    return 0;
}

static void  __exit hello_exit (void)
{
    i ++; 
    printk (KERN_INFO "driver exit,i = %d\n",i);
    unregister_chrdev_region(dev,1);
    cdev_del(&mycdev); 
}

module_init (hello_init);
module_exit (hello_exit);
 
 

4.保存下一步分别输入 make 回车 insmod hello.ko回车
5.完成后打开第二TM窗口,在同目录下,创建同理app.c程序,这个是应用层程序。

#include "stdio.h"
#include "fcntl.h"
#include "unistd.h"
#include "stdlib.h"
int main()
{
    int fd;
    int q = 0;
    while(1)
    {
        fd = open("./liuhangyu",O_RDWR,0777) ;
        if(fd==-1)
        {
            printf("open error\n");
            return -1;
         }
         q ++;
         printf("liuhangyu open  run q = %d\n",q);
         sleep (8);
         close(fd);
         q ++;
         printf("liuhangyu close  run q = %d\n",q);
         sleep (8);
    }
    return 0;
}

6.输入 mknod ./liuhangyu c 100 1
7.输入 gcc -o app app.c
8.输入./app观察2个窗口现象,每隔几秒给第一个窗口输入dmesg可以看到通信是成功的
图片[1] - 嵌入式实战—应用open调用内核open,应用close调用内核close通信程序 - 我的学记|刘航宇的博客
图片[2] - 嵌入式实战—应用open调用内核open,应用close调用内核close通信程序 - 我的学记|刘航宇的博客
以上则完成全部测试,下面讲解退出

9.输入键盘敲Ctrl+C强制退出app程序
10 分别输入rmmod hello.ko回车,make clean回车
好下课!

© 版权声明
THE END
喜欢就支持一下吧
点赞 11 分享 赞赏
评论 共10条
取消
  1. 头像
    18808
     · 
    回复

    ::(大拇指)::(大拇指)::(大拇指)

    1. 头像
      刘航宇 作者
       · 
      回复

      @18808

      ::(哈哈)

  2. 头像
    萝卜
     · 
    回复

    按照步骤做的,为什么到make的时候显示no targets specified and no makefile found

    1. 头像
      刘航宇 作者
       · 
      回复

      @萝卜

      makefile和hello.c不在同一文件内,请在文件夹中操作

      1. 头像
        萝卜
         · 
        回复

        @刘航宇

        是生成hello.c之后,放到开始创建的文件夹中吗,这样做也不行::(泪)

        1. 头像
          刘航宇 作者
           · 
          回复

          @萝卜

          输入ls命令,查看有没有makefile文件,你肯定没有这个文件把这个文件放在和hello.c同一目录中

  3. 头像
    思考者
     · 
    回复

  4. 头像
    Tom
     · 
    回复

    画图

    1. 头像
      刘航宇 作者
       · 
      回复

      @Tom

      ::(胜利)

  5. 头像
    小张
     · 
    回复

    很有用的文章