Цитата(aesok @ Dec 22 2007, 14:25)

'noreturn' ничего не даст кроме предупреждения компилятора, если функция функция всетаки возвращает управление.
Ну и на том спасибо :-), я стараюсь, чтобы предупреждений не было вообще и при таком подходе даже просто выдать предупреждение - уже помощь компилятора.
Цитата(aesok @ Dec 22 2007, 22:05)

Разница между "noreturn' и 'OS_task' есть: первый предотвращает сохранение регстров r2-r15, второй дополнительно r28-r29. Ну и само сабой 'OS_task' работает для всех функций, вне зависимости от того возвращают они управление или нет.
Я немного поэкспериментировал, для avr-gcc 4.2.2 (WinAVR-20071221) для функции, помеченной этими атрибутами, различие действительно такое (для noreturn добавляется сохранение r28,r29 в начале пролога, если же организовать возврат из функции, то и в конце эпилога) а вот 4.3.0 (сборка klen
http://electronix.ru/forum/index.php?showtopic=38876) генерирует абсолютно одинаковый код для этих двух атрибутов (видать какой-то патч с winavr.cvs.sourceforge... недотащен был).
Более ранние компиляторы, естетсвенно, вообще OS_task не знают. Так что я пока оставлю как есть, с noreturn, а там посмотрим, добавлю проверку версии компилятора и в зависимости от этого изменение #define OS_PROCESS на атрибут noreturn или OS_task.
Цитата(Сергей Борщ @ Dec 23 2007, 00:57)

Есть еще вопрос по "noreturn" с main() в режиме С++. Как известно, main() в С++ должна быть объявлена как возвращающая int. Если к ней добавить "noreturn", то появляется warning:
main.cpp:68: warning: function declared 'noreturn' has a 'return' statement
хотя никаких return statement в функции нет, из for(;;) {} выхода тоже не сущствует, и никаких ret в листинге нет. Это бага?
return 0; перед закрывающей скобкой '}' в main() в
С++ присутствует неявно, если его не написал программист.
В стандарте написано:
Цитата
3.6.1 Main function
...
5 A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing
return 0;
А в "полновесном" С++ управление на закрывающую скобку main() может перейти и при бесконечном цикле, и при noreturn-функции (о которых стандарт вообще ничего не знает) - за счёт исключения. Поэтому return 0; всегда неявно присутствует для С++ - программы.
Есть ли смысл делать в avr-gcc какой-то особый подход - я не уверен. Да, он всё равно не поддерживает исключения и за бесконечный цикл в main() не попасть никак, но "генерация" неявного retrun 0; и упомянутого предупреждения происходит, как я понимаю, на платформо-независимых этапах компиялции.
А потом оптимизатор выбрасывает это как unreachable code, но это потом :-)