реклама на сайте
подробности

 
 
> Указатель на __noreturn функцию, IAR EW, AVR
gighack
сообщение Aug 5 2010, 05:50
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 31-03-10
Пользователь №: 56 321



как сабж сделать?


--------------------
... и пусть удача повернется к тебе нужным местом...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
gighack
сообщение Aug 5 2010, 09:26
Сообщение #2





Группа: Новичок
Сообщений: 7
Регистрация: 31-03-10
Пользователь №: 56 321



Все дело в стеке. Это ключевой момент в реализации модели состояний программы (см. аттач)
Прикрепленные файлы
Прикрепленный файл  BootLoader.7z ( 10.15 килобайт ) Кол-во скачиваний: 16
 


--------------------
... и пусть удача повернется к тебе нужным местом...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 5 2010, 09:53
Сообщение #3


Гуру
******

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



QUOTE (gighack @ Aug 5 2010, 12:26) *
Это ключевой момент в реализации модели состояний программы (см. аттач)

Посмотрел совсем мельком. Смысла написанного особого не понял. За обильную смесь из 'C' и asm( "...." ) на IAR надо вообще руки отрывать, ибо оптимизацию сносит по полной программе. Относительно нормально такое только GCC переваривает. Для большинства компиляторов asm( ) это жуткая заплатка только для крайних случаев.
Вообще похоже Вы пытаетесь изобрести велосипед setjmp()/longjmp() а то и просто switch() smile.gif.
Если вдруг где-то чего-то действительно жмет, то несколько десятков строчек на ASM, тем более в ядре системы дело правильное. А пытаться замучать конкретный компилятор, дабы он сгенерил нечто конкретное, что Вам хочется увидеть дело не правильное.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
gighack
сообщение Aug 5 2010, 11:03
Сообщение #4





Группа: Новичок
Сообщений: 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 smile.gif.
Да, именно так я и написал в третьем посте.


--------------------
... и пусть удача повернется к тебе нужным местом...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- gighack   Указатель на __noreturn функцию   Aug 5 2010, 05:50
- - zltigo   Разумнее всего, так-же, как на любую другую а такж...   Aug 5 2010, 07:10
- - gighack   как именно? так вот Кодvoid __noreturn (*pF...   Aug 5 2010, 07:20
|- - zltigo   QUOTE (gighack @ Aug 5 2010, 10:20) И что...   Aug 5 2010, 08:03
- - Savrik   Вы неправильно обьявляете указатель на функцию. Ук...   Aug 5 2010, 08:01
- - Savrik   Перечитал первый и свой же пост - все таки я не по...   Aug 5 2010, 10:04
|- - zltigo   QUOTE (Savrik @ Aug 5 2010, 13:04) все та...   Aug 5 2010, 10:19
- - Ink   А это ничего, вообще, что локальные переменные (в ...   Aug 5 2010, 10:50
|- - gighack   Цитата(Ink @ Aug 5 2010, 14:50) А это нич...   Aug 5 2010, 11:13
|- - zltigo   QUOTE (gighack @ Aug 5 2010, 14:13) Не по...   Aug 5 2010, 11:18
- - zltigo   Вы высосали проблему "смешения" из пальц...   Aug 5 2010, 11:12
- - gighack   zltigo, Вы не могли бы уточнить, как именно ассемб...   Aug 5 2010, 12:03
|- - zltigo   QUOTE (gighack @ Aug 5 2010, 15:03) zltig...   Aug 5 2010, 12:45
- - gighack   Поразмышлял я тут над стеком и локальными переменн...   Aug 6 2010, 05:30


Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 02:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016