GCC: Аварийный выход из прерывания (функции)
18.05.2013, 13:15
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,458
Сказал спасибо: 3,227
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от electroTrash
|
|
Это можно сделать с помощью асм. вставок, данный вариант некрасив и небезопасен, уж лучше определить массив достаточного размера в памяти программы и в нем уже разместить асм. программу.
|
Пожалуйста поясните насчёт небезопасности (в контексте начального загрузчика).
Что касается массива, то это представляется мне излишеством, т.к. приложение и начальный загрузчик - совершенно незасимы друг от друга. Приложение может только вызвать загрузчик и ничего более. Загрузчик может только запустить свежепереписанное приложение с 0 (или, если угодно, вызвать настоящий сброс через сторожевой таймер).
|
|
|
|
18.05.2013, 18:30
|
|
|
Прописка
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от ForcePoint
|
|
(в контексте начального загрузчика)
|
Я как раз имел ввиду случай ТС, у него программа обработки не расположена в секторе загрузчика, переход на обработчик прерывания должен быть размещен по вектору прерывания, к тому же у Вас нет штатного выход из программы, который тут необходим. Указывать явно расположение (адрес) функции обработки прерывания, может привести к проблемам, но можно определить массив достаточного размера или как у вас (я об этом тоже писал ранее) определить указатель на функцию и разместить ассемлером ( stm) маш. код. jmp(call) ‹значение_указателя_на функцию›. Но, я думаю, ТС все же лучше сделать штатными директивами компилятора, наподобие указанного, а не придумывать себе проблемы.
|
|
|
|
19.05.2013, 20:39
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
akegor, но всетакие речь идет о GCC.
вот что порекомендовали:
http://gcc.gnu.org/onlinedocs/gcc-2....c_4.html#SEC64
в итоге:
|
Код:
|
void *ptr;
ISR (xxx_vect)
{
...
...
goto *ptr;
}
void main (void)
{
ptr=&&m1;
...
while (1)
{ ...
...
}
m1:
...
...
} |
|
|
|
|
19.05.2013, 22:28
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от MaxiMuz79
|
|
но всетакие речь идет о GCC
|
А в GCC pragma не работает на участок программы?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
20.05.2013, 01:45
|
|
|
Прописка
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
В GCC по другому:
|
Код:
|
ISR (xxx_vect) __attribute__ ((naked));
ISR (xxx_vect)
{
...
...
goto m1;
} |
|
|
|
|
20.05.2013, 07:42
|
|
|
Временная регистрация
Регистрация: 04.08.2006
Сообщений: 67
Сказал спасибо: 2
Сказали Спасибо 20 раз(а) в 11 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Если уж извращаться, то можно поступить так:
Вынести прерывание в отдельный файл, а функцию которая вызывается и в main, и в прерывании, описать полностью в хедере с ключевым словом static.
Последний раз редактировалось Vetal-soft; 20.05.2013 в 07:44.
|
|
|
|
20.05.2013, 08:19
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.06.2005
Сообщений: 942
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от MaxiMuz79
|
|
программа должна быть по возможности быстрой и компактной.
|
Ну так что мешает вместо занятий глупостями писать компактный и быстрый код? В той теме уже советовали - пиши по человечески, я ссылку на апноту приводил, и так и не узнал, что же из апноты на ГЦЦ не только не работает, но и даёт противоположный результат (ухудшает производительность).
|
|
|
|
20.05.2013, 08:25
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.06.2005
Сообщений: 942
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от ForcePoint
|
|
Неясно только, что компилятор (GCC) делает последними двумя командами:
|
Ждёт конечно, пока 5й бит не установится (что говорит о том что УДР0 опустел), тогда пропустит переход, дальше пойдёт.
|
|
|
|
22.05.2013, 00:27
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от Vetal-soft
|
Если уж извращаться, то можно поступить так:
Вынести прерывание в отдельный файл, а функцию которая вызывается и в main, и в прерывании, описать полностью в хедере с ключевым словом static.
|
результат абслоютно тотже самый что без static
|
|
|
|
22.05.2013, 06:36
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Чита-читал... И так и не понял, зачем изобретать велосипед в грубой извращенной форме?
Требуется: в случае аварийной ситуации по соответствующему прерыванию либо замереть, либо уйти на сброс (не принципиально). Застрять в обработчике прерывания навсегда - проблема? Либо автор недоговаривает, либо я чего-то не понимаю.
ПС Извращениями не наслаждаюсь...
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:21.
|
|