Как подключить светодиоды в NESC? - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь понять, как работают модули, конфигурации, интерфейсы и компоненты nesC. Для этого я попытался реализовать очень простое приложение; когда он завершит загрузку, он должен включить три светодиода, чтобы показать его 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 в качестве руководства, но не видел, чтобы каждый отдельный светодиод был подключен. Так что же означает это сообщение об ошибке? И как мне решить эту проблему?


Вот моя программа с комментарием, показывающая, в каком файле она находится.

// 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();
        ...
    }
}

1 Ответ

2 голосов
/ 15 апреля 2019

Ошибка говорит о том, что CoolLedM использует интерфейс 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 в AppC, как вы это делали в CoolLedC (и удалите неиспользованные CoolLedC):

    components LedsC;
    CoolLedM.Leds -> LedsC;

Лучшим и более распространенным дизайном (см. Ссылки ниже) является определение CoolLedC как автономного модуля, обеспечивающего интерфейс CoolLedI. Я рекомендую начать с некоторого учебника, чтобы узнать больше о nesC и TinyOS:

...