Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Использование channel в разных модулях.
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
Вячик13
В главном модуле, где процессы, имеется объявление channel:

OS::channel<TKeyCode,16> KeyMsg;

В другом модуле имеется подпрограмма, которая пишет в канал:

KeyMsg.push(KeyEvent);

Как в этом модуле объявить внешний объект?

Nixon
Не вижу препятствий! (с)

объявите во втором модуле:
extern OS::channel<TKeyCode,16> KeyMsg;
Вячик13
Цитата(Nixon @ May 30 2012, 16:35) *
Не вижу препятствий! (с)

объявите во втором модуле:
extern OS::channel<TKeyCode,16> KeyMsg;


Объявил.
Получил ошибку:

Error[Pe276]: name followed by "::" must be a class or namespace name F:\IARProjects\WeightTerminal\Src\Key.h 58

Инклуд определений OS имеется и стоит раньше объявления внешнего объекта.

#include <scmRTOS.h>

Это тоже не проходит:

extern class OS;

Получаю ошибку:

Error[Pe101]: "OS" has already been declared in the current scope (at line 63 of "F:\IARProjects\WeightTerminal\src\scmRTOS_TARGET_CFG.h") F:\IARProjects\WeightTerminal\Src\Key.h 58

Сергей Борщ
QUOTE (Вячик13 @ May 31 2012, 08:59) *
Получил ошибку:
А тип TKeyCode в этом месте уже объявлен?
a9d
Я делаю вот так.
http://we.easyelectronics.ru/os-rtos/scmrt...allback-ov.html

Подсмотрел этот способ в LUFA.
Вячик13
Спасибо всем.

Эффект я устранил, но причину не понял.

Объявление:

extern OS::channel<TKeyCode,16> KeyMsg;

у меня было в модуле объявлений Key.h.

В модуле программного кода Key.cpp было два инклуда:

#include <scmRTOS.h>
#include "Key.h"

Имено в таком порядке.
После того, как я перенёс инклуд

#include <scmRTOS.h>

из модуля Key.cpp в модуль Key.h всё заработало.

Объясните, пожалуйста, в чём моя ошибка.
Сергей Борщ
QUOTE (Вячик13 @ Jun 1 2012, 08:21) *
Объясните, пожалуйста, в чём моя ошибка.
Вероятно, ошибка возникала при компиляции файла, в котором перед Key.h не был включен scmRTOS.h. Значит, компилятор понятия не имел ни об объявленном там пространстве имен OS, ни об объявленном в этом пространстве имен шаблонном классе channel, о чем и жаловался. Вы ведь наверняка включили объявление KeyMsg для того, чтобы где-то дальше в тексте обратиться к объекту KeyMsg? А во что должен компилятор компилировать такое обращение, если он понятия не имеет - что это за тип?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.