Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Зависание LPC2138 IAR 4.5
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Micrick
Доброго всем времени суток!
После второго вызова в программе функции TIap::Write()
(из функции TIap::Store() ) процессор вешается sad.gif
Код
#define IAP_LOCATION 0x7ffffff1
#define IAP_CCLK     55296 // М= 5,  М * 11,0592
//====
typedef void ( *IAP ) ( dword [], dword [] );
//======================
#define SECTOR                 7
#define FLASH_ADDRESS    0x00007000//
#define MAX_BLOCK           16//
//====
#define SIZE                      64
//====
#define TO_WRITE   50
#define COPY_RAM  51
#define ERASE         52
//------------------------------------------------------
#pragma data_alignment= 4//
__no_init SBuffer TIap::factor;//
//----------
IAP iap_entry;
dword command[5];
dword result[2];
//------------------------------------------------------
TIap::TIap( void  )
{
iap_entry= ( IAP ) IAP_LOCATION;
block= 0;
.......................
.......................
}//end of TIap::TIap( void  )
//------------------------------------------------------
void TIap::Store ( void )
{
RefreshCrc();
TCritBlock cb;

if ( !NextFreeBlock( block ) )
{
  ToWrite();
  Erase();
};

ToWrite();
Write();
}//end of Store()
//------------------------------------------------------
void TIap::ToWrite( void  )
{
command[0]= TO_WRITE;
command[1]= SECTOR;
command[2]= SECTOR;
//====
iap_entry ( command, result );
//=============================
}//end of ToWrite()
//------------------------------------------------------
void TIap::Write( void  )
{
//=============================
command[0]= COPY_RAM;
command[1]= FLASH_ADDRESS + block * 4 * SIZE;
command[2]= dword ( &factor );
command[3]= 4 * SIZE;// =256
command[4]= IAP_CCLK;
//====
iap_entry ( command, result );
//=============================

}//end of Write()
//------------------------------------------------------
void TIap::Erase( void  )
{
//=============================
command[0]= ERASE;
command[1]= SECTOR;
command[2]= SECTOR;
command[3]= IAP_CCLK;
//====
iap_entry ( command, result );
//=============================
}//end of Erase()
//------------------------------------------------------

При зависании в окне стека есть строка "__record_needed_destruction".
Для чего это?
Нажмите для просмотра прикрепленного файла
А собственно _exit вызывается сбросом прерывания в VIC, если
я все правильно понял. Но почему так?!! wacko.gif
Код
//-----------------------------------------------------------------------
#pragma vector= IRQV
__irq __arm void IRQV_Handler( void )
{
void ( *interrupt_function )();
dword vector;
//====
vector = VICVectAddr;//
interrupt_function = ( void(*)() )vector;
( *interrupt_function )();  
//====
VICVectAddr= 0;//
}
//-------------------------------------------------------
Сергей Борщ
Смотрю в свои исходники: перед записью IAP вызывается с командой PREPARE (50). У вас такого не вижу. Также не вижу запрета прерываний на время работы IAP. Вероятно отсюда и проблема.

Второго вопроса не понял.
Ваш листинг показывает:
R0 = ~0xCF => R0 = 0xFFFFFF7F
R0 = R0 & FFFFF0FF => R = FFFFF07F

P.S. прикладывать картинки внутри вордовского документа - это пять. Такого на этом форуме еще не видел. Трудно было сохранить 3 картинки в jpg и присоединить к сообщению?
Micrick
Цитата(Сергей Борщ @ Mar 26 2010, 16:02) *
Смотрю в свои исходники: перед записью IAP вызывается с командой PREPARE (50). У вас такого не вижу.

Да, функция Write() предваряется функцией ToWrite() , в которой и реализована команда 50 (см. Store() )
Цитата
Также не вижу запрета прерываний на время работы IAP. Вероятно отсюда и проблема.

В блоке функции Store() заводится объект TCritBlock cb;
Сорри, сразу не указал:
Код
class TCritBlock
{
//================================
public:
  TCritBlock( void  ) { __disable_interrupt(); }
//====================
~TCritBlock( void ){ __enable_interrupt(); }
//==============================
};//end of class TCritBlock

Пошагово смотрел- запреты и разрешения реализуются
Цитата
Второго вопроса не понял.
Ваш листинг показывает:
R0 = ~0xCF => R0 = 0xFFFFFF7F
R0 = R0 & FFFFF0FF => R = FFFFF07F

Имел ввиду, что перед выпаданием в abort происходит сброс прерывания в VIC, если правильно понял.
Или ошибаюсь?
Цитата
P.S. прикладывать картинки внутри вордовского документа - это пять. Такого на этом форуме еще не видел. Трудно было сохранить 3 картинки в jpg и присоединить к сообщению?

Учту, конечно.
Micrick
Думал, что IAP во всем виноват, а оказалось, сам программист 01.gif
Область записи во флешь "влезла" в область данных-констант. Надо было лучше ---.xcl файл смотреть sad.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.