侧边栏壁纸
    • 累计撰写 300 篇文章
    • 累计收到 524 条评论
    嵌入式实战—应用open调用内核open,应用close调用内核close通信程序
    我的学记|刘航宇的博客

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

    刘航宇
    2021-05-09 / 10 评论 / 578 阅读 / 正在检测是否收录...

    应用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可以看到通信是成功的


    以上则完成全部测试,下面讲解退出

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

    11
    matlab实现灰度图像边缘提取
    « 上一篇 2021-05-11
    概率论证明样本方差ES^2=DX=σ^2
    下一篇 » 2021-05-08

    评论 (10)

    取消
    1. 头像
      18808
      Windows 10 · Google Chrome

      表情表情表情

      回复
      1. 头像
        刘航宇 作者
        Windows 10 · Google Chrome
        @ 18808

        表情

        回复
    2. 头像
      萝卜
      iPhone · QQ Browser

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

      回复
      1. 头像
        刘航宇 作者
        Windows 10 · Google Chrome
        @ 萝卜

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

        回复
        1. 头像
          萝卜
          iPhone · QQ Browser
          @ 刘航宇

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

          回复
          1. 头像
            刘航宇 作者
            Windows 10 · Google Chrome
            @ 萝卜

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

            回复
    3. 头像
      思考者
      Android · Google Chrome

      回复
    4. 头像
      Tom
      Android · Google Chrome

      画图

      回复
      1. 头像
        刘航宇 作者
        Windows 10 · Google Chrome
        @ Tom

        表情

        回复
    5. 头像
      小张
      Android · Google Chrome

      很有用的文章

      回复