Вложений: 1
Оптимизация загрузки прошивки
Всех с НГ!
Посмотрите на код загрузки прошивки в ПЛИС:
Код:
if( nSTATUS() == Bit_RESET )
{
__TRACE( "FPGA configuration status OK...\n" );
for( dword pos = 0; pos < fpgaConfig.fsize; pos++ )
{
byte data8;
UINT res;
if( f_read( &fpgaConfig, &data8, 1, &res ) != FR_OK ) break;
if( res == 0 ) break;
for( byte j = 0; j < 8; j++ )
{
DCLK( Bit_RESET );
DATA( ( data8 & 0x01 ) == 0 ? Bit_RESET : Bit_SET );
data8 >>= 1;
DCLK( Bit_SET );
}
if( ( pos & 0xfff ) == 0 )
{
WDT_Kick();
__TRACE( "." );
}
}
}
В строке f_read читает по 1 байту, что очень медленно.
Вот моя процедура из другого проекта (основанная на коде syd), на АРМе из той же серии:
Код:
if( nSTATUS() )
{
printf( "FPGA configuration status OK.\n\r" );
printf( "Loading" );
// Loading configuration in PS mode
BYTE CurData, j, i;
UINT Read2Buf;
DWORD Cnt = 0;
while ( f_read ( &fpgaConfig, &Buffer, BufLen, &Read2Buf ) == FR_OK )
{
if ( Read2Buf == 0 ) break;
for ( i = 0; i < Read2Buf; i++ )
{
CurData = Buffer[i];
for ( j = 8; j > 0; j-- )
{
// DCLK_LOW;
if ( CurData & 1 )
{
*PtrD1 = ( *PtrD1 & ~GPIO_Pin_6 ) | GPIO_Pin_7;
// DATA_HIGH;
}
else
{
*PtrD1 &= ~GPIO_Pin_6 & ~GPIO_Pin_7;
// DATA_LOW;
}
CurData >>= 1;
DCLK_HIGH;
}
}
if ( ( (Cnt++) & 0x3FF ) == 0 ) printf(".");
}
}
Как видно из кода, читается сразу BufLen=4К (что, конечно, излишне). Так вот, если в АРМе есть еще свободное встроенное ОЗУ, то можно увеличить буфер до 32, скажем, байт. У меня скорость заливки удвоилась по сравнению с неоптимизированным вариантом. Так что желающие могут попробовать проверить.