RPi :: Pin对象-它们可以销毁吗?这样就可以创建使用该引脚的另一个引脚?

问题描述 投票:1回答:1

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对象的析构函数中?)

perl raspbian wiringpi
1个回答
1
投票

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";
}    
© www.soinside.com 2019 - 2024. All rights reserved.