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

 
 
> 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
Ответов
rudy_b
сообщение May 21 2013, 19:32
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458



Что-то непонятно. Что значит "программа должна завершиться", если в ней есть main с бесконечным циклом? И что будет если из main дать return?

Если нужно заблокировать работу программы находясь в прерывании - запретите все прерывания и зациклитесь. Из этого можно можно выйти только по reset.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 21 2013, 19:47
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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) *
Если нужно заблокировать работу программы находясь в прерывании - запретите все прерывания и зациклитесь.

Возможно таких мест не одно. И там предполагается не только зацикливание, а ещё какие-то спасающие ситуацию действия.


Go to the top of the page
 
+Quote Post
rudy_b
сообщение May 22 2013, 08:28
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458



Цитата(_Артём_ @ May 21 2013, 22:47) *
Перейдёт на какую-нибудь функцию exit (или что там предусматривается на такой случай).
Как-то так оно выглядит:
Код
  CLI         Global Interrupt Disable
  RJMP PC-0x0000        Relative jump

Но можно и своим чем-то заменить.

Так это и получится - запрет прерываний и зацикливание. И его можно сделать в любом месте, не обязательно выходить в main.

Цитата
Возможно таких мест не одно. И там предполагается не только зацикливание, а ещё какие-то спасающие ситуацию действия.

Так в каждом из этих мест сделать то же самое, предварительно совершив "спасательные" действия.

А чтобы после reseta понять что именно случилось - можно записать что-то в память или во флешь. А в начале программы (от reset) поставить анализ этого со стиранием в исходное состояние.
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение May 25 2013, 06:49
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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
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, 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


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:16
Рейтинг@Mail.ru


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