如何在 nesC 中连接 LED?

How to connect LED's in nesC?

我想了解 nesC 的模块、配置、接口和组件是如何工作的。 为此,我尝试实现了一个非常简单的应用程序;当它完成启动时,它应该打开它的三个 LED 来显示它的 ID。 但我得到错误:

/home/tinyos/WSN-Project/src/CoolLed/CoolLedM.nc: In function `CL.setCoolLed':
/home/tinyos/WSN-Project/src/CoolLed/CoolLedM.nc:12: Leds.led0On not connected
/home/tinyos/WSN-Project/src/CoolLed/CoolLedM.nc:14: Leds.led0Off not connected

我使用 BlinkBlinkToRadio 示例作为指南,但没有看到每个单独的 LED 连接。 那么这个错误信息是什么意思呢? 我该如何解决这个问题?


这是我的程序,注释显示它被放置在哪个文件中。

// AppC.nc
configuration AppC{}
implementation{
    components AppM;
    components MainC;
    AppM.Boot -> MainC;
    components CoolLedM;
    AppM.CL -> CoolLedM;
}

// AppM.nc
module AppM{
    uses interface Boot;
    uses interface CoolLedI as CL;  
}
implementation{
    event void Boot.booted(){
        call CL.setCoolLed((uint8_t)TOS_NODE_ID);
    }
}

// CoolLedI.nc
interface CoolLedI{
    command void setCoolLed(uint8_t mask);
}

// CoolLedC.nc
configuration CoolLedC{}
implementation
{
    components CoolLedM;
    components LedsC;
    CoolLedM.Leds -> LedsC;
}

// CoolLedM.nc
module CoolLedM{
    provides interface CoolLedI as CL;
    uses interface Leds;
}
implementation{
    command void CL.setCoolLed(uint8_t mask){
        if(mask & 0x01)
            call Leds.led0On();
        else
            call Leds.led0Off();
        ...
    }
}

错误表明 CoolLedM 使用接口 Leds,但该接口未连接到任何实现。让我们看看 AppC.nc:

configuration AppC{}
implementation{
    components AppM;
    components MainC;
    AppM.Boot -> MainC;
    components CoolLedM;
    AppM.CL -> CoolLedM;
}

确实:您在应用程序中使用了 CoolLedM,但没有定义模块使用的 Leds 的实现方式。

您还定义了 CoolLedC,它连接了 CoolLedMLeds 接口,但它有两个问题:

  • CoolLedC 本身没有在任何地方使用。
  • CoolLedC没有提供任何接口,所以不能真正使用

要立即解决您的问题,请像在 CoolLedC 中那样在 AppC 中连接 Leds(并删除未使用的 CoolLedC):

    components LedsC;
    CoolLedM.Leds -> LedsC;

一个更好更通用的设计(参见下面的链接)是将CoolLedC定义为一个提供CoolLedI接口的自包含模块。我建议从一些教程开始学习更多关于 nesC 和 TinyOS 的知识: