GCC: Аварийный выход из прерывания (функции)
17.05.2013, 23:53
|
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Она ещё должна быть и безопасной...
А у вас сейчас одно потянется за другим... в случае недопонимания чего-либо наживёте себе геморрой... оно вам надо???
|
|
|
|
18.05.2013, 00:04
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от MaxiMuz79
|
|
то что вы предлагаете идет в разрез с моими представлениями морали в программировании
|
Если мораль -
Сообщение от MaxiMuz79
|
проблема решилась асм вставкой
asm("rjmp 0x1234"); только после первой компиляции остается правильно подобрать адрес. Культурно определять адрес нужного места в программе я пока не научился.
|
, тогда удачи с граблями.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
18.05.2013, 07:42
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.03.2007
Сообщений: 1,394
Сказал спасибо: 85
Сказали Спасибо 672 раз(а) в 392 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от MaxiMuz79
|
|
Сообщение от electroTrash
|
|
почему бы вам тогда при инициализации не разместить по адресу вектора прерывания соответствующей асм. вставкой маш. код. (rjmp interr_label). Да, не Си, но за все надо платить.
|
ничего не понял.
|
Кстати, самый правильный вариант, раз уж Вы боретесь с лишними тактами и командами при выполнении прерывания, и вызов подпрограммы для Вас недопустим по каким-то соображениям.
electroTrash предлагает вставить ассемблерную вставку не в подпрограмму прерывания, а непосредственно по адресу вектора прерывания, что сэкономит важные для Вас такты и избавит от запихивание в стэк вообще чего либо, кроме адреса возврата.
|
|
|
|
18.05.2013, 11:44
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,457
Сказал спасибо: 3,225
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от MaxiMuz79
|
|
Культурно определять адрес нужного места в программе я пока не научился.
|
Я Си плохо знаю. Когда потребовалось сделать такой прыжок из Си-программы в АСМ-загрузчик мне посоветовали это и оно работает (AVR). Правда адрес загрузчика "прибит гвоздями" и мне известен заранее:
|
Код:
|
static void (* const bootloader)(void) = (void*)0x7FBE;
// hot_start = 0x3FDF (слова).
bootloader(); // ... выхода не будет - перезапуск |
Неясно только, что компилятор (GCC) делает последними двумя командами:
|
Код:
|
case 'B': { // Вызов загрузчика (call), вместо...
UCSRB = _BV(TXEN) | _BV(RXEN); // Установка режима УАПП - 1 стоп-бит
114e: 28 e1 ldi r18, 0x18 ; 24
1150: 2a b9 out 0x0a, r18 ; 10
static void (* const bootloader)(void) = (void*)0x7FBE;
// hot_start = 0x3FDF (слова).
bootloader(); // ... выхода не будет - перезапуск
1152: ee eb ldi r30, 0xBE ; 190
1154: ff e7 ldi r31, 0x7F ; 127
1156: 09 95 icall
1158: 5d 9b sbis 0x0b, 5 ; 11
115a: fe cf rjmp .-4 ; 0x1158 ‹__stack+0x8f9›
} |
Загрузчик сам себе устанавливает стек, работает и потом передаёт управление на 0х0.
|
|
|
|
18.05.2013, 12:38
|
|
|
Прописка
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от ForcePoint
|
|
Правда адрес загрузчика "прибит гвоздями"
|
Это можно сделать с помощью асм. вставок, данный вариант некрасив и небезопасен, уж лучше определить массив достаточного размера в памяти программы и в нем уже разместить асм. программу.
|
|
|
|
18.05.2013, 12:41
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от pambaru
|
Кстати, самый правильный вариант, раз уж Вы боретесь с лишними тактами и командами при выполнении прерывания, и вызов подпрограммы для Вас недопустим по каким-то соображениям.
electroTrash предлагает вставить ассемблерную вставку не в подпрограмму прерывания, а непосредственно по адресу вектора прерывания, что сэкономит важные для Вас такты и избавит от запихивание в стэк вообще чего либо, кроме адреса возврата.
|
а как же выполнение прерывания по своему основному назначению ?
Хотя ... я щас подумал ... можно написать подпрограмму по свободному адресу прерывания и уже в основном прерывании инициировать вызов нужного прерывания в которой содержится подпрограмма
Как оно ?
Последний раз редактировалось MaxiMuz79; 18.05.2013 в 12:44.
|
|
|
|
18.05.2013, 12:44
|
|
|
Прописка
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
И вообще переходите на "гонимый" CV_AVR, там спец. директивой можно отключить сохранение в стеке регистров:
|
Цитата:
|
The automatic saving and restoring of registers affected by the interrupt handler, can be turned on or off using the #pragma savereg directive.
Example:
/* Turn registers saving off */
#pragma savereg-
/* interrupt handler */
interrupt [1] void my_irq(void) {
/* now save only the registers that are affected
by the routines in the interrupt handler,
for example R30, R31 and SREG */
#asm
push r30
push r31
in r30,SREG
push r30
#endasm
/* place the C code here */
/* .... */
/* now restore SREG, R31 and R30 */
#asm
pop r30
out SREG,r30
pop r31
pop r30
#endasm
}
/* re-enable register saving for the other interrupts */
#pragma savereg+
The default state is automatic saving of registers during interrupts.
The #pragma savereg directive is maintained only for compatibility with versions of the compiler prior to V1.24.1. This directive is not recommended for new projects.
|
|
|
|
|
18.05.2013, 12:57
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Сообщение от electroTrash
|
|
И вообще переходите на "гонимый" CV_AVR, там спец. директивой можно отключить сохранение в стеке регистров:
|
в GCC тоже есть такая возможность , но тогда вообще все в ручную придется отслеживать
|
|
|
|
18.05.2013, 13:04
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
MaxiMuz79, в приведенном примере отключение производится для необходимой части программы. Остальное - как обычно.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
18.05.2013, 13:10
|
|
|
Прописка
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
|
Re: GCC: Аварийный выход из прерывания (функции)
Зачем тогда вся эта тема, или вы думаете, на асм.-е будет легче отслеживать ошибки?!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:52.
|
|