GCC: Аварийный выход из прерывания (функции)
16.05.2013, 20:42
|
|
|
Прописка
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Можно всю функцию обработки написать в виде отдельной функции на ассемблере, а по адресу вектора прерывания разместить ссылку на ссылку этой функцию.
Последний раз редактировалось electroTrash; 16.05.2013 в 20:52.
|
|
|
|
16.05.2013, 22:34
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от electroTrash
|
|
Можно всю функцию обработки написать в виде отдельной функции на ассемблере, а по адресу вектора прерывания разместить ссылку на ссылку этой функцию.
|
я так и делаю когда скорость нужна, но всетаки хочется научиться эксплуатирать Си по полной где это позволяет иструментарий ...
|
|
|
|
17.05.2013, 01:45
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,479
Сказал спасибо: 3,193
Сказали Спасибо 2,982 раз(а) в 682 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сейчас попробовал такой аварийный выход в Atmel Studio 6. Получается заставить перескочить на нужный адрес через подмену стека.
|
Код:
|
asm ("ldi R30,0");
asm ("push R30");
asm ("Ldi R30,0x15");
asm ("push R30");
asm ("RETI"); |
Только теперь нужно получить адрес m1 и заменить загрузку двух байт в стек на нужные числа.
|
|
|
|
17.05.2013, 02:54
|
|
|
Прохожий
Регистрация: 17.05.2013
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от MaxiMuz79
|
|
Оператор goto тут не работает:
|
Сообщение от MaxiMuz79
|
|
но всетаки хочется научиться эксплуатирать Си по полной где это позволяет иструментарий
|
У метки область видимости ограничена функцией, в какой она стоит.
goto работает только внутри области видимости последней вызванной функции.
Для переходво между функциями можно использовать такую штуку setjmp/longjmp или sigsetjmp/siglongjmp. Как раз для таких ситуаций. На stackoverflow про него довольно неплохо расписано должно быть. Можно найти пару-тройку примеров (в man-pages пример для этого вызова отсутствует).
Стилистическое замечание: несмотря на то, что ассемблерная программа сплошь и рядом состоит из jmp (goto), программа высокого уровня гораздо лучше смотрится безо всяких goto.
Сообщение от lsa
|
|
Когда я контролирую стек и сам в него пишу, то еще и делаю подмену - сначала вынимаю адрес (автоматом сохраненный при входе в прерывание), потом сохраняю туда новый и выполняю RETI.
|
Да, но при использовании языков высокого уровня некоторые простые вещи "слегка" усложняются компилятором. И тогда встает вопрос о переносимости кода между компиляторами.
Последний раз редактировалось rais_; 17.05.2013 в 02:59.
Причина: память подвела
|
|
|
|
17.05.2013, 06:33
|
|
|
Частый гость
Регистрация: 31.10.2008
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Ну зачем же так извращаться.... А может стоит вспомнить о паре try-catch ? Будет выглядеть так:
void funcMain (){
try {
func1 ();
} catch (...) {
//тут обрабатываем исключение
}
}
void func1 () {
.....
throw ("Таки что-то не так. вылетаем аварийно из функции");
.....
}
Логика проста - если при обработке данных в функции пошло что-то не так, то кидаем исключение (throw), а ловит его выше (вложенность значения не имеет) catch. Вобщем - гуглим на тему try-catch и там все есть.
|
|
|
|
17.05.2013, 06:47
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от MaxiMuz79
|
|
Возникла ситуация когда при обработке прерывания нужно изменить привычный ход программы, когда содержимое сохранненых регистров и указатель стека уже не важны. Оператор goto тут не работает:
|
Нескромный вопрос - зачем вывалиться из прерывания? Раз прерывание по нештатной ситуации, так и все действия в нем, хоть зацикливание, хоть засыпание, хоть переинициализация...
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
17.05.2013, 08:47
|
|
|
Вид на жительство
Регистрация: 13.08.2007
Адрес: Kiev, UA
Сообщений: 431
Сказал спасибо: 423
Сказали Спасибо 214 раз(а) в 94 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от pambaru
|
Оформить m1 не как метку, а как подпрограмму.
Все равно, видимо, раз уже все вразнос пошло, m1 - это тупиковая ветвь.
|
Делая подсистему прерываний с малым временем реакции, не стоит как п/программу, терминируемую, например, Break. Вызов/отработка её идет довольно долго, она должна быть statiс и т.д.
Если скорость отработки события прерывания не сильно критична, в ISR лучше ограничиться выставлением флагов, анализируемых в основном цикле программы или его условиях.
Делая код переносимый (а, ведь, это основная фишка C) на другие платформы не стоит, хакерствуя, лепить неявные переходы через содержимое стека - в следующих реинкарнациях его организация может быть совершенно иной. И даже просто включив в в gcc оптимизацию "граблей" можете поиметь знатных, отлавливаемых только глазками в .lss
|
|
|
|
17.05.2013, 08:56
|
|
|
Вид на жительство
Регистрация: 13.08.2007
Адрес: Kiev, UA
Сообщений: 431
Сказал спасибо: 423
Сказали Спасибо 214 раз(а) в 94 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от Vovich1974
|
|
Логика проста - если при обработке данных в функции пошло что-то не так, то кидаем исключение (throw), а ловит его выше (вложенность значения не имеет) catch. Вобщем - гуглим на тему try-catch и там все есть.
|
CPP все-же уже надстройка над GCC
http://gcc.gnu.org/onlinedocs/libstd...xceptions.html
|
|
|
|
17.05.2013, 09:41
|
|
|
Частый гость
Регистрация: 31.10.2008
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Поясни, а то я чего-то не понимаю.
|
|
|
|
17.05.2013, 11:07
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от Vovich1974
|
|
Поясни, а то я чего-то не понимаю.
|
Насколько я понял, ТС в плюсах не работает. Неизвестно вообще, поддерживает ли плюсы его компайлер. Да и сами плюсы - это уже иной стандарт, нежели нэйтив Си.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:59.
|
|