|
Работа с прерываниями в WinAVR, Глобальные переменные в main и прерываниях |
|
|
|
 |
Ответов
|
Oct 17 2008, 11:33
|
Знающий
   
Группа: Участник
Сообщений: 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. Анатолий.
|
|
|
|
|
Oct 17 2008, 12:04
|
Группа: Новичок
Сообщений: 11
Регистрация: 17-10-08
Пользователь №: 41 018

|
Цитата(aesok @ Oct 17 2008, 14:33)  Нельзя разрешать прерывания перед выходом из прерывания, они сами разрештся при выполнении инструкции RETI. Можно конечно. Не запрещено.
|
|
|
|
|
Oct 17 2008, 17:20
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Kernigan @ Oct 17 2008, 16:04)  Цитата Нельзя разрешать прерывания перед выходом из прерывания, они сами разрештся при выполнении инструкции RETI Можно конечно. Не запрещено. 1. Лишняя инструкция SEI, прерывания все равно будут разрешенны при выполнении инструкции RETI. 2. При разрешении прерывани до возвращения из обработчика создаються условия что следующиу обработчик(и) вызовутся когда в стеке еще находиться адрес возврата и возможно локальные переменные текущего обработчика, что приводит к повышенному и неэффективному использованию опреративной памяти. 3. Специфично для GCC. Если функции нужно место в стеке, то нужно модифицировать регистр указателя стека. Пролог и эпилог обработчика прерывиня генерируеться из предположения что прерывания отключены и в них не выполняеться временное отключение прерываний при модификации указателя стека. Разрешая прерывания до эпилога возникают условия что обработчик прерывания может быть вызван когда указатель стека модифицирован только частично (старший байт уже изменен младший еще нет), что может привести к критическим последствиям. Анатолй.
|
|
|
|
|
Oct 17 2008, 18:51
|

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

|
Цитата(aesok @ Oct 17 2008, 21:20)  Пролог и эпилог обработчика прерывиня генерируеться из предположения что прерывания отключены и в них не выполняеться временное отключение прерываний при модификации указателя стека. На мой взляд такое предположение не совсем удачно. Компилятор ничего не должен предполагать - это прерогатива программиста. Иногда просто необходимо разрешать прерывания внутри обработчика прерывания. Выход видится такой: Код intX: прогол op1 op2 sei op3 .... op333 cli эпилог reti Может есть другие, более изящные варианты? Где в документации можно прочесть об этом нюансе?
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
Сообщений в этой теме
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    aesok Цитата(demiurg_spb @ Oct 17 2008, 22:51) ... Oct 17 2008, 19:14    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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|