|
|
  |
GCC: Аварийный выход из прерывания (функции), чем заменить оператор goto? |
|
|
|
May 16 2013, 14:50
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Возникла ситуация когда при обработке прерывания нужно изменить привычный ход программы, когда содержимое сохранненых регистров и указатель стека уже не важны. Оператор goto тут не работает: Код ISR (xxx_vect) { ... ... goto m1; } void main (void) { ... ... while (1) { ... ... } m1: ... ... } Что можно здесь сделать ?
|
|
|
|
|
May 16 2013, 18:20
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(Lagman @ May 16 2013, 18:45)  Просто из прерывания вызываете другую функцию, зачем вам в main возвращаться, если вам не важны стэк и регистры. не могу перегружать память сохраняемыми регистрами в теме была описана ситуевина: http://electronix.ru/forum/index.php?showtopic=112377Цитата(zombi @ May 16 2013, 19:09)  Не знаю как на СИ. А на асме записываю в стек нужный мне адрес и ret на Асме я бы просто rjmp написал Цитата(Палыч @ May 16 2013, 19:40)  Функции setjmp / longjmp подойдут ? похоже нет Цитата(Палыч @ May 16 2013, 19:40)  Функции setjmp / longjmp подойдут ? похоже нет Цитата(Xenia @ May 16 2013, 20:51)  Проще всего в программе установить семафоры с ветвлением по if или switch, а из прерывания эти семафоры переключать. я так и поступил , но всеже хочется разобраться с "прыжками"
|
|
|
|
|
May 16 2013, 18:28
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(MaxiMuz @ May 16 2013, 21:20)  не могу перегружать память сохраняемыми регистрами в теме была описана ситуевина: http://electronix.ru/forum/index.php?showtopic=112377А регистры сохраняются? Вы смотрели? Цитата(MaxiMuz @ May 16 2013, 21:20)  на Асме я бы просто rjmp написал Так и напишите Код ISR(...) { asm("rjmp 0x1234"); // нужный адрес выберете сами } По выбранному адресу расположите вашу функцию (Си или асм) Цитата(MaxiMuz @ May 16 2013, 21:20)  я так и поступил , но всеже хочется разобраться с "прыжками" Изврат это какой-то, чего с ними разбираться.
|
|
|
|
|
May 16 2013, 19:40
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(MaxiMuz @ May 16 2013, 22:20)  похоже нет Ну, отчего же... Вот, почти полное повторение того, что Вы хотели Код #include <setjmp.h>
jmp_buf env;
int main (void) { if (setjmp (env)) { ... handle error ... }
while (1) { ... main processing loop which calls foo() some where ... } }
...
void foo (void) { ... blah, blah, blah ...
if (err) { longjmp (env, 1); } }
|
|
|
|
|
May 19 2013, 00:12
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(MaxiMuz @ May 16 2013, 22:20)  я так и поступил , но всеже хочется разобраться с "прыжками" А прыгать нельзя!  Мало ли в каком состоянии стеки находятся в том месте, откуда сигануло в прерывание? Вы, положим по метке перейдете, а стек кто чистить будет? Например, была вызвана функция, которая при входе создала кучу малу локальных переменных на стеке. Потом эта функция вызвала другую функцию, которая сделала то же самое. И т.д. А тут в тот момент, когда процессор в самой глубокой фунции код выполнял, ваше прерывание и приспичило. И куда вы теперь пойдете, когда стек полным-полнёхонек?
|
|
|
|
|
May 19 2013, 06:49
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(MaxiMuz @ May 16 2013, 18:50)  Возникла ситуация когда при обработке прерывания нужно изменить привычный ход программы, когда содержимое сохранненых регистров и указатель стека уже не важны. Что можно здесь сделать ? по моему скромному мнению тут можно сделать только одно: разобраться с алгоритмом программы и переделать его так, чтобы этой ситуации не возникало. все, кто пытается помочь топикстартеру в решении его надуманной проблемы, оказывают ему медвежью услугу: проблем он поимеет больше, чем удобств, о чем уважаемая Xenia уже намекала. с моей точки зрения ситуация, когда "регистры и состояние стека уже не важны" должна приводить к аппаратному сбросу контроллера, и никак иначе, тем более из прерывания.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
May 19 2013, 16:27
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(Tiro @ May 18 2013, 00:26)  Метки как значения давно есть в ГСС. 4.3 Labels as Values Помоему то что нужно! Но всеже както странно , первый раз вижу оператор '&&' в таком применении. Это какаято особенность GCC стандарта ? Цитата(Xenia @ May 19 2013, 03:12)  А прыгать нельзя!  Мало ли в каком состоянии стеки находятся в том месте, откуда сигануло в прерывание? Вы, положим по метке перейдете, а стек кто чистить будет? Xenia такой сценарий  Если уж выполненно определенное условие , то стек и состояние др.регистров неважно Цитата(ARV @ May 19 2013, 09:49)  с моей точки зрения ситуация, когда "регистры и состояние стека уже не важны" должна приводить к аппаратному сбросу контроллера, и никак иначе, тем более из прерывания. Точно! программа должна выполнить определенные действия и завершиться.
Сообщение отредактировал MaxiMuz - May 19 2013, 16:27
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|