当前位置:   article > 正文

Linux异步通知实验:应用程序对异步通知的处理

Linux异步通知实验:应用程序对异步通知的处理

一. 简介

前面文章学习了 应用程序对异步通知的处理方法,另一篇文章实现了Linux驱动对异步通知的处理:

Linux应用程序对异步通知的处理-CSDN博客

Linux异步通知实验:驱动中异步通知的处理-CSDN博客

本文继续Linux异步通知实验,主要实现Linux应用程序对异步通知的处理(也就是信号处理函数)。

二. Linux异步通知实验:应用程序对异步通知的处理

1. 编写应用程序

在 15_async_notice工程目录下创建应用程序文件 signalApp.c,应用程序对异步通知的处理如下:

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <signal.h>
  8. /*
  9. *测试按键是否按下
  10. * 运行命令: ./signalApp /dev/key_irq
  11. */
  12. int fd;
  13. //信号处理函数
  14. void sigio_signal_handler(int num)
  15. {
  16. int ret = 0;
  17. int key_value = 0;
  18. ret = read(fd, &key_value, sizeof(key_value));
  19. if(ret < 0)
  20. {
  21. printf("read key_value error!\n");
  22. }
  23. else
  24. {
  25. printf("Key0 Press! key_value: %d\n", key_value);
  26. }
  27. }
  28. int main(int argc, char* argv[])
  29. {
  30. int ret = 0;
  31. char * device_name = NULL;
  32. int key_value = 0;
  33. int flags = 0;
  34. if(argc != 2)
  35. {
  36. printf("main's param number error!\n");
  37. return -1;
  38. }
  39. device_name = argv[1];
  40. fd = open(device_name, O_RDWR);
  41. if(fd < 0)
  42. {
  43. printf("open led device failed!\n");
  44. return -1;
  45. }
  46. //1. 注册信号处理函数
  47. signal(SIGIO, sigio_signal_handler);
  48. //2. 将本应用程序PID告诉内核
  49. fcntl(fd, F_SETOWN, getpid());
  50. //3. 开启异步通知
  51. flags = fcntl(fd, F_GETFL); //获取文件状态
  52. fcntl(fd, F_SETFL, flags | FASYNC);//开启当前进程的异步通知功能
  53. while(1)
  54. {
  55. sleep(2);
  56. }
  57. return 0;
  58. }

2.  编译应用程序

对 应用程序 signalApp.c进行编译:

wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/15_async_notice$ arm-linux-gnueabihf-gcc signalApp.c -o signalApp

我这里可以编译通过,生成应用程序 signalApp。

三. 对驱动模块进行测试

1.  拷贝驱动模块与应用程序

将上一篇文章(Linux驱动对异步通知处理的代码)编译生成的驱动模块 key_irq.ko与上面的应用程序 signalApp拷贝到 开发板系统中:

wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/15_async_notice$ sudo cp signalApp key_irq.ko /home/wangtian/linux/nfs_File/rootfs/lib/modules/4.1.15/ -f

2.  加载测试驱动模块

开发板上电后进入系统 /lib/modules/4.1.15/目录下,确认 驱动文件是否已经存在:

可以看出,驱动模块 key_irq.ko与应用程序 signalApp都已存在。

(1)  加载驱动模块

注意:如果选择使用 "modprobe" 命令加载驱动模块,则在驱动程序第一次加载时首先运行 "depmod" 命令!

这里因为 key_irq.ko驱动模块之前实验已经加载过,所以不是第一次运行,所以,不需要运行 "depmod"命令。

使用 "modprobe" 命令加载驱动模块:

(2) 确认驱动模块是否加载成功

查看 驱动模块是否加载成功:运行 "lsmod" 命令或运行 "cat /proc/devices" 命令进行查看。

这里运行 "lsmod" 命令查看:

可以看出,驱动模块已经加载成功。

确认是否自动创建设备节点,输入 "ls -l /dev/key_irq"命令确认:

可以看出,这里也已经自动创建了设备节点。

(3)  按键中断功能测试

这里选择后台运行程序,输入如下命令进行测试:

./signalApp /dev/key_irq 

这时按下按键,每按下一次按键就会有按键按下的信息,如下所示:

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号