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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Вопрос по АРМ LPC
-=Space=-
сообщение Jun 7 2006, 11:34
Сообщение #31


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

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



Цитата(GetSmart @ Jun 7 2006, 15:23) *
Вызывать из прерываний IAP конечно можно. Однако.

я вот сечас думаю а чт опроизойдет после выполнения __enable_interrupt(); в функции flashWrite();?
прерывания должны разрешиться, а значит возможны вложенные прерывания
нет ли здесь какой заковырки?

Цитата(GetSmart @ Jun 7 2006, 15:23) *
Цитата
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 )

Цитата(GetSmart @ Jun 7 2006, 15:23) *
Хотя прерывание не исправляйте. Чё-то у Вас оно как-то неуклюже написано. И лучше не напрягаться, а то долго объяснять мне придётся что к чему.
Почему-то нашёл только один вектор для таймера.

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


-------------------------добавлено

перенес функцию writeflash() из прерывания в main
и пререстало ресетить
что бы это занчило?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 7 2006, 12:00
Сообщение #32


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

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

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

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 7 2006, 12:18
Сообщение #33


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Самый простой вариант - напишите так:
__irq __arm __nested void IRQ_ISR_Handler (void)
{
...
}


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
-=Space=-
сообщение Jun 7 2006, 13:18
Сообщение #34


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

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



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

это про эту функцию
#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)

пока он забит и вроде даже работает, но не красиво в проге варнинги иметь
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 7 2006, 13:28
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(-=Space=- @ Jun 7 2006, 16:18) *
а в чем всетаки неуклюжесть?

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 7 2006, 13:51
Сообщение #36


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

Попробуйте в xcl-файле изменить это:
-Z(DATA)EEPROM=EEPROMSTART-EEPROMEND
на это:
-Z(CODE)EEPROM=EEPROMSTART-EEPROMEND
или на это:
-Z(CONST)EEPROM=EEPROMSTART-EEPROMEND


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 08:50
Рейтинг@Mail.ru


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