После второго вызова в программе функции TIap::Write()
(из функции TIap::Store() ) процессор вешается

Код
#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()
//------------------------------------------------------
#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, если
я все правильно понял. Но почему так?!!

Код
//-----------------------------------------------------------------------
#pragma vector= IRQV
__irq __arm void IRQV_Handler( void )
{
void ( *interrupt_function )();
dword vector;
//====
vector = VICVectAddr;//
interrupt_function = ( void(*)() )vector;
( *interrupt_function )();
//====
VICVectAddr= 0;//
}
//-------------------------------------------------------
#pragma vector= IRQV
__irq __arm void IRQV_Handler( void )
{
void ( *interrupt_function )();
dword vector;
//====
vector = VICVectAddr;//
interrupt_function = ( void(*)() )vector;
( *interrupt_function )();
//====
VICVectAddr= 0;//
}
//-------------------------------------------------------