• 异步通知


    先写一个测试函数:

    #include <stdio.h>

    #include <signal.h>    //signal函数的需要

    设置信号处理函数!!!用signal1.

    void  my_signal_fun(int  signum)

    {

      static  int  cnt = 0;

      printf("signal = %d,  %d  times ",  signum,  ++cnt)

    }

     作用:打印信号。

    int main(int  argc,  char  **argv)

    {

      signal(SIGUSR1,  my_signal_fun);

    信号和中断差不多,需要注册

      while(1)

      {

        sleep(1000);

      }

    }

    可以用kil命令来发送信号,需要明确进程号,即PID数值。

    kill -USR1  833  USR1 = 10

    kill -10  833

    kil  -9  833  默认退出

    要点:

      1.注册信号处理函数

      2.发送信号,kill -10  833

    目标:

    按下按键时,驱动程序通知应用程序

      1.应用程序要注册信号处理函数

      2.确定谁发信号(驱动)

      3.发给谁(应用),应用程序告诉内核自己的PID!

      4.怎么发?驱动调用某个函数发送。kill_fasyn

    实施:在中断程序中发送数据

     先定义一个结构体:

      static  struct  fasync_struct  *button_async;

      

     在中断程序wake_up下面再加上:

      kill_fasync(&button_async,  SIGIO,  POLL_IN);

     建立新的fileoperation结构体L:

     static  struct  file_operations  fifth_drv_fops =  {

      .owner   =  THIS_MODULE,

      .open  =  fifth_drv_open;

      .read  =  fifth_drv_read,

      .release  =  fifth_drv_release,

      .poll  =  fifth_drv_poll,   

      .fasync =  fifth_drv_fasync

    };

     新建相应的处理函数:

    static  int  fifth_drv_fasync(int  fd,  struct  file  *filp,  int  on)

    {

      return  fasync_helper(fd,  filp,  on,  &button_async);

    }

     通过F_SETTOWN命令,调用fcntl(fd,F_SETDOWN,pid)应用程序调用这个函数来告诉驱动自己的PID。

    应用程序读出flag,并修改之。

    Oflags = fcntl(fd,  F_GETFL);

    fcntl(fd,  F_SETFL,  oflags  |  FASYNC);

    fasync_helper函数用于初始化结构体,

     新的main函数:

    void  my_signal_fun(int  signum)

    {

      unsigned char key_val;

      read(fd,&key_val,1);

      printf("key_val:0x%x ",key_val);

    }

    int main(int argc,  char  **argc)

    {

      unsigned char key_val;

      int ret;

      signal(SIGIO,my_signal_fun);    //信号处理函数

      fd = open("/dev/buttons",O_RDWR);

      if(fd < 0)

      {

        printf("can't  open! ");

      }

      fcntl(fd,  F_SETOWN,  getpid())

      Oflags  =  fcntl(fd, F_GETFL);

      fcntl(fd,  F_SETFL,  Oflags  |  FASYNC);

      while(1)

      {

        sleep(1000);

      }

    }

  • 相关阅读:
    截取nginx日志
    wampserver安装之后无法打开localhost
    wampserver安装之后无法打开localhost
    wampserver安装之后无法打开localhost
    wampserver安装之后无法打开localhost
    gitlab给用户添加提交到主干的权限
    动手为王 | Oracle 数据库跨版本升级迁移实践
    ie8关于@font-face无效的兼容问题
    web自定义中文字体
    django 前后台交互过程
  • 原文地址:https://www.cnblogs.com/stm32f4/p/7672550.html
Copyright © 2020-2023  润新知