|
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 21 2013, 07:45
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|