|
Указатель на __noreturn функцию, IAR EW, AVR |
|
|
|
Aug 5 2010, 05:50
|
Группа: Новичок
Сообщений: 7
Регистрация: 31-03-10
Пользователь №: 56 321

|
как сабж сделать?
--------------------
... и пусть удача повернется к тебе нужным местом...
|
|
|
|
|
Aug 5 2010, 07:20
|
Группа: Новичок
Сообщений: 7
Регистрация: 31-03-10
Пользователь №: 56 321

|
как именно? так вот Код void __noreturn (*pF)(void); не работает. Пишет Цитата the type attribute "__noreturn" is not allowed on this declaration И что значит не морочить голову заменой call на jump? Именно этой замены я и хочу добиться.
--------------------
... и пусть удача повернется к тебе нужным местом...
|
|
|
|
|
Aug 5 2010, 08:01
|

наблюдаю..
  
Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369

|
Вы неправильно обьявляете указатель на функцию. Указатель на функцию имеет вид Код bool (*fPtr) (char) - объявляет указатель fPtr, ссылающийся на функцию, которая возвращает логическое значение и принимает в качестве аргументов символ. В общем виде будет такое применение Код bool retInt(char type); int main() { bool (*fPtr)(char) = retInt; cout<<retInt('A'); } P.S. Извиняюсь, у Вас все правильно, недосмотрел....
|
|
|
|
|
Aug 5 2010, 09:26
|
Группа: Новичок
Сообщений: 7
Регистрация: 31-03-10
Пользователь №: 56 321

|
Все дело в стеке. Это ключевой момент в реализации модели состояний программы (см. аттач)
--------------------
... и пусть удача повернется к тебе нужным местом...
|
|
|
|
|
Aug 5 2010, 09:53
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (gighack @ Aug 5 2010, 12:26)  Это ключевой момент в реализации модели состояний программы (см. аттач) Посмотрел совсем мельком. Смысла написанного особого не понял. За обильную смесь из 'C' и asm( "...." ) на IAR надо вообще руки отрывать, ибо оптимизацию сносит по полной программе. Относительно нормально такое только GCC переваривает. Для большинства компиляторов asm( ) это жуткая заплатка только для крайних случаев. Вообще похоже Вы пытаетесь изобрести велосипед setjmp()/longjmp() а то и просто switch()  . Если вдруг где-то чего-то действительно жмет, то несколько десятков строчек на ASM, тем более в ядре системы дело правильное. А пытаться замучать конкретный компилятор, дабы он сгенерил нечто конкретное, что Вам хочется увидеть дело не правильное.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 5 2010, 10:04
|

наблюдаю..
  
Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369

|
Перечитал первый и свой же пост - все таки я не понял назначения атрибута __noreturn. Попробуйте объявить указатель без него Код void (*pF)(void);
|
|
|
|
|
Aug 5 2010, 10:50
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-08-07
Пользователь №: 29 776

|
А это ничего, вообще, что локальные переменные (в т.ч. временные, созданные компилятором) так же могут лежать на стеке? И их будет разное кол-во в этих функциях. Вы перейдете на другую подпрограмму, она выкинет другое кол-во переменных со стека при возврате и улетит вникуда...
|
|
|
|
|
Aug 5 2010, 11:03
|
Группа: Новичок
Сообщений: 7
Регистрация: 31-03-10
Пользователь №: 56 321

|
Цитата(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  . Да, именно так я и написал в третьем посте.
--------------------
... и пусть удача повернется к тебе нужным местом...
|
|
|
|
|
Aug 5 2010, 11:13
|
Группа: Новичок
Сообщений: 7
Регистрация: 31-03-10
Пользователь №: 56 321

|
Цитата(Ink @ Aug 5 2010, 14:50)  А это ничего, вообще, что локальные переменные (в т.ч. временные, созданные компилятором) так же могут лежать на стеке? И их будет разное кол-во в этих функциях. Вы перейдете на другую подпрограмму, она выкинет другое кол-во переменных со стека при возврате и улетит вникуда... Не понял. В функциях с __noreturn у меня нету локальных переменных, а возвращаемы значения в строках типа if(SomeF()) храняться в регистрах
Сообщение отредактировал gighack - Aug 5 2010, 11:16
--------------------
... и пусть удача повернется к тебе нужным местом...
|
|
|
|
|
Aug 5 2010, 12:03
|
Группа: Новичок
Сообщений: 7
Регистрация: 31-03-10
Пользователь №: 56 321

|
zltigo, Вы не могли бы уточнить, как именно ассемблерные вставки влияют на оптимизацию?
--------------------
... и пусть удача повернется к тебе нужным местом...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|