Цитата(ig_z @ Dec 19 2005, 19:36)

Очень странно. Какой у вас компилер и версия?
У меня мсп430 3.30
Компилятор IAR EWAVR 4.11A
Цитата
итак:
__raw и __task подавляют сохранение/восстановление регистров в для "прерывательных" и "обычных" функций
__interrupt -заменяет рет на ирет
тут все понятно...
Цитата
__root обязывает компилятор/линкер включать функцию в объектный/бинарный файл, даже если на нее нет ни одной ссылки
не только функции но и переменные...
Цитата
__noreturn keyword can be used on a function to inform the compiler that the function will not return. Т.е. не будет возврата из функции - будет выполняться следующий по порядку оператор. О подавлении/сохранении регистров ни слова. Точно так же очень сомнительно выглядит вызов функции по jmp. По крайней мере мсп430 3.30 вызывает __noreturn функцию через call. Чесно предупреждает, что больше не сможет вернуться в точку вызова

. Но т.к. не подавляет ret в вызываемой функции, благополучно возвращается в точку вызова
На мсп430 3.30 __noreturn не делает ничего. Т.е. ret не подавляется, а регистры сохраняются. Все остальные extended keywords работают корректно.
Поделюсь результатами своих экспериментов. Программа выполняет тело функции __noreturn а затем выполняет инструкцию RET функции из которой была вызвана ф-ция __noreturn, все что было между функцией __noreturn и RET игнорируется. Причем если функция __noreturn (по какой-то причине) описана как возвращающая значение, она это значение вычисляет, но не возвращает (это логично, поскольку после выполния функции, возврата к точке вызова нет). Переход на выполнение __noreturn функции осуществляется при помощи инструкции RJMP (или JMP). Например:
Код
unsigned char A=10, B=0;
__noreturn unsigned char Funk10(unsigned char V1)
{
return(V1+3);
}
void Funk8(void)
{
A+=10;
return;
}
void Funk9(void)
{
B+=2;
A=Funk10(23);
Funk8();//это не выполняется
--B;//и это тоже
}
В результате выполнения Funk9 имеем A=10, В=2...
Заметил, что при включенном режиме оптимизации Function inlining все выполняется как будто __noreturn нет в природе, но это, думаю, от того, что все функции у меня были определены в одном модуле (и они выполнялись как inline-функции), как только функцию __noreturn определил в отдельном модуле все стало на свои места...
Если __noreturn-функцию вызвать непосредственно внутри функции main то все работает как описано выше, если __noreturn-функция определена как void, и внутри main нет бесконечного цикла, в противном случае компилятор выдает ошибку...
В результате пришел к выводу, что механизм выполнения __noreturn-функции сводится к следующему: выполняется тело __noreturn-функции функции (без RET), после этого инструкция RET функции непосредственно внутри которой вызвана __noreturn-функция...
З.Ы. Насчет подавления сохранения регистров: если __interrupt-функцию сделать еще и __noreturn, то регистры не сохраняются, и по крайней мере чисто внешне все выглядит так же как при использовании __raw...