16.05.2013, 18:43
|
|
Гражданин KAZUS.RU
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
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.
|
|
|
|
16.05.2013, 18:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,360
Сказал спасибо: 85
Сказали Спасибо 618 раз(а) в 373 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Оформить m1 не как метку, а как подпрограмму.
Все равно, видимо, раз уже все вразнос пошло, m1 - это тупиковая ветвь.
|
|
|
|
16.05.2013, 18:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Если процессор нормальный и знаете о возможности переполнения стека:
положить в стек адрес места куда нужно скакнуть и выполнить RETI.
Когда я контролирую стек и сам в него пишу, то еще и делаю подмену - сначала вынимаю адрес (автоматом сохраненный при входе в прерывание), потом сохраняю туда новый и выполняю RETI.
|
|
|
|
16.05.2013, 18:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от lsa
|
положить в стек адрес места куда нужно скакнуть и выполнить RETI.
|
и еще попутно скорректировать указатель стека, чтобы было всё как положено.
|
|
|
|
16.05.2013, 19:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от Ara41
|
скорректировать указатель стека
|
А зачем? Если на вершине лежат два байта адреса возврата и туда записать еще два байта нового адреса, то указатель стека будет автоматом указывать на новый адрес.
|
|
|
|
16.05.2013, 19:23
|
|
Гражданин KAZUS.RU
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от pambaru
|
Оформить m1 не как метку, а как подпрограмму.
Все равно, видимо, раз уже все вразнос пошло, m1 - это тупиковая ветвь.
|
подпрограмма не катит см. тему по ссылке
|
|
|
|
16.05.2013, 19:27
|
|
Гражданин KAZUS.RU
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
lsa, есть оператор goto, непонятно почему нет возможности переходить в другой блок. А так воткнулбы "rjmp adr" , но незнаю как.
|
|
|
|
16.05.2013, 19:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Потому как с этим goto утрачивается логический ход программы. Компилятор еще насовал при входе сохранение регистров и ожидает их вернуть. Вы пытаетесь прервать этот ход и компилятор не дает сделать ошибку.
|
|
|
|
16.05.2013, 19:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от lsa
|
А зачем? Если на вершине лежат два байта адреса возврата и туда записать еще два байта нового адреса, то указатель стека будет автоматом указывать на новый адрес.
|
по указанной ссылке в коде перед RETI еще восстанавливаются регистры, ранее сохраненные в стеке, поэтому указатель стека надо бы скорректировать, т.к. выход из обработчика прерывания планируется быстрый и без восстановления регистров.
|
|
|
|
16.05.2013, 20:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от Ara41
|
по указанной ссылке в коде перед RETI еще восстанавливаются регистры,
|
Точно. Я не учел стандартного процесса выхода в GCC.
Простой записью двух байт можно было обойтись только в асме.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:23.
|
|