-=Space=- 0 7 июня, 2006 Опубликовано 7 июня, 2006 · Жалоба Вызывать из прерываний IAP конечно можно. Однако. я вот сечас думаю а чт опроизойдет после выполнения __enable_interrupt(); в функции flashWrite();? прерывания должны разрешиться, а значит возможны вложенные прерывания нет ли здесь какой заковырки? typedef void (*IAP)(unsigned long *,unsigned long *); IAP iap_entry =(IAP) IAP_LOCATION; исправьте на typedef void (__interwork *IAP)(unsigned long *,unsigned long *); IAP iap_entry =(IAP) IAP_LOCATION; а это точно нужно? у меня в general options IARа стоит generete interwork code + весь код у меня в режиме Trumb (тамже в general options - processor mode ) Хотя прерывание не исправляйте. Чё-то у Вас оно как-то неуклюже написано. И лучше не напрягаться, а то долго объяснять мне придётся что к чему. Почему-то нашёл только один вектор для таймера. всмысле Interrupt.cpp это один вектор на все прерывания - от уратов, таймеров, i2c -------------------------добавлено перенес функцию writeflash() из прерывания в main и пререстало ресетить что бы это занчило? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 7 июня, 2006 Опубликовано 7 июня, 2006 · Жалоба Вы угадали. Ваши прерывания написаны так, что не позволяют вложенности. А когда на выходе writeflash() вы их разрешаете, то рушится стек IRQ. Таки дела. Я предпочитаю писать __interwork чтобы не зависеть от опций компилятора. Но не хотите, как хотите. В Вашем случае это не обязательно. всмысле Interrupt.cpp это один вектор на все прерывания - от уратов, таймеров, i2c Я говорил про векторизованные обработчики. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 7 июня, 2006 Опубликовано 7 июня, 2006 · Жалоба Самый простой вариант - напишите так: __irq __arm __nested void IRQ_ISR_Handler (void) { ... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=Space=- 0 7 июня, 2006 Опубликовано 7 июня, 2006 · Жалоба а в чем всетаки неуклюжесть? это про эту функцию #pragma vector=0x18 __irq __arm void IRQ_ISR_Handler (void) { void (*interrupt_function)(); unsigned int vector; vector = VICVectAddr; // Get interrupt vector. interrupt_function = (void(*)())vector; (*interrupt_function)(); // Call vectored interrupt function. } можно было и так сделать org 0x18 LDR PC,[PC, #-0x0FF0] /* Vector from VicVectAddr */ А лучше ли это? кстати IRQ_ISR_Handler я не писал сам, скопипасил из какого то примера или еще где криво написан код? Да, еще, не разобрались с warningom Warning[w29]: part of segment EEPROM are initialized (as in module IAP), even thought it is type DATA (and thus not promable) пока он забит и вроде даже работает, но не красиво в проге варнинги иметь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 7 июня, 2006 Опубликовано 7 июня, 2006 · Жалоба а в чем всетаки неуклюжесть? Использование офигенного количества кода вместо ОДНОЙ едиственной команды выполняющей все, что надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 7 июня, 2006 Опубликовано 7 июня, 2006 · Жалоба Кривость именно в этих двух местах. Знаю, что это типичный пример в комплекте с компилером. Кривость - 1.медленность. 2.невозможность сделать несколько видов обработчиков, одни из которых будут допускать вложенность и работать на глобальном стеке, а другие не допускать вложенность и для максимума скорости работать на стеке IRQ. Я предпочитаю в startup'е ставить LDR PC,[PC, #-0x0FF0] и потом каждое прерывание "настраивать" на скорость или вложенность. Попробуйте в xcl-файле изменить это: -Z(DATA)EEPROM=EEPROMSTART-EEPROMEND на это: -Z(CODE)EEPROM=EEPROMSTART-EEPROMEND или на это: -Z(CONST)EEPROM=EEPROMSTART-EEPROMEND Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться