Перейти к содержанию
    

Вызывать из прерываний 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

и пререстало ресетить

что бы это занчило?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы угадали. Ваши прерывания написаны так, что не позволяют вложенности. А когда на выходе writeflash() вы их разрешаете, то рушится стек IRQ. Таки дела.

 

Я предпочитаю писать __interwork чтобы не зависеть от опций компилятора. Но не хотите, как хотите. В Вашем случае это не обязательно.

 

всмысле Interrupt.cpp

это один вектор на все прерывания - от уратов, таймеров, i2c

Я говорил про векторизованные обработчики.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самый простой вариант - напишите так:

__irq __arm __nested void IRQ_ISR_Handler (void)

{

...

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а в чем всетаки неуклюжесть?

 

это про эту функцию

#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)

 

пока он забит и вроде даже работает, но не красиво в проге варнинги иметь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а в чем всетаки неуклюжесть?

Использование офигенного количества кода вместо ОДНОЙ едиственной команды выполняющей

все, что надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кривость именно в этих двух местах. Знаю, что это типичный пример в комплекте с компилером. Кривость - 1.медленность. 2.невозможность сделать несколько видов обработчиков, одни из которых будут допускать вложенность и работать на глобальном стеке, а другие не допускать вложенность и для максимума скорости работать на стеке IRQ. Я предпочитаю в startup'е ставить LDR PC,[PC, #-0x0FF0] и потом каждое прерывание "настраивать" на скорость или вложенность.

 

Попробуйте в xcl-файле изменить это:

-Z(DATA)EEPROM=EEPROMSTART-EEPROMEND

на это:

-Z(CODE)EEPROM=EEPROMSTART-EEPROMEND

или на это:

-Z(CONST)EEPROM=EEPROMSTART-EEPROMEND

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...