欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > Alinx MPSoC驱动开发第11章异步IO实验按下按键报IO Possibile后结束进程

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

2025/9/27 18:02:19 来源:https://blog.csdn.net/qq1016019583/article/details/142203462  浏览:    关键词: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。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词