Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

GCC: Аварийный выход из прерывания (функции)

Непрочитано 16.05.2013, 18:43  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию GCC: Аварийный выход из прерывания (функции)

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

п.с.: тема возникла из предыдущей темы:
https://kazus.run/forums/showthread.php?t=104418
Реклама:

Последний раз редактировалось MaxiMuz79; 16.05.2013 в 18:49.
MaxiMuz79 вне форума  
Непрочитано 16.05.2013, 18:54  
pambaru
Почётный гражданин KAZUS.RUN
 
Регистрация: 24.03.2007
Сообщений: 1,395
Сказал спасибо: 85
Сказали Спасибо 673 раз(а) в 392 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Оформить m1 не как метку, а как подпрограмму.
Все равно, видимо, раз уже все вразнос пошло, m1 - это тупиковая ветвь.
pambaru вне форума  
Непрочитано 16.05.2013, 18:54  
lsa
Почётный гражданин KAZUS.RUN
 
Аватар для lsa
 
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,479
Сказал спасибо: 3,193
Сказали Спасибо 2,982 раз(а) в 682 сообщении(ях)
lsa на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Если процессор нормальный и знаете о возможности переполнения стека:
положить в стек адрес места куда нужно скакнуть и выполнить RETI.
Когда я контролирую стек и сам в него пишу, то еще и делаю подмену - сначала вынимаю адрес (автоматом сохраненный при входе в прерывание), потом сохраняю туда новый и выполняю RETI.
lsa вне форума  
Непрочитано 16.05.2013, 18:59  
Ara41
Почётный гражданин KAZUS.RUN
 
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от lsa Посмотреть сообщение
положить в стек адрес места куда нужно скакнуть и выполнить RETI.
и еще попутно скорректировать указатель стека, чтобы было всё как положено.
Ara41 вне форума  
Непрочитано 16.05.2013, 19:16  
lsa
Почётный гражданин KAZUS.RUN
 
Аватар для lsa
 
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,479
Сказал спасибо: 3,193
Сказали Спасибо 2,982 раз(а) в 682 сообщении(ях)
lsa на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от Ara41 Посмотреть сообщение
скорректировать указатель стека
А зачем? Если на вершине лежат два байта адреса возврата и туда записать еще два байта нового адреса, то указатель стека будет автоматом указывать на новый адрес.
lsa вне форума  
Непрочитано 16.05.2013, 19:23  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от pambaru Посмотреть сообщение
Оформить m1 не как метку, а как подпрограмму.
Все равно, видимо, раз уже все вразнос пошло, m1 - это тупиковая ветвь.
подпрограмма не катит см. тему по ссылке
MaxiMuz79 вне форума  
Непрочитано 16.05.2013, 19:27  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

lsa, есть оператор goto, непонятно почему нет возможности переходить в другой блок. А так воткнулбы "rjmp adr" , но незнаю как.
MaxiMuz79 вне форума  
Непрочитано 16.05.2013, 19:32  
lsa
Почётный гражданин KAZUS.RUN
 
Аватар для lsa
 
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,479
Сказал спасибо: 3,193
Сказали Спасибо 2,982 раз(а) в 682 сообщении(ях)
lsa на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Потому как с этим goto утрачивается логический ход программы. Компилятор еще насовал при входе сохранение регистров и ожидает их вернуть. Вы пытаетесь прервать этот ход и компилятор не дает сделать ошибку.
lsa вне форума  
Непрочитано 16.05.2013, 19:57  
Ara41
Почётный гражданин KAZUS.RUN
 
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от lsa Посмотреть сообщение
А зачем? Если на вершине лежат два байта адреса возврата и туда записать еще два байта нового адреса, то указатель стека будет автоматом указывать на новый адрес.
по указанной ссылке в коде перед RETI еще восстанавливаются регистры, ранее сохраненные в стеке, поэтому указатель стека надо бы скорректировать, т.к. выход из обработчика прерывания планируется быстрый и без восстановления регистров.
Ara41 вне форума  
Сказали "Спасибо" Ara41
lsa (16.05.2013)
Непрочитано 16.05.2013, 20:20  
lsa
Почётный гражданин KAZUS.RUN
 
Аватар для lsa
 
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,479
Сказал спасибо: 3,193
Сказали Спасибо 2,982 раз(а) в 682 сообщении(ях)
lsa на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от Ara41 Посмотреть сообщение
по указанной ссылке в коде перед RETI еще восстанавливаются регистры,
Точно. Я не учел стандартного процесса выхода в GCC.
Простой записью двух байт можно было обойтись только в асме.
lsa вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аварийный подзарядник аккумулятора. Boryan Электроника средств транспорта 25 03.02.2012 07:27
HI-TECH PIC выход из прерывания Slava-martyn Микроконтроллеры, АЦП, память и т.д 6 12.12.2011 18:54
Как подключить аварийный светильник к более мощному аккумулятору? VOYA75 Источники питания и свет 11 18.11.2011 02:39
Аварийный фонарь, защита от переразряда Evlagor Источники питания и свет 17 16.03.2010 04:56
выход из прерывания vrt90 АЛЕКСАНДР Микроконтроллеры, АЦП, память и т.д 5 05.10.2004 12:18


Часовой пояс GMT +4, время: 17:39.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.