--------8<---------
пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ!
пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ EventFlag пїЅпїЅпїЅ AVR, пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ IAR 5.51.
Harry Zhurov пїЅ пїЅпїЅпїЅпїЅпїЅпїЅ scmRTOS 440 пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ TIdleProc::exec пїЅпїЅ
OS_Kernel.h пїЅ OS_Kernel.cpp, пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ template<> void TIdleProc::exec()
Error[Pe793]: explicit specialization of function "OS::process<pr,
stack_size, rstack_size>::exec [with pr=OS::prIDLE, stack_size=70U,
rstack_size=10U]" must precede its first use.
пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ IdleProc пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
TIdleProc::exec, пїЅ.пїЅ.
namespace OS
{
#ifndef __GNUC__ // avoid GCC bug (
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15867 )
template<> void TIdleProc::exec();
#endif
template<> void TIdleProc::exec()
{
for(;;)
{
#if scmRTOS_IDLE_HOOK_ENABLE == 1
idle_process_user_hook();
#endif
#if scmRTOS_TARGET_IDLE_HOOK_ENABLE == 1
idle_process_target_hook();
#endif
}
}
}
namespace OS
{
TIdleProc IdleProc;
}
-------8<-----------8<-------------------
пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ gcc пїЅпїЅпїЅпїЅпїЅпїЅ пїЅ IAR? :)
> Error[Pe793]: explicit specialization of function "OS::process<pr,
> stack_size, rstack_size>::exec [with pr=OS::prIDLE, stack_size=70U,
> rstack_size=10U]" must precede its first use.
Да, я тоже это уже заметил неделю назад, просто замотался и не успел подправить.
> Ошибка исчезает если объявление IdleProc разместить после декларации
> TIdleProc::exec, т.е.
>
> namespace OS
> {
> #ifndef __GNUC__ // avoid GCC bug (
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15867 )
> template<> void TIdleProc::exec();
> #endif
...
> namespace OS
> {
> TIdleProc IdleProc;
> }
Определение функции можно и тут, после объявления/определения экземпляра.
Главное, чтобы объявление наличия специализированной для TidleProc
функции exec() было сделано до первого использования типа TidleProc
для определения переменной, когда компилятор норовит сгенерить
функции, которых не хватает.
> Неужели баг gcc проник в IAR? :)
Так это другое. Это, похоже, как раз нужно. А ошибка GCC в том, что он
это ситает избыточным объявлением, потому оно по #ifdef __GNUC__
исключается.
--
wbr,
ReAl
>> Error[Pe793]: explicit specialization of function "OS::process<pr,
>> stack_size, rstack_size>::exec [with pr=OS::prIDLE, stack_size=70U,
>> rstack_size=10U]" must precede its first use.
>
> Да, я тоже это уже заметил неделю назад, просто замотался и не успел подправить.
Вдогонку -- этой беды нет с функциями exec() пользователсьских
процессов в примерах.
typedef OS::process<OS::pr0, 100> TProc1;
typedef OS::process<PROC2_PRIO, 100> TProc2;
typedef OS::process<PROC3_PRIO, 100> TProc3;
namespace OS {
template<> void TProc1::exec();
template<> void TProc2::exec();
template<> void TProc3::exec();
} // namespace OS
//---------------------------------------------------------------------------
// Process objects
TProc1 Proc1;
TProc2 Proc2;
TProc3 Proc3;
Объявления тут и для gcc, и для IAR стоят ДО сохдания объектов,
поэтому обиды "must precede its first use" нет.
Но и для gcc есть объявление exec() для процессов (как то исключённое
по #ifdef для TIdleProc) и никакой обиды на избыточное объявление нет!
Единственная разница с TIdleProc, которую я нашёл, так это то, что
создание переменных тут в глобальном пространстве, а не в namespace
OS. А IdleProc создаётся в namespace OS.
Дальше пока не смотрел.
--
wbr,
ReAl
> О©╫О©╫ О©╫ О©╫О©╫О©╫ gcc О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ exec() О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫чёО©╫О©╫О©╫О©╫
> О©╫О©╫ #ifdef О©╫О©╫О©╫ TIdleProc) О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫!
О©╫О©╫. О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫ GCC О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫
О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ -Wredundant-decls О©╫ makefile!
>> Но и для gcc есть объявление exec() для процессов (как то исключённое
>> по #ifdef для TIdleProc) и никакой обиды на избыточное объявление нет!
>
> Хм. Полез проверять - мой GCC на такое ругается. Потом посмотрел - у тебя
> просто нет флага -Wredundant-decls в makefile!
Я гляну ещё, но я вроде бы добавлял этот флаг и комментировал #ifdef
возле IdleProc и сообщение вроде бы было одно -- возле Idle.
Делал в спешке, мог что-то забыть. Собственно, потому и не писал до
сих пор, что хотел ещё раз проверить.
--
wbr,
ReAl
AG> --------8<---------
AG> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫!
AG> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ EventFlag О©╫О©╫О©╫ AVR, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ IAR 5.51.
AG> Harry Zhurov О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ scmRTOS 440 О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ TIdleProc::exec О©╫О©╫
AG> OS_Kernel.h О©╫ OS_Kernel.cpp, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
AG> О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ template<> void TIdleProc::exec() Error[Pe793]: explicit
specialization of function
AG> "OS::process<pr, stack_size, rstack_size>::exec [with pr=OS::prIDLE,
AG> stack_size=70U, rstack_size=10U]" must precede its first use.
О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ OS_Kernel.h О©╫ OS_Kenrel.cpp О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫
О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫, О©╫О©╫О©╫ VDSP++ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫: О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫
О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ (О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫), О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫,
О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ TIdleProcess::exec. О©╫ О©╫О©╫
О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ её О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫шёО©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫. О©╫О©╫О©╫О©╫ О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫. :)
--
H.Z.
### О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫! О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫: О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫ О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫ 1-2 О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫ 3-4 О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫...
> Я перетащил объявление из OS_Kernel.h в OS_Kenrel.cpp потому, что оно так
> уместнее
Дык, мы ж не против! Просто надо теперь сделать, чтоб IAR это переваривал:)
Ждём, когда у Александра появится время проверить.
> Дык, мы ж не против! Просто надо теперь сделать, чтоб IAR это переваривал:)
> Ждём, когда у Александра появится время проверить.
Ну всё почти как в первом сообщении, нужно вытащить объявление exec()
до создания объекта.
Я бы не сказал, что это ошибка IAR.
Таки когда форимруется конструктор нужно знать, есть ли специализация.
namespace OS
{
#ifndef __GNUC__ // avoid GCC bug (
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15867 )
template<> void TIdleProc::exec();
#endif
TIdleProc IdleProc;
}
Работает в IAR/AVR 5.51, 6.10 и в IAR/STM8 1.30
--
wbr,
ReAl
>> Но и для gcc есть объявление exec() для процессов (как то исключённое
>> по #ifdef для TIdleProc) и никакой обиды на избыточное объявление нет!
> Хм. Полез проверять - мой GCC на такое ругается. Потом посмотрел - у тебя
> просто нет флага -Wredundant-decls в makefile!
Да, это я запутался в экспериментах. Флаг то ставил, то убирал,
объявления то комментировал, то открывал и где-то сбился со счета.
С этим флагом в avr-gcc-шных примерах вылазит ещё пара мест.
../scmRTOS/Common/OS_Kernel.h:52: warning: redundant redeclaration of
'void os_start(stack_item_t*)' in same scope
../scmRTOS/AVR/OS_Target.h:160: warning: previous declaration of 'void
os_start(stack_item_t*)'
В OS_Target.h даётся атрибут noretrun (мелочь, а 6 байт флеша)
Но это можно и убрать из OS_Target.h.
А вот тут:
../scmRTOS/Common/OS_Kernel.h:516: warning: redundant redeclaration of
'void OS::context_switch_user_hook()' in same scope
./src/scmRTOS_TARGET_CFG.h:150: warning: previous declaration of 'void
OS::context_switch_user_hook()'
деваться некуда, в scmRTOS_TARGET_CFG.h определяется INLINE-функция. А
позже в OS_Kernel.h для неё опять объявление.
Но о таких завязках я уже думал -- в плане хука системного таймера,
который тоже может захотеться сделать inline.
Такие inline-функции -- кандидаты на помещение в новый файл scmRTOS_extensions.h
Он обрабатывается уже после всех объявлений в пользовательских
конфигах и OS_Kernel.h, но до тех мест, куда встраиваются
inline-функции, определяемые в пользовательском проекте, но
вставляемые в код ОС.
С context_switch_user_hook() это помогает.
Что делать с noreturn для os_start() -- пока не решил.
--
wbr,
ReAl
> ../scmRTOS/Common/OS_Kernel.h:52: warning: redundant redeclaration of
> 'void os_start(stack_item_t*)' in same scope
>
> ../scmRTOS/AVR/OS_Target.h:160: warning: previous declaration of 'void
> os_start(stack_item_t*)'
>
> В OS_Target.h даётся атрибут noretrun (мелочь, а 6 байт флеша)
> Но это можно и убрать из OS_Target.h.
А можно наверное сразу в OS_Kernel.h объявить os_start как OS_PROCESS,
думаю, что это вполне соответствует истине.
> А вот тут:
> ../scmRTOS/Common/OS_Kernel.h:516: warning: redundant redeclaration of
> 'void OS::context_switch_user_hook()' in same scope
>
> ./src/scmRTOS_TARGET_CFG.h:150: warning: previous declaration of 'void
> OS::context_switch_user_hook()'
>
> деваться некуда, в scmRTOS_TARGET_CFG.h определяется INLINE-функция. А
> позже в OS_Kernel.h для неё опять объявление.
Если я пишу в scmRTOS_TARGET_CFG.h
namespace OS{
void context_switch_user_hook()
{
...
, то ругается, да. А если я добавляю INLINE:
INLINE void context_switch_user_hook()
, то глотает молча. (Это для Cortex-M3)
ЗЫ. Мне кажется, что это уже идёт шлифовка-полировка, что весьма радует:)
>> В OS_Target.h даётся атрибут noretrun (мелочь, а 6 байт флеша)
>> Но это можно и убрать из OS_Target.h.
>
> А можно наверное сразу в OS_Kernel.h объявить os_start как OS_PROCESS,
> думаю, что это вполне соответствует истине.
С другими компиляторами сверить нужно. Но похоже, что так можно.
> , то ругается, да. А если я добавляю INLINE:
>
> INLINE void context_switch_user_hook()
>
> , то глотает молча. (Это для Cortex-M3)
Так в том-то и дело, что строка выглядит так:
INLINE void context_switch_user_hook() { block_context_switch(); }
Покопаюсь ещё.
--
wbr,
ReAl
> Так в том-то и дело, что строка выглядит так:
> INLINE void context_switch_user_hook() { block_context_switch(); }
А как выглядит определение INLINE_CONTEXT_SWITCH_HOOK? (У меня пустое)
>> Так в том-то и дело, что строка выглядит так:
>> INLINE void context_switch_user_hook() { block_context_switch(); }
>
> А как выглядит определение INLINE_CONTEXT_SWITCH_HOOK? (У меня пустое)
Аналогично. Т.е. у меня его просто нет, а в ОС оно при этом по #ifndef
делается пустым.
--
wbr,
ReAl
>> О©╫ OS_Target.h О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ noretrun (О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ 6 О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫)
>> О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ OS_Target.h.
AG> О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ OS_Kernel.h О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ os_start О©╫О©╫О©╫ OS_PROCESS,
AG> О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫
NO_RETURN, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, os_start - О©╫О©╫О©╫ О©╫сё О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫
OS_PROCESS'О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫ О©╫О©╫ NO_RETURN?
--
H.Z.
### О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ "О©╫О©╫О©╫О©╫О©╫"
> Кто за NO_RETURN?
Так есть же NORETURN уже :) Во всех GCC-шных вариантах OS_Target.h.
>> Кто за NO_RETURN?
>
> Так есть же NORETURN уже :) Во всех GCC-шных вариантах OS_Target.h.
Да-да, именно там оно и стоит. Рядом с INLINE и NOINLINE.
Кстати OS::run() тоже по природе своей NORETURN, но я давно убрал
строку с NORETURN для неё.
Толи ввиду краткости main() нет эффекта, толи ещё раньше наткнулся на
какую-то ругань по поводу переопределения -- уже не помню.
--
wbr,
ReAl
OR> О©╫О©╫О©╫О©╫О©╫О©╫ OS::run() О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ NORETURN, О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
OR> О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ NORETURN О©╫О©╫О©╫ О©╫её.
OR> О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ main() О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫щё О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
OR> О©╫О©╫О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ -- О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫. OS::run О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
os_start(), О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫.
--
H.Z.
### О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫...
AG> О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ NORETURN О©╫О©╫О©╫ :) О©╫О©╫ О©╫О©╫О©╫О©╫ GCC-О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ OS_Target.h.
О©╫О©╫, О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - os_start(). О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
--
H.Z.
### О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
> AG> Так есть же NORETURN уже :) Во всех GCC-шных вариантах OS_Target.h.
>
> Ну, то в портах, а тут на общий уровень уже вылезло - os_start(). Поэтому надо
> выносить в общие макросы. И обзывать все эти функции, которые не возвращаются,
> этим словом.
Погоди. Ты же в предыдущем письме говорил, что надо определять как раз в
портах:
> Лучше изобрести специальный макрос типа
> NO_RETURN, который и определять в портах - не факт, что какой-то компилятор не
> заругается на это.
Я и предложил этот NORETURN, потому что он уже имеется в половине портов.
>> О©╫О©╫, О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - os_start(). О©╫О©╫О©╫О©╫О©╫О©╫О©╫
>> О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
>> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
AG> О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫ О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫
AG> О©╫О©╫О©╫О©╫О©╫О©╫:
О©╫ О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫) О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫
О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫лёО©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ Common, О©╫.О©╫. О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ scmRTOS_defs.h
О©╫О©╫О©╫О©╫:
#ifndef NO_RETURN
#define NO_RETURN
#endif
О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫лёО©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ OS::run(), os_start() О©╫ NO_RETURN О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
--
H.Z.
### О©╫О©╫CО©╫О©╫О©╫ - О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ -
> Я имел в виду, что значение макроса (в том числе и пустое) определять в портах, а
> сам макрос должен быть определён на уровне Common, т.к. его использование
> производится на уровне общих функций.
Дык! Это всё я понял, и полностью согласен:) Только пусть он называется
не NO_RETURN, а NORETURN, потому что в половине портов он уже есть такой:)
>> О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫лёО©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ Common, О©╫.О©╫. О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
>> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
AG> О©╫О©╫О©╫! О©╫О©╫О©╫ О©╫сё О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫:) О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
AG> О©╫О©╫ NO_RETURN, О©╫ NORETURN, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫:)
О©╫, О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫. :) О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫.
--
H.Z.
### О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫-О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫, О©╫ О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ NORETURN О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ OS::run() О©╫
os_start().
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫сё, О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ extern "C" О©╫
INLINE, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫). О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫-О©╫О©╫
О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
--
H.Z.
### О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫... О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫...
> Короче, добавил макрос NORETURN и указал его в объявлениях функций OS::run()
> и os_start().
> Проверьте, плиз, и если что-то не так, то поправьте.
AVR/GCC -- всё нормально. Подправленные примеры с убранным в них
объявлением os_start() зафиксирую немного позже (заодно с
-Wredundnat-decls разберусь).
В примерах этот атрибут к OS::run() таки ничего не даёт, так как main
перед ним очень простая, ни по регистрам не разложилась, ни на стеке
ничего не завела. Но для порядку оно нужно.
AVR/IAR -- гляну, чем там NORETURN делается.
--
wbr,
ReAl
> Проверьте, плиз, и если что-то не так, то поправьте.
Cortex-M3/GCC - порядок,
LPC2xxx/GCC - порядок,
ADuC/GCC - порядок.
MSPЗ40/GCC - проверю в понедельник.
AG> Cortex-M3/GCC - О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
AG> LPC2xxx/GCC - О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
AG> ADuC/GCC - О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
--
H.Z.
### О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫...
OR> AVR/GCC -- О©╫сё О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫.
OR> AVR/IAR -- О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ NORETURN О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ __task.
--
H.Z.
### О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ "О©╫О©╫О©╫О©╫О©╫"
OR>> AVR/IAR -- гляну, чем там NORETURN делается.
HZ> Там, как помню, ключевое слово __task.
Не, так только хуже
_task => в числе прочего не сохраняет регистры, которые должна
сохранять вызываемая функция => похоже, при попытке такую вызвать те
регистры начинает сохранять _вызывающая_.
Там есть честное и открытое слово __noreturn :-)
Это я по IAR/STM8 1.30 (Embedded Workbench 6.0 Kickstart)
Но там это вообще только два байта экономит :-)
До AVR/IAR доберусь завтра-послезавтра.
--
wbr,
ReAl
OR> До AVR/IAR доберусь завтра-послезавтра.
Так же всё работает. Экономия те же 6 байт, что и для AVR/GCC :-)
Проверил компиляцию на 5.51 и 6.10, но в железо не зашивал.
Зафиксировал AVR/GCC и AVR/IAR
p.s. на примерах scmRTOS IAR 6.10 даёт 50-70 байт экономии кода по
сравнению с 5.51
--
wbr,
ReAl
> MSPЗ40/GCC - проверю в понедельник.
MSPЗ40/GCC - порядок.
OR> О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ __noreturn :-)
О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
--
H.Z.
### О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
О©╫О©╫О©╫О©╫О©╫...