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

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

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

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

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

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


 
Опции темы

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

Непрочитано 16.05.2013, 20:42  
electroTrash
Прописка
 
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
electroTrash на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Можно всю функцию обработки написать в виде отдельной функции на ассемблере, а по адресу вектора прерывания разместить ссылку на ссылку этой функцию.
Реклама:

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

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

Сейчас попробовал такой аварийный выход в Atmel Studio 6. Получается заставить перескочить на нужный адрес через подмену стека.
Код:
	asm ("ldi R30,0");
	asm ("push R30");
	asm ("Ldi R30,0x15");
	asm ("push R30");
	asm ("RETI");
Только теперь нужно получить адрес m1 и заменить загрузку двух байт в стек на нужные числа.
lsa вне форума  
Непрочитано 17.05.2013, 02:54  
rais_
Прохожий
 
Регистрация: 17.05.2013
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
rais_ на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от MaxiMuz79 Посмотреть сообщение
Оператор goto тут не работает:
Сообщение от MaxiMuz79 Посмотреть сообщение
но всетаки хочется научиться эксплуатирать Си по полной где это позволяет иструментарий
У метки область видимости ограничена функцией, в какой она стоит.
goto работает только внутри области видимости последней вызванной функции.
Для переходво между функциями можно использовать такую штуку setjmp/longjmp или sigsetjmp/siglongjmp. Как раз для таких ситуаций. На stackoverflow про него довольно неплохо расписано должно быть. Можно найти пару-тройку примеров (в man-pages пример для этого вызова отсутствует).

Стилистическое замечание: несмотря на то, что ассемблерная программа сплошь и рядом состоит из jmp (goto), программа высокого уровня гораздо лучше смотрится безо всяких goto.

Сообщение от lsa Посмотреть сообщение
Когда я контролирую стек и сам в него пишу, то еще и делаю подмену - сначала вынимаю адрес (автоматом сохраненный при входе в прерывание), потом сохраняю туда новый и выполняю RETI.
Да, но при использовании языков высокого уровня некоторые простые вещи "слегка" усложняются компилятором. И тогда встает вопрос о переносимости кода между компиляторами.

Последний раз редактировалось rais_; 17.05.2013 в 02:59. Причина: память подвела
rais_ вне форума  
Непрочитано 17.05.2013, 06:33  
Vovich1974
Частый гость
 
Регистрация: 31.10.2008
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Vovich1974 на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Ну зачем же так извращаться.... А может стоит вспомнить о паре try-catch ? Будет выглядеть так:

void funcMain (){
try {
func1 ();
} catch (...) {
//тут обрабатываем исключение
}
}

void func1 () {
.....
throw ("Таки что-то не так. вылетаем аварийно из функции");
.....
}


Логика проста - если при обработке данных в функции пошло что-то не так, то кидаем исключение (throw), а ловит его выше (вложенность значения не имеет) catch. Вобщем - гуглим на тему try-catch и там все есть.
Vovich1974 вне форума  
Непрочитано 17.05.2013, 06:47  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от MaxiMuz79 Посмотреть сообщение
Возникла ситуация когда при обработке прерывания нужно изменить привычный ход программы, когда содержимое сохранненых регистров и указатель стека уже не важны. Оператор goto тут не работает:
Нескромный вопрос - зачем вывалиться из прерывания? Раз прерывание по нештатной ситуации, так и все действия в нем, хоть зацикливание, хоть засыпание, хоть переинициализация...
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 17.05.2013, 08:47  
vitvp
Вид на жительство
 
Регистрация: 13.08.2007
Адрес: Kiev, UA
Сообщений: 431
Сказал спасибо: 423
Сказали Спасибо 214 раз(а) в 94 сообщении(ях)
vitvp на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от pambaru Посмотреть сообщение
Оформить m1 не как метку, а как подпрограмму.
Все равно, видимо, раз уже все вразнос пошло, m1 - это тупиковая ветвь.
Делая подсистему прерываний с малым временем реакции, не стоит как п/программу, терминируемую, например, Break. Вызов/отработка её идет довольно долго, она должна быть statiс и т.д.

Если скорость отработки события прерывания не сильно критична, в ISR лучше ограничиться выставлением флагов, анализируемых в основном цикле программы или его условиях.

Делая код переносимый (а, ведь, это основная фишка C) на другие платформы не стоит, хакерствуя, лепить неявные переходы через содержимое стека - в следующих реинкарнациях его организация может быть совершенно иной. И даже просто включив в в gcc оптимизацию "граблей" можете поиметь знатных, отлавливаемых только глазками в .lss
vitvp вне форума  
Непрочитано 17.05.2013, 08:56  
vitvp
Вид на жительство
 
Регистрация: 13.08.2007
Адрес: Kiev, UA
Сообщений: 431
Сказал спасибо: 423
Сказали Спасибо 214 раз(а) в 94 сообщении(ях)
vitvp на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от Vovich1974 Посмотреть сообщение
Логика проста - если при обработке данных в функции пошло что-то не так, то кидаем исключение (throw), а ловит его выше (вложенность значения не имеет) catch. Вобщем - гуглим на тему try-catch и там все есть.
CPP все-же уже надстройка над GCC

http://gcc.gnu.org/onlinedocs/libstd...xceptions.html
vitvp вне форума  
Непрочитано 17.05.2013, 09:41  
Vovich1974
Частый гость
 
Регистрация: 31.10.2008
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Vovich1974 на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от vitvp Посмотреть сообщение
CPP все-же уже надстройка над GCC

http://gcc.gnu.org/onlinedocs/libstd...xceptions.html
Поясни, а то я чего-то не понимаю.
Vovich1974 вне форума  
Непрочитано 17.05.2013, 11:07  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от Vovich1974 Посмотреть сообщение
Поясни, а то я чего-то не понимаю.
Насколько я понял, ТС в плюсах не работает. Неизвестно вообще, поддерживает ли плюсы его компайлер. Да и сами плюсы - это уже иной стандарт, нежели нэйтив Си.
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
 
Опции темы

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

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, время: 01:59.


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