Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是和不是';GPIO状态转换(perl、RPi::WiringPi、Raspberry pi、Raspbian)的回调(中断)子例程中不允许_Perl_Raspberry Pi - Fatal编程技术网

什么是和不是';GPIO状态转换(perl、RPi::WiringPi、Raspberry pi、Raspbian)的回调(中断)子例程中不允许

什么是和不是';GPIO状态转换(perl、RPi::WiringPi、Raspberry pi、Raspbian)的回调(中断)子例程中不允许,perl,raspberry-pi,Perl,Raspberry Pi,我试图使用Pi上的GPIO引脚来连接一些按钮,然后我的软件会响应这些按钮。这是向现有的Perl应用程序添加一些控件,因此我的新工作也是使用Perl 真正简单的原型硬件和软件工作;我将引脚配置为输入和上拉模式(并将其连接,以便按下按钮使引脚接地),并建立中断例程,事实上,当我按下按钮时,中断例程被调用。因此,至少我可能已经正确安装了各种软件包和模块。(观察到触点弹跳;我最终将在软件中处理此问题。) 然而,当我试图把它提升到一个水平时,我遇到了奇怪的麻烦。我尝试过很多事情,但都以不同的方式失败了。我

我试图使用Pi上的GPIO引脚来连接一些按钮,然后我的软件会响应这些按钮。这是向现有的Perl应用程序添加一些控件,因此我的新工作也是使用Perl

真正简单的原型硬件和软件工作;我将引脚配置为输入和上拉模式(并将其连接,以便按下按钮使引脚接地),并建立中断例程,事实上,当我按下按钮时,中断例程被调用。因此,至少我可能已经正确安装了各种软件包和模块。(观察到触点弹跳;我最终将在软件中处理此问题。)

然而,当我试图把它提升到一个水平时,我遇到了奇怪的麻烦。我尝试过很多事情,但都以不同的方式失败了。我在这里寻找的是一些关于允许我在中断函数中执行哪些操作的附加信息(由$pin->set_interrupt('main::function_name')设置)。这被称为“中断函数”,也被称为“回调函数”。我怀疑它是否真的在硬件中断级别上运行(Linux甚至不支持用户中断处理程序!),但一般来说,在这种回调中,有一些硬性的规则,或者至少是非常强烈的建议,关于在那里可以做什么,不能做什么,以及以后应该遵循什么

但是,我所能找到的文档(当然不是加载的模块上的基本CPAN文档或perldoc)中没有一个真正告诉我有关约束的更多信息

例如,我发现对Log4Perl记录器的调用在中断函数中很早就开始工作,但不会很晚:-)。我怀疑它们在中断函数中是一个坏主意,有一件事我尝试了一下,但幸运的是,我可能错了,而且没有关于什么是允许的,什么是不允许的文档

有人建议中断函数可以在另一个线程中运行(但这是来自底层WiringPi库而不是Perl包装器,我发现它与未被Perl包装器包装的函数有关,所以可能不是)。我的应用程序没有加载线程库(我一直在避免它;perl线程被正式禁止),但我在更复杂的应用程序中使用的东西可能是(我打算与之集成的主应用程序使用MCE,它使用线程或多个分叉进程;但我遇到问题的原型更简单,而且没有)

我还使用Class::Tiny;我似乎能够在中断函数中调用类方法,但过了一段时间后会变得很奇怪。目前我正在尽可能避免使用它

通常,您要做的是,在interrupt函数中,注意中断发生了,然后将要在主事件循环中处理的事件排队,然后做一些可能的事情来解锁该循环(比如说循环等待的condvar信号).但不知道是否可以在中断函数中安全访问MCE::Shared::Condvar


是否有更多关于中断函数中允许和不允许的内容的信息?是否有更复杂的代码示例(不只是在中断函数中打印内容)?

设置\u中断函数来自哪个模块?抱歉,我错过了;它来自RPi:Pin(RPi::WiringPi的一部分)中断被设计为尽可能小和短。它们通常只用于设置标志或将pin设置为高/低。它们并不意味着要运行一堆代码。您可以在主应用程序中这样做。我是
RPi::WiringPi
及其周围所有内容的作者。您可以用一些示例代码更新您的帖子,以便我可以使用它们吗e您在做什么?另外,我在文档中提到的线程是C线程,它们由底层的
wiringPi
库处理,该库由
wiringPi::API
包装,该库被
RPi::wiringPi
及其许多相关发行版/模块大量使用。我将更新文档,以指定中断应尽可能短,但我想看看你想做什么,明天我会做一些测试和调查。我已经写了1970年的实际硬件中断代码,我想,我试图小心保持中断短。不过,我试图避免的是,在中断中设置一个标志,然后轮询标志在主代码中——中断的全部目的是减少响应条件的延迟,毕竟,轮询增加了延迟。当我尝试读取中断中的pin时,它立即崩溃,我决定我不能这样做;写入不同吗?或者这是某种异常结果吗?
设置了什么模块t
函数来自?很抱歉,我错过了它;它来自RPi:Pin(RPi::WiringPi的一部分)中断被设计为尽可能小和短。它们通常只用于设置标志或将pin设置为高/低。它们并不意味着要运行一堆代码。您可以在主应用程序中这样做。我是
RPi::WiringPi
及其周围所有内容的作者。您可以用一些示例代码更新您的帖子,以便我可以使用它们吗e您在做什么?另外,我在文档中提到的线程是C线程,它们由底层的
wiringPi
库处理,该库由
wiringPi::API
包装,该库被
RPi::wiringPi
及其许多相关发行版/模块大量使用。我将更新文档,以指定中断应尽可能短,但我想看看你想做什么,明天我会做一些测试和调查。我已经写了1970年的实际硬件中断代码,我想,我试图小心保持中断短。不过,我试图避免的是,在中断中设置一个标志,然后轮询标志在主代码中,中断的全部目的是减少延迟i