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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

Сообщение от lsa Посмотреть сообщение
А зачем? Если на вершине лежат два байта адреса возврата и туда записать еще два байта нового адреса, то указатель стека будет автоматом указывать на новый адрес.
по указанной ссылке в коде перед RETI еще восстанавливаются регистры, ранее сохраненные в стеке, поэтому указатель стека надо бы скорректировать, т.к. выход из обработчика прерывания планируется быстрый и без восстановления регистров.
Ara41 вне форума  
Сказали "Спасибо" Ara41
lsa (16.05.2013)
Непрочитано 16.05.2013, 20:20  
lsa
Почётный гражданин KAZUS.RU
 
Аватар для lsa
 
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
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, время: 20:23.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot