реклама на сайте
подробности

 
 
> Работа с прерываниями в WinAVR, Глобальные переменные в main и прерываниях
studert
сообщение Oct 17 2008, 11:07
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121



Задаю благозвучное название прерывания
#define PacketReceiveComplete INT5_vect

Объявлена глобальная переменная, значение которой
uint64t_t DestMAC;

Обработчик прерывания, функция getDestMAC записывает в переменную DestMAC нужные данные
ISR(PacketReceiveComplete){
cli();
getDestMAC(&DestMAC);
sei();
}
int main(void){
...
printf("%lx",DestMAC);
}
Это не работает, печатает мусор,причем попытки изменить DestMAC main тоже неудачны, она не меняется. Что я делаю не так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aesok
сообщение Oct 17 2008, 11:33
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(studert @ Oct 17 2008, 15:07) *
Объявлена глобальная переменная, значение которой
uint64t_t DestMAC;


avr-libc-user-manual FAQ#1

Цитата(studert @ Oct 17 2008, 15:07) *
printf("%lx",DestMAC);


Уточните в avr-libc-user-manual поддерживает ли printf 64-битные типы.

Цитата(studert @ Oct 17 2008, 15:07) *
ISR(PacketReceiveComplete){
cli();
getDestMAC(&DestMAC);
sei();
}


Нельзя разрешать прерывания перед выходом из прерывания, они сами разрештся при выполнении инструкции RETI.

Анатолий.
Go to the top of the page
 
+Quote Post
Kernigan
сообщение Oct 17 2008, 12:04
Сообщение #3





Группа: Новичок
Сообщений: 11
Регистрация: 17-10-08
Пользователь №: 41 018



Цитата(aesok @ Oct 17 2008, 14:33) *
Нельзя разрешать прерывания перед выходом из прерывания, они сами разрештся при выполнении инструкции RETI.

Можно конечно. Не запрещено.
Go to the top of the page
 
+Quote Post
aesok
сообщение Oct 17 2008, 17:20
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Kernigan @ Oct 17 2008, 16:04) *
Цитата
Нельзя разрешать прерывания перед выходом из прерывания, они сами разрештся при выполнении инструкции RETI


Можно конечно. Не запрещено.


1. Лишняя инструкция SEI, прерывания все равно будут разрешенны при выполнении инструкции RETI.

2. При разрешении прерывани до возвращения из обработчика создаються условия что следующиу обработчик(и) вызовутся когда в стеке еще находиться адрес возврата и возможно локальные переменные текущего обработчика, что приводит к повышенному и неэффективному использованию опреративной памяти.

3. Специфично для GCC. Если функции нужно место в стеке, то нужно модифицировать регистр указателя стека. Пролог и эпилог обработчика прерывиня генерируеться из предположения что прерывания отключены и в них не выполняеться временное отключение прерываний при модификации указателя стека. Разрешая прерывания до эпилога возникают условия что обработчик прерывания может быть вызван когда указатель стека модифицирован только частично (старший байт уже изменен младший еще нет), что может привести к критическим последствиям.

Анатолй.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 17 2008, 18:51
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(aesok @ Oct 17 2008, 21:20) *
Пролог и эпилог обработчика прерывиня генерируеться из предположения что прерывания отключены и в них не выполняеться временное отключение прерываний при модификации указателя стека.

На мой взляд такое предположение не совсем удачно. Компилятор ничего не должен предполагать - это прерогатива программиста.

Иногда просто необходимо разрешать прерывания внутри обработчика прерывания.
Выход видится такой:
Код
intX:
   прогол
   op1
   op2
   sei
   op3
   ....
   op333
   cli
   эпилог
   reti

Может есть другие, более изящные варианты?
Где в документации можно прочесть об этом нюансе?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
aesok
сообщение Oct 17 2008, 19:14
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(demiurg_spb @ Oct 17 2008, 22:51) *
Иногда просто необходимо разрешать прерывания внутри обработчика прерывания.
Выход видится такой:
Код
intX:
   прогол
   op1
   op2
   sei
   op3
   ....
   op333
   cli
   эпилог
   reti


Это будет работать до того момента, пока кто нибудь не напишет:
{
sei()
...
if(...)
return;
...
cli()
}

Цитата
Где в документации можно прочесть об этом нюансе?


http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gc...tion-Attributes

Цитата
signal
Use this attribute on the AVR to indicate that the specified function is a signal handler. The compiler will generate function entry and exit sequences suitable for use in a signal handler when this attribute is present. Interrupts will be disabled inside the function.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- studert   Работа с прерываниями в WinAVR   Oct 17 2008, 11:07
- - _dem   Код#define PacketReceiveComplete INT5_vect volati...   Oct 17 2008, 11:12
- - Палыч   Цитата(studert @ Oct 17 2008, 14:07) Что ...   Oct 17 2008, 11:14
|- - studert   Цитата(Палыч @ Oct 17 2008, 18:14) Попроб...   Oct 17 2008, 11:28
|- - Палыч   Цитата(studert @ Oct 17 2008, 14:28) Так ...   Oct 17 2008, 11:46
- - SasaVitebsk   volatile забыли. Иначе оптимизатор может выкинуть ...   Oct 17 2008, 11:27
|- - studert   Цитата(SasaVitebsk @ Oct 17 2008, 18:27) ...   Oct 17 2008, 11:45
|- - Палыч   Вы уверены, что функция printf выполняется после т...   Oct 17 2008, 11:36
|- - studert   Цитата(aesok @ Oct 17 2008, 18:33) avr-li...   Oct 17 2008, 11:55
|- - ReAl   Цитата(demiurg_spb @ Oct 17 2008, 21:51) ...   Oct 17 2008, 20:44
- - mandrew   Цитата(studert @ Oct 17 2008, 15:07) Зада...   Oct 17 2008, 12:05
|- - studert   Цитата(mandrew @ Oct 17 2008, 19:05) 1) А...   Oct 17 2008, 12:27
|- - MrYuran   Цитата(studert @ Oct 17 2008, 16:27) Прин...   Oct 17 2008, 12:48
- - Палыч   Никто не мешает разбить 64 бита на несколько ulong...   Oct 17 2008, 13:31
- - mdmitry   В каком виде надо MAC-адрес выводить? В зависимост...   Oct 17 2008, 13:34
- - _dem   Studert, а разве приведенный мною код у Вас не раб...   Oct 17 2008, 16:23


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 10:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016