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

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

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

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

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

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


 
Опции темы

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

Непрочитано 17.05.2013, 23:53  
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
nahimovv на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Она ещё должна быть и безопасной...
А у вас сейчас одно потянется за другим... в случае недопонимания чего-либо наживёте себе геморрой... оно вам надо???
Реклама:
nahimovv вне форума  
Непрочитано 18.05.2013, 00:04  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от MaxiMuz79 Посмотреть сообщение
то что вы предлагаете идет в разрез с моими представлениями морали в программировании
Если мораль -
Сообщение от MaxiMuz79 Посмотреть сообщение
проблема решилась асм вставкой
asm("rjmp 0x1234"); только после первой компиляции остается правильно подобрать адрес. Культурно определять адрес нужного места в программе я пока не научился.
, тогда удачи с граблями.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 18.05.2013, 07:42  
pambaru
Почётный гражданин KAZUS.RUN
 
Регистрация: 24.03.2007
Сообщений: 1,394
Сказал спасибо: 85
Сказали Спасибо 672 раз(а) в 392 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от MaxiMuz79 Посмотреть сообщение
Сообщение от electroTrash
почему бы вам тогда при инициализации не разместить по адресу вектора прерывания соответствующей асм. вставкой маш. код. (rjmp interr_label). Да, не Си, но за все надо платить.
ничего не понял.
Кстати, самый правильный вариант, раз уж Вы боретесь с лишними тактами и командами при выполнении прерывания, и вызов подпрограммы для Вас недопустим по каким-то соображениям.
electroTrash предлагает вставить ассемблерную вставку не в подпрограмму прерывания, а непосредственно по адресу вектора прерывания, что сэкономит важные для Вас такты и избавит от запихивание в стэк вообще чего либо, кроме адреса возврата.
pambaru вне форума  
Непрочитано 18.05.2013, 11:44  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,457
Сказал спасибо: 3,225
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
ForcePoint на пути к лучшему
Стрелка 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.
ForcePoint вне форума  
Непрочитано 18.05.2013, 12:38  
electroTrash
Прописка
 
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
electroTrash на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

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

Сообщение от pambaru Посмотреть сообщение
Кстати, самый правильный вариант, раз уж Вы боретесь с лишними тактами и командами при выполнении прерывания, и вызов подпрограммы для Вас недопустим по каким-то соображениям.
electroTrash предлагает вставить ассемблерную вставку не в подпрограмму прерывания, а непосредственно по адресу вектора прерывания, что сэкономит важные для Вас такты и избавит от запихивание в стэк вообще чего либо, кроме адреса возврата.
а как же выполнение прерывания по своему основному назначению ?
Хотя ... я щас подумал ... можно написать подпрограмму по свободному адресу прерывания и уже в основном прерывании инициировать вызов нужного прерывания в которой содержится подпрограмма
Как оно ?

Последний раз редактировалось MaxiMuz79; 18.05.2013 в 12:44.
MaxiMuz79 вне форума  
Непрочитано 18.05.2013, 12:44  
electroTrash
Прописка
 
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
electroTrash на пути к лучшему
По умолчанию 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.
electroTrash вне форума  
Непрочитано 18.05.2013, 12:57  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Сообщение от electroTrash Посмотреть сообщение
И вообще переходите на "гонимый" CV_AVR, там спец. директивой можно отключить сохранение в стеке регистров:
в GCC тоже есть такая возможность , но тогда вообще все в ручную придется отслеживать
MaxiMuz79 вне форума  
Непрочитано 18.05.2013, 13:04  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

MaxiMuz79, в приведенном примере отключение производится для необходимой части программы. Остальное - как обычно.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 18.05.2013, 13:10  
electroTrash
Прописка
 
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
electroTrash на пути к лучшему
По умолчанию Re: GCC: Аварийный выход из прерывания (функции)

Зачем тогда вся эта тема, или вы думаете, на асм.-е будет легче отслеживать ошибки?!
electroTrash вне форума  
 
Опции темы

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

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:52.


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