如何在 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
我使用 Blink
和 BlinkToRadio
示例作为指南,但没有看到每个单独的 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
,它连接了 CoolLedM
的 Leds
接口,但它有两个问题:
CoolLedC
本身没有在任何地方使用。
CoolLedC
没有提供任何接口,所以不能真正使用
要立即解决您的问题,请像在 CoolLedC
中那样在 AppC
中连接 Leds
(并删除未使用的 CoolLedC
):
components LedsC;
CoolLedM.Leds -> LedsC;
一个更好更通用的设计(参见下面的链接)是将CoolLedC
定义为一个提供CoolLedI
接口的自包含模块。我建议从一些教程开始学习更多关于 nesC 和 TinyOS 的知识:
我想了解 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
我使用 Blink
和 BlinkToRadio
示例作为指南,但没有看到每个单独的 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
,它连接了 CoolLedM
的 Leds
接口,但它有两个问题:
CoolLedC
本身没有在任何地方使用。CoolLedC
没有提供任何接口,所以不能真正使用
要立即解决您的问题,请像在 CoolLedC
中那样在 AppC
中连接 Leds
(并删除未使用的 CoolLedC
):
components LedsC;
CoolLedM.Leds -> LedsC;
一个更好更通用的设计(参见下面的链接)是将CoolLedC
定义为一个提供CoolLedI
接口的自包含模块。我建议从一些教程开始学习更多关于 nesC 和 TinyOS 的知识: