首页 > 解决方案 > 如何连接nesC中的LED?

问题描述

我试图了解 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();
        ...
    }
}

标签: tinyosnesc

解决方案


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

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

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

您还定义CoolLedC了 ,它确实连接了 的Leds接口CoolLedM,但它有两个问题:

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

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

    components LedsC;
    CoolLedM.Leds -> LedsC;

更好和更常见的设计(见下面的链接)是定义CoolLedC为提供CoolLedI接口的自包含模块。我建议从一些教程开始,以了解有关 nesC 和 TinyOS 的更多信息:


推荐阅读