RPi :: Pin对象-看起来无法正确销毁它们?
在此(perl)Test :: More测试片段中,我创建了一个图钉,使用它(我看着指示灯闪烁,然后销毁图钉对象并尝试创建另一个对象。失败如下所示。
subtest 'pin level reuse' => sub {
my $pinNumber = 4;
my $pin = $wpi->pin ($pinNumber);
$pin->mode (OUTPUT);
# Blink to show it's working
diag "Light will blink";
$pin->write(1); sleep (.2); $pin->write(0); sleep (.2);
$pin->write(1); sleep (.2); $pin->write(0);
pass ('link');
# Now, can I destroy the pin object?
$pin = 0;
pass ('delete pin');
# Now, new pin object?
$pin = $wpi->pin ($pinNumber);
$pin->mode (OUTPUT);
pass ('create new pin');
# Blink to show it's working
diag "Light will blink";
$pin->write(1); sleep (.2); $pin->write(0); sleep (.2);
$pin->write(1); sleep (.2); $pin->write(0);
pass ('link');
}; # subtest 'pin level reuse'
此失败:
# Subtest: pin level reuse
# Light will blink
ok 1 - link
ok 2 - delete pin
1..2
ok 6 - pin level reuse
not ok 7 # TODO & SKIP Reusing pins not working yet
# Looks like you planned 6 tests but ran 7.
sc@ordovik:~/repo $ t/Button-002-PI.t
2020/02/29 23:06:11 onPi 1
1..6
ok 1 - 'buttonInterruptQ' isa 'MCE::Shared::Object'
ok 2 - use RPi::WiringPi;
ok 3 - use RPi::Pin;
ok 4 - use Slideshow::Light;
ok 5 - use Slideshow::Button;
# Subtest: pin level reuse
# Light will blink
ok 1 - link
ok 2 - delete pin
cleaned up, exiting...
original error:
pin 4 is already in use... can't create second object
这仅仅是一个限制吗?还是我必须进行其他API调用才能最终释放销钉? (如果是这样,它们肯定应该在RPi :: Pin对象的析构函数中?)
RPi::WiringPi对任意吹走引脚和其他设备非常敏感。它们都在内部进行了注册,以防止发生不良情况。我本着安全第一的心态写的。
例如,它具有内置的检查功能,因此,如果您尝试使用相同的针脚号启动另一个脚本,那么事情将会失败。如果您的脚脚远处的脚本正在使用某个引脚的某个引脚,那么您确实不想禁用和更改该引脚的模式。您看到此错误的原因是,您试图在同一脚本中重新使用一个已经在使用的图钉。
此外,一旦将RPi::Pin
对象设为$pin
,就不能随便将其设置为0
,因为您现在已经吹散了该对象的所有功能和数据。该对象是RPi::Pin
类型的对象。将其更改为0
会将其设置为整数。
[$wpi
对象超出范围或被调用clean()
时,它将所有使用中的管脚重置为调用脚本时的默认设置,并注销它们以供重用。
销毁销钉对象是不明智的,因为这样一来,您就不知道销钉对象处于什么状态。如果要重复使用销钉,则:
$wpi->unregister_pin($pin);
$pin = $wpi->pin($pin_number);
但是,unregister_pin()
虽然公开,但更多是内部问题。与其想要删除一个引脚并重新对其进行初始化,不如直接更改活动引脚上的模式或其他设置,这要好得多。本质上,引脚几乎总是在应用程序的整个运行过程中使用,而不是每次运行都会被生成和破坏多次的引脚。
更好的是,对于单元测试,我将内容划分为较小的范围:
my $pin = 18;
{ # test 1
my $wpi = RPi::WiringPi->new;
my $pin = $wpi->pin($num);
$pin->mode(OUTPUT);
is $pin->mode, OUTPUT, "pin mode is output for pin $num";
# end of scope; everything will be properly cleaned up and destroyed
}
{ # test 2
my $wpi = RPi::WiringPi->new;
my $pin = $wpi->pin($num);
is $pin->mode, INPUT, "pin mode is input for pin $num";
}