Цитата(zltigo @ Aug 5 2010, 13:53)

Смысла написанного особого не понял.
Поясню на примере как было раньше:
Код
char waitingSelfProgAck = 1;
__noreturn void main(void)
{
MoveIvt(TO_BL_SECTION);
InitUsart();
InitProtocol();
InitTimer();
while(1)
{
if(waitingSelfProgAck)
CheckTimer();
if(ReceiveUsart())
ProtocolHandler();
}
}
Код
extern char waitingSelfProgAck;
void ProtocolHandler(void)
{
if(IsReceivedCompleteAndCorrect())
{
switch(MsgType())
{
case MT_HELLO:
waitingSelfProgAck = 0;
...
break;
case MT_ERR:
if(waitingSelfProgAck)
...
else
...
break;
/* Some other message handlers
...
*/
}
}
}
здесь происходит смешение обработчиков разных состояний - в одной функции main оказываются инициализация, проверка таймера (нужная только до получения некоторых сообщений) и обработка входа. То же самое в ProtocolHandler. Программа должна обрабатывать один набор сообщений до подключения программатора и другой - после. Т.е. при такой организации программы в ней появляются лишние - не существующие с точки зрения логики программы - связи. В модели состояний их нет.
Цитата(zltigo @ Aug 5 2010, 13:53)

asm( ) это ... заплатка
В случае с переходами - да. Поэтому я и спрашиваю как сделать указатель на __noreturn функцию, чтобы убрать ассемблерную вставку.
Цитата(Savrik @ Aug 5 2010, 14:04)

Попробуйте объявить указатель без него
Код
void (*pF)(void);
Тогда при вызове pF() будет генерироваться call вместо jump
Цитата(zltigo @ Aug 5 2010, 14:19)

как я полагаю, Автору мечталось, что с указателем на __noreturn компилятор должен будет проникнуться глубиной замысла и вместо вызова функции изобразить jump

.
Да, именно так я и написал в третьем посте.