Перейти к содержанию
    

scmRTOS.3.05 и mspgcc4

Здравствуйте. У меня возникла следующая проблема. При попытке собрать примеры scmRTOS.3.05 для микроконтроллеров MSP430 компилятор (msp430-gcc 4.6.3) выдаёт большое количество ошибок (листинг представлен ниже). Хотелось бы понять в чём дело, примеры для 4-ой версии ОСи данным компилятором собираются без проблем.

 

../scmRTOS/MSP430/OS_Target.h: В функции «void SetISRStackPointer()»:

../scmRTOS/MSP430/OS_Target.h:219:5: ошибка: некорректное преобразование из «word {aka short unsigned int}» в «void*» [-fpermissive]

/usr/local/lib/gcc/msp430/4.6.3/../../../../msp430/include/intrinsics.h:82:6: ошибка: при инициализации 1 -го аргумента «void __write_stack_pointer(void*)» [-fpermissive]

../scmRTOS/MSP430/OS_Target.h: В функции «void SetStackPointer(TStackItem*)»:

../scmRTOS/MSP430/OS_Target.h:222:61: ошибка: некорректное преобразование из «word {aka short unsigned int}» в «void*» [-fpermissive]

/usr/local/lib/gcc/msp430/4.6.3/../../../../msp430/include/intrinsics.h:82:6: ошибка: при инициализации 1 -го аргумента «void __write_stack_pointer(void*)» [-fpermissive]

In file included from ../scmRTOS/MSP430/OS_Target.h:230:0,

from ../scmRTOS/Common/scmRTOS.h:52,

from ./src/main.cpp:48:

../scmRTOS/Common/OS_Kernel.h: At global scope:

../scmRTOS/Common/OS_Kernel.h:111:44: ошибка: «TBaseProcess» не был декларирован

../scmRTOS/Common/OS_Kernel.h:112:49: ошибка: «TBaseProcess» не был декларирован

../scmRTOS/Common/OS_Kernel.h:113:54: ошибка: «TBaseProcess» не является именем типа

../scmRTOS/Common/OS_Kernel.h:113:68: ошибка: ISO C++ запрещает декларации «p» без типа [-fpermissive]

../scmRTOS/Common/OS_Kernel.h:114:55: ошибка: «TBaseProcess» не является именем типа

../scmRTOS/Common/OS_Kernel.h:114:69: ошибка: ISO C++ запрещает декларации «p» без типа [-fpermissive]

../scmRTOS/Common/OS_Kernel.h:124:9: ошибка: «TBaseProcess» не является именем типа

../scmRTOS/Common/OS_Kernel.h:148:44: ошибка: «TBaseProcess» не был декларирован

In file included from ../scmRTOS/MSP430/OS_Target.h:230:0,

from ../scmRTOS/Common/scmRTOS.h:52,

from ./src/main.cpp:48:

../scmRTOS/Common/OS_Kernel.h: В функции «bool OS::IsProcessSuspended(const OS::TBaseProcess&)»:

../scmRTOS/Common/OS_Kernel.h:123:21: ошибка: «OS::TProcessMap OS::TKernel::ReadyProcessMap» is private

../scmRTOS/Common/OS_Kernel.h:283:19: ошибка: в данном контексте

../scmRTOS/Common/OS_Kernel.h: At global scope:

../scmRTOS/Common/OS_Kernel.h:307:6: ошибка: прототип для «void OS::TKernel::RegisterProcess(OS::TBaseProcess*)» не имеет соответствия в классе «OS::TKernel»

../scmRTOS/Common/OS_Kernel.h:148:28: ошибка: претендент: void OS::TKernel::RegisterProcess(int*)

../scmRTOS/Common/OS_Kernel.h: В функции-члене «void OS::TKernel::SystemTimer()»:

../scmRTOS/Common/OS_Kernel.h:333:27: ошибка: нет декларации «ProcessTable» в этой области видимости

../scmRTOS/Common/OS_Kernel.h: В функции-члене «TStackItem* OS::TKernel::ContextSwitchHook(TStackItem*)»:

../scmRTOS/Common/OS_Kernel.h:383:5: ошибка: нет декларации «ProcessTable» в этой области видимости

../scmRTOS/Common/OS_Kernel.h: At global scope:

../scmRTOS/Common/OS_Kernel.h:398:28: ошибка: «void OS::Run()» следовало объявить внутри «OS»

../scmRTOS/Common/OS_Kernel.h: В функции «void OS::Run()»:

../scmRTOS/Common/OS_Kernel.h:400:29: ошибка: «class OS::TKernel» has no member named «ProcessTable»

In file included from ../scmRTOS/Common/OS_Kernel.h:404:0,

from ../scmRTOS/MSP430/OS_Target.h:230,

from ../scmRTOS/Common/scmRTOS.h:52,

from ./src/main.cpp:48:

../scmRTOS/Common/OS_Services.h: В функции-члене «bool OS::channel<T, size, S>::pop(T&, TTimeout)»:

../scmRTOS/Common/OS_Services.h:311:34: ошибка: «class OS::TKernel» has no member named «ProcessTable»

../scmRTOS/Common/OS_Services.h: В функции-члене «bool OS::channel<T, size, S>::pop_back(T&, TTimeout)»:

../scmRTOS/Common/OS_Services.h:353:34: ошибка: «class OS::TKernel» has no member named «ProcessTable»

../scmRTOS/Common/OS_Services.h: В функции-члене «bool OS::channel<T, size, S>::read(T*, S, TTimeout)»:

../scmRTOS/Common/OS_Services.h:412:30: ошибка: «class OS::TKernel» has no member named «ProcessTable»

Сборка завершилась с ошибкой.

In file included from ../scmRTOS/Common/scmRTOS.h:52:0,

from ./src/main.cpp:48:

../scmRTOS/MSP430/OS_Target.h: В функции-члене «void OS::TISRW_SS::ISR_Enter()»:

../scmRTOS/MSP430/OS_Target.h:278:24: ошибка: «class OS::TKernel» has no member named «ProcessTable»

../scmRTOS/MSP430/OS_Target.h: В функции-члене «void OS::TISRW_SS::ISR_Exit()»:

../scmRTOS/MSP430/OS_Target.h:287:36: ошибка: «class OS::TKernel» has no member named «ProcessTable»

./src/main.cpp: At global scope:

./src/main.cpp:110:17: ошибка: specializing member «OS::process<(OS::TPriority)0u, 200u>::Exec» requires «template<>» syntax

make: *** [obj/main.o] Ошибка 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотелось бы понять в чём дело,
Компилятор стал более строгим.

 

примеры для 4-ой версии ОСи данным компилятором собираются без проблем.
Используйте четвертую версию. Если проект старый и не хочется исправлять в нем все вызовы ОС на новый стиль - есть файл совместимости scmRTOS_310_compat.h, с ним надо внести в исходник минимум исправлений. Или смотрите, как в ней реализованы проблемные функции в четвертой версии и переносите изменения в третью.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор стал более строгим.

 

Но ведь стандарт языка остался тем же самым

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но ведь стандарт языка остался тем же самым
Изменилась степень его понимания авторами компилятора :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но ведь стандарт языка остался тем же самым

Просто более старый компилятор менее строго соответствовал этому стандарту. Компилятор поправили, и он стал ругаться на вещи, которые раньше пропускал.

Насколько я помню, там проблема одна: при определении шаблонной функции - члена класса нужно обрамлять её namespace-ом.

То есть, было:

template <>
OS_PROCESS void TProc1::exec()
{
    for(;;)
    {
        ef.wait();
        BlueLED::Off();
    }
}

стало:

namespace OS
{
    template <>
    OS_PROCESS void TProc1::exec()
    {
        for(;;)
        {
            ef.wait();
            BlueLED::Off();
        }
    }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...