|
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, 19:47
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(rudy_b @ May 21 2013, 22:32)  И что будет если из main дать return? Перейдёт на какую-нибудь функцию exit (или что там предусматривается на такой случай). Как-то так оно выглядит: Код CLI Global Interrupt Disable RJMP PC-0x0000 Relative jump Но можно и своим чем-то заменить. Цитата(rudy_b @ May 21 2013, 22:32)  Если нужно заблокировать работу программы находясь в прерывании - запретите все прерывания и зациклитесь. Возможно таких мест не одно. И там предполагается не только зацикливание, а ещё какие-то спасающие ситуацию действия.
|
|
|
|
|
May 22 2013, 08:28
|
Знающий
   
Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458

|
Цитата(_Артём_ @ May 21 2013, 22:47)  Перейдёт на какую-нибудь функцию exit (или что там предусматривается на такой случай). Как-то так оно выглядит: Код CLI Global Interrupt Disable RJMP PC-0x0000 Relative jump Но можно и своим чем-то заменить. Так это и получится - запрет прерываний и зацикливание. И его можно сделать в любом месте, не обязательно выходить в main. Цитата Возможно таких мест не одно. И там предполагается не только зацикливание, а ещё какие-то спасающие ситуацию действия. Так в каждом из этих мест сделать то же самое, предварительно совершив "спасательные" действия. А чтобы после reseta понять что именно случилось - можно записать что-то в память или во флешь. А в начале программы (от reset) поставить анализ этого со стиранием в исходное состояние.
|
|
|
|
|
May 25 2013, 06:49
|

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

|
Цитата(rudy_b @ May 22 2013, 11:28)  А чтобы после reseta понять что именно случилось - можно записать что-то в память или во флешь. А в начале программы (от reset) поставить анализ этого со стиранием в исходное состояние. Как раз Xenia это и предлагала: Цитата char semafor = false; main() { if( semafor) { // определенные экстренные действия } for(;;) { // бесконечный цикл } } В прерывании же при обнаружении экстренного случая взводится светофор (semafor = true) и программа запускается с нулевого адреса (setjmp 0).
P.S. Кажись с пронеслась я со своей идеей, т.к. при инициализации semafor тоже почистится. Впрочем, в качестве семафора можно взять какой-нибудь аппаратный регистр. Цитата(Сергей Борщ @ May 21 2013, 10:45)  Было же грамотное решение - функция с атрибутом noreturn. И вызывать ее как функцию, без всяких указателей и т.д. Компилятору этого noreturn по идее должно быть достаточно, чтобы не сохранять лишние регистры в каждом прерывании. Тогда в этом случае я должен буду сам позаботится о сохранении используемых регистров, а как я догадаюсь, какие регистры вздумает задействовать компилятор ? Цитата(Сергей Борщ @ May 21 2013, 10:45)  Решение с goto из одной функции в другую ущербное каким бы хаком оно бы ни было реализовано. longjump() еще куда ни шло - он поддержан компилятором. В чем именно ущербность goto ?
Сообщение отредактировал MaxiMuz - May 25 2013, 08:07
|
|
|
|
Сообщений в этой теме
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, 07:45 Палыч Совершенно непонятно: почему ТС не хочет использов... May 21 2013, 08:00  _Артём_ Цитата(Палыч @ May 21 2013, 11:00) Соверш... May 21 2013, 12:51 _Pasha Пора голосовать, хто за setjmp/longjmp ? May 25 2013, 10:16
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|