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

 
 
> Зависание LPC2138 IAR 4.5, после двукратной записи блока ОЗУ во флешь (IAP)
Micrick
сообщение Mar 26 2010, 12:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 24-03-10
Пользователь №: 56 178



Доброго всем времени суток!
После второго вызова в программе функции 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".
Для чего это?
Прикрепленный файл  screen_shot.doc ( 39.5 килобайт ) Кол-во скачиваний: 191

А собственно _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;//
}
//-------------------------------------------------------
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:45
Рейтинг@Mail.ru


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