当前位置: 首页 > article >正文

Alinx MPSoC驱动开发第11章异步IO实验按下按键报IO Possibile后结束进程

实验现象

       使用Alinux官方提供的驱动和应用程序代码,petalinux工程基于自身需要进行了一定的修改(主要是SD卡根文件系统)。在把petalinux工程编译后打包的boot.scr、BOOT.BIN、image.ub放入FAT分区,把驱动程序与应用程序放在NFS共享路径中,运行后的结果如下:
在这里插入图片描述

       在运行应用程序后,按下按键,直接就release,退出了进程,并在最后打印了I/O possible。

问题分析与解决

       从I/O possible入手,经过查询,其表示设备现在处于可以进行I/O操作的状态。这通常是由驱动程序或硬件状态改变触发的,比如设备完成了一个先前的操作,或者设备的电源/连接状态已经稳定。也确实是在我们按下按键以后才出现的,合理推断,系统捕捉到了按键的输入,但由于驱动或应用程序的问题,导致了这个结果

       Alinx教程这一章讲的是异步IO,在其中强调,对信号的处理有三种方式:忽略,系统默认的处理与用户自定义的方式,而对于第二种,几乎都是终止进程或者暂停进程。从这个角度继续切入找一下驱动与应用程序有关信号的部分。

       在驱动中的定时回调函数中,给应用层发送了信号,代码如下:

void timer_function(struct timer_list *timer)
{
	alinx_char.key_state = 1;
	if(alinx_char.fasync_p)
	{
		kill_fasync(&alinx_char.fasync_p, SIGIO, POLL_IN);
	}
}

       特别注意的是,驱动给应用层发送的是SIGIO信号

       再看看应用程序,设计内容如下:

signal(SIGUSR2, sigio_signal_func);
fcntl(fd_key, F_SETOWN, getpid());
flag = fcntl(fd_key, F_GETFL);
fcntl(fd_key, F_SETFL, flag | FASYNC);

       第一行,应用层把信号的回调函数sigio_signal_func绑定给了SIGUSR2信号,用户信号。

       那问题也就显而易见了,驱动与应用所使用的信号不是一个信号!所以只需要把驱动的信号改为SIGUSR2或者把应用程序的信号改为SIGIO就行了。

       我这里改的是应用层,最后的结果如下:
在这里插入图片描述
       此时已经可以按照预期的设计,根据按键翻转PS端LED。


http://www.kler.cn/a/307878.html

相关文章:

  • 「QT」窗口类 之 QWidget 窗口基类
  • 【常见问题解答】远程桌面无法复制粘贴的解决方法
  • (六)Spark大数据开发实战:豆瓣电影数据处理与分析(scala版)
  • neo4j desktop基本入门
  • 【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)
  • 从0开始学习Linux——文件管理
  • 【运维】好用的线上项目运维命令
  • ASPICE培训:打造卓越的汽车软件开发能力
  • 比传统机器学习更先进的深度学习神经网络的二分类建模全流程教程
  • 【网络原理】❤️Tcp 常用机制❤️ —— 延时应答,捎带应答, 面向字节流, 异常情况处理。保姆式详解 , 建议收藏 !!!
  • Kafka支持SSL/TLS协议技术深度解析
  • Android13 下载apk并安装apk
  • 跳出大厂圈子——普通程序员如何开启逆袭之路
  • mac上什么压缩软件没有广告,苹果电脑解压软件BetterZip有广告吗
  • 深入理解MATLAB中的事件处理机制
  • ROS组合导航笔记:融合传感器数据
  • 嵌入式数据库sqlite和rocksdb的介绍以及对比
  • 分治算法归并排序
  • CSP-J/S赛前知识点大全2:初赛纯靠记忆的知识点
  • Docker高级管理之compose容器编排与私有仓库的部署
  • FPGA实现串口升级及MultiBoot(四)MultiBoot简介
  • [苍穹外卖]-12Apache POI入门与实战
  • 滚雪球学SpringCloud[2.1]:服务注册中心Eureka
  • robomimic基础教程(三)——自带算法
  • 【Linux】ICMP
  • 【开端】docker基线漏洞修复