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

 
 
> GCC: Аварийный выход из прерывания (функции), чем заменить оператор goto?
MaxiMuz
сообщение May 16 2013, 14:50
Сообщение #1


Местный
***

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



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

Что можно здесь сделать ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение May 21 2013, 07:45
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



_Артем_ ответил по всем пунктам.
Касаемо последних двух сообщений: компилятор не может знать вашей логики, заставить его "не использовать локальные переменные" нельзя. Решение с goto из одной функции в другую ущербное каким бы хаком оно бы ни было реализовано. longjump() еще куда ни шло - он поддержан компилятором.
Было же грамотное решение - функция с атрибутом noreturn. И вызывать ее как функцию, без всяких указателей и т.д. Компилятору этого noreturn по идее должно быть достаточно, чтобы не сохранять лишние регистры в каждом прерывании.

QUOTE (Xenia @ May 20 2013, 22:05) *
Но main() свои локальные переменные (те, что заводятся в ее начале) не освободит никогда - на то у нее и бесконечный цикл внутри сидит.
Во-первых не надо считать компиялтор настолько тупым. Во-вторых и внутри этого бесконечного цикла имеют право быть несколько блоков со своими локальными переменными.
QUOTE (Xenia @ May 20 2013, 22:05) *
Так я и выразилась в том духе, что заводить внутри main() локальные переменные смысла не имеет. Т.е. речь шла не об экономии памяти, как вы это неверно поняли, а об устойчивости переменных к сбросу стека.
То есть еще одна распорка чтобы конструкция перевязанная предыдущей расчалкой не навернулась.
QUOTE (Xenia @ May 20 2013, 22:05) *
P.S. Не стоит обольщаться тем, что войдя джампом из прерывания во внутрь какой-то функции (в том числе и main), вы обнаружите там локальные переменные на тех же местах. Адреса локальных переменных отмеряются относительно текущего указателя стека, который при запрыгивании со стороны никак не может быть правильным (т.к. функция прерывания тоже пользуется стеком).
Именно поэтому setjump() сохраняет состояние указателя стека. И после longjump() все локальные переменные находятся на своих местах совершенно нетронутые.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 21 2013, 08:00
Сообщение #3


Гуру
******

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



Совершенно непонятно: почему ТС не хочет использовать setjmp / longjmp ? ИМХО, это - хорошее решение той задачи, что стоит перед ТС, абсолютно стандартными средствами. Даже пример, взятый мной из GCC и приведенный в сообщении #9, почти один-в один совпадает с тем, что желает ТС и привел в первом сообщении. Жалко места под буфер jmp_buf ?
Решение же проблемы почему-то "крутится" вокруг goto... Зачем этот "гемморой" ?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MaxiMuz   GCC: Аварийный выход из прерывания (функции)   May 16 2013, 14:50
- - Lagman   Просто из прерывания вызываете другую функцию, зач...   May 16 2013, 15:45
|- - MaxiMuz   Цитата(Lagman @ May 16 2013, 18:45) Прост...   May 16 2013, 18:20
|- - _Артём_   Цитата(MaxiMuz @ May 16 2013, 21:20) не м...   May 16 2013, 18:28
||- - MaxiMuz   Цитата(_Артём_ @ May 16 2013, 21:28) А ре...   May 17 2013, 11:10
||- - Tiro   Цитата(MaxiMuz @ May 17 2013, 14:10) почт...   May 17 2013, 21:26
|||- - MaxiMuz   Цитата(Tiro @ May 18 2013, 00:26) Метки к...   May 19 2013, 16:27
|||- - Lagman   Цитата(MaxiMuz @ May 19 2013, 20:27) Точн...   May 19 2013, 18:26
||||- - Xenia   Цитата(Lagman @ May 19 2013, 22:26) Если ...   May 19 2013, 19:04
||||- - Палыч   Цитата(Xenia @ May 19 2013, 23:04) В прер...   May 20 2013, 04:53
|||- - _Артём_   Цитата(MaxiMuz @ May 19 2013, 19:27) Точн...   May 19 2013, 20:02
||||- - Xenia   Цитата(_Артём_ @ May 20 2013, 00:02) Если...   May 19 2013, 23:31
|||||- - _Артём_   Цитата(Xenia @ May 20 2013, 02:31) Тогда ...   May 20 2013, 00:00
||||- - MaxiMuz   Цитата(_Артём_ @ May 19 2013, 23:02) Если...   May 20 2013, 12:40
||||- - Сергей Борщ   QUOTE (MaxiMuz @ May 20 2013, 15:40) а в ...   May 20 2013, 13:21
|||||- - Xenia   Цитата(Сергей Борщ @ May 20 2013, 17:21) ...   May 20 2013, 13:44
|||||- - Сергей Борщ   QUOTE (Xenia @ May 20 2013, 16:44) легко ...   May 20 2013, 17:03
|||||- - Xenia   Цитата(Сергей Борщ @ May 20 2013, 21:03) ...   May 20 2013, 18:41
|||||- - _Артём_   Цитата(Xenia @ May 20 2013, 21:41) Нормал...   May 20 2013, 19:03
|||||- - Xenia   Цитата(_Артём_ @ May 20 2013, 22:56) В сл...   May 20 2013, 19:05
||||||- - Tiro   Цитата(Xenia @ May 20 2013, 22:05) Адреса...   May 20 2013, 22:31
|||||- - ARV   Цитата(_Артём_ @ May 20 2013, 23:03) goto...   May 21 2013, 18:08
|||||- - _Артём_   Цитата(ARV @ May 21 2013, 21:08) так ведь...   May 21 2013, 19:20
||||- - _Артём_   Цитата(MaxiMuz @ May 20 2013, 15:40) толь...   May 20 2013, 13:31
||||- - MaxiMuz   Цитата(_Артём_ @ May 20 2013, 16:31) Мне ...   May 21 2013, 20:17
||||- - _Артём_   Цитата(MaxiMuz @ May 21 2013, 23:17) возм...   May 21 2013, 20:54
||||- - MaxiMuz   Цитата(_Артём_ @ May 21 2013, 23:54) О ка...   May 21 2013, 21:01
||||- - demiurg_spb   Всё это (аварийный выход) стоит завернуть в какой-...   May 22 2013, 06:52
||||- - Палыч   Цитата(demiurg_spb @ May 22 2013, 10:52) ...   May 22 2013, 07:01
||||- - demiurg_spb   Цитата(Палыч @ May 22 2013, 11:01) В AVR ...   May 22 2013, 07:05
|||- - Tiro   Цитата(MaxiMuz @ May 19 2013, 19:27) Помо...   May 19 2013, 21:32
||- - _Артём_   Цитата(MaxiMuz @ May 17 2013, 14:10) почт...   May 18 2013, 22:42
|- - zombi   Цитата(MaxiMuz @ May 16 2013, 21:20) на А...   May 16 2013, 19:03
|- - Палыч   Цитата(MaxiMuz @ May 16 2013, 22:20) похо...   May 16 2013, 19:40
|- - Xenia   Цитата(MaxiMuz @ May 16 2013, 22:20) я та...   May 19 2013, 00:12
- - zombi   Не знаю как на СИ. А на асме записываю в стек нужн...   May 16 2013, 16:09
- - Палыч   Функции setjmp / longjmp подойдут ?   May 16 2013, 16:40
- - Xenia   Проще всего в программе установить семафоры с ветв...   May 16 2013, 17:51
- - ARV   Цитата(MaxiMuz @ May 16 2013, 18:50) Возн...   May 19 2013, 06:49
- - ARV   если очень хочется, то можно вот так:Кодvoid __at...   May 20 2013, 17:12
|- - _Артём_   Цитата(Палыч @ May 21 2013, 11:00) Соверш...   May 21 2013, 12:51
- - rudy_b   Что-то непонятно. Что значит "программа должн...   May 21 2013, 19:32
|- - _Артём_   Цитата(rudy_b @ May 21 2013, 22:32) И что...   May 21 2013, 19:47
|- - rudy_b   Цитата(_Артём_ @ May 21 2013, 22:47) Пере...   May 22 2013, 08:28
|- - MaxiMuz   Цитата(rudy_b @ May 22 2013, 11:28) А что...   May 25 2013, 06:49
- - _Pasha   Пора голосовать, хто за setjmp/longjmp ?   May 25 2013, 10:16


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

 


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


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