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

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> GCC: Аварийный выход из прерывания (функции), чем заменить оператор goto?
rudy_b
сообщение May 22 2013, 08:28
Сообщение #46


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #47


Местный
***

Группа: Участник
Сообщений: 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
_Pasha
сообщение May 25 2013, 10:16
Сообщение #48


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Пора голосовать, хто за setjmp/longjmp ? biggrin.gif
Go to the top of the page
 
+Quote Post

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

 


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


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