LevelX: проблема с большими всплесками времени выполнения для lx_nor_flash_defragment/partial_defragment, которые растут с каждым циклом выполнения

Я провожу простой тест, чтобы определить влияние на производительность двух операций дефрагментации в нашей системе, и заметил, что после определенного количества циклов выполнения выполнение любой функции дефрагментации начинает испытывать большие (и растущие) всплески времени выполнения. Кроме того, даже до возникновения всплесков время выполнения имеет тенденцию к увеличению.

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

Мы используем S25FL256SAIF00 (плотность 256 МБ, равномерные 256 секторов по 64 КБ) с библиотекой MPLAB Harmony v3 PLIB.

Есть идеи, есть ли проблема со знанием дела? или есть что-то, чего мне не хватает при настройке теста?

Пример увеличения времени выполнения

Мой код:

               //Number of obsolete sectors
         ULONG obsoleteSectors = nor_flash.lx_nor_flash_obsolete_physical_sectors;
         recordBuffer[recordNumber][sequenceNumber] = (uint32_t)obsoleteSectors;
         recordNumber++;

         //Initialize timer value
         executionStartTicks = (uint32_t) tx_time_get();

         //01 - Create a file called TEST.TXT in the root directory.
         startTicks = (uint32_t) tx_time_get();
         status =  fx_file_create(m_NV_DATA_p_mediaPtr, "TEST.TXT");
         endTicks = (uint32_t) tx_time_get();
         fileCreateTimeTicks = endTicks - startTicks;
         recordBuffer[recordNumber][sequenceNumber] = fileCreateTimeTicks;
         recordNumber++;
         if (status != FX_SUCCESS)
         {
             //Check for an already created status. This is expected on the second pass of this loop!
             if (status != FX_ALREADY_CREATED)
             {
                 break;
             }
         }

         //02 - Open the test file.
         startTicks = (uint32_t) tx_time_get();
         status =  fx_file_open(m_NV_DATA_p_mediaPtr, &my_file, "TEST.TXT", FX_OPEN_FOR_WRITE);
         endTicks = (uint32_t) tx_time_get();
         fileOpenTimeTicks = endTicks - startTicks;
         recordBuffer[recordNumber][sequenceNumber] = fileOpenTimeTicks;
         recordNumber++;
         if (status != FX_SUCCESS)
         {
             break;
         }

         //03 - Seek to the beginning of the test file.
         startTicks = (uint32_t) tx_time_get();
         status =  fx_file_seek(&my_file, 0);
         endTicks = (uint32_t) tx_time_get();
         fileWriteSeekTimeTicks = endTicks - startTicks;
         recordBuffer[recordNumber][sequenceNumber] = fileWriteSeekTimeTicks;
         recordNumber++;
         if (status != FX_SUCCESS)
         {
             break;
         }

         //04 - Write a string to the test file.
         startTicks = (uint32_t) tx_time_get();
         for( uint32_t data = 0; data < FILE_WRITE_SIZE_LONG_WORDS; data++ )
         {  
             status =  fx_file_write(&my_file, &data, sizeof( data ) );
                 if (status != FX_SUCCESS)
             {
                 break;
             }
         }
         endTicks = (uint32_t) tx_time_get();
         fileWriteTimeTicks = endTicks - startTicks;
         recordBuffer[recordNumber][sequenceNumber] = fileWriteTimeTicks;
         recordNumber++;
         if (status != FX_SUCCESS)
         {
             break;
         }

         //05 - Seek to the beginning of the test file.
         startTicks = (uint32_t) tx_time_get();
         status =  fx_file_seek(&my_file, 0);
         endTicks = (uint32_t) tx_time_get();
         fileReadSeekTimeTicks = endTicks - startTicks;
         recordBuffer[recordNumber][sequenceNumber] = fileReadSeekTimeTicks;
         recordNumber++;
         if (status != FX_SUCCESS)
             {
                 break;
             }

         //06 - Read the test file.
         startTicks = (uint32_t) tx_time_get();
         status =  fx_file_read(&my_file, local_buffer, FILE_WRITE_SIZE_BYTES, &actual);
         endTicks = (uint32_t) tx_time_get();
         fileReadTimeTicks = endTicks - startTicks;
         recordBuffer[recordNumber][sequenceNumber] = fileReadTimeTicks;
         recordNumber++;
         if ((status != FX_SUCCESS) || (actual != FILE_WRITE_SIZE_BYTES ))
         {
             break;
         }
            
         //07 - Check the contents
         for( uint32_t data = 0; data < FILE_WRITE_SIZE_LONG_WORDS; data++ )
         {
             if ( local_buffer[data] != data )
             {
                 //Error reading back file file, break the loop.
                 status = 1;
                 break;
             }
         }

         //08 - Close the test file.
         startTicks = (uint32_t) tx_time_get();
         status =  fx_file_close(&my_file);
         endTicks = (uint32_t) tx_time_get();
         fileCloseTimeTicks = endTicks - startTicks;
         recordBuffer[recordNumber][sequenceNumber] = fileCloseTimeTicks;
         recordNumber++;
         if (status != FX_SUCCESS)
         {
             break;
         }

         //09 - Delete the file
         startTicks = (uint32_t) tx_time_get();
         status =  fx_file_delete(m_NV_DATA_p_mediaPtr, "TEST.TXT");
         endTicks = (uint32_t) tx_time_get();
         fileDeleteTimeTicks = endTicks - startTicks;
         recordBuffer[recordNumber][sequenceNumber] = fileDeleteTimeTicks;
         recordNumber++;
         if (status != FX_SUCCESS)
         {
             break;
         }

         //10 - Defragment
         bool defragOn = true;
         startTicks = (uint32_t) tx_time_get();
         endTicks = (uint32_t) tx_time_get();
         //if( obsoleteSectors > 4500 && defragOn)
         //if( (runCount%defragTrigger) == 0 && defragOn)
         //if(defragCount%defragTrigger == 0)
         if( obsoleteSectors >= 128 && defragOn)
         {
             //status =  lx_nor_flash_defragment( &nor_flash );
             status = lx_nor_flash_partial_defragment(&nor_flash, 128);
             endTicks = (uint32_t) tx_time_get();
                
             //defragCount++;
             defragCount = 0;
             if(defragCount%1 == 0)
             {
                 defragTrigger=defragTrigger+1;
             }
         }
         defragCount++;

         levelxDefragmentTimeTicks = endTicks - startTicks;
         recordBuffer[recordNumber][sequenceNumber] = levelxDefragmentTimeTicks;
         recordNumber++;
         if (status != LX_SUCCESS)
         {
             break;
         }

         //11 - Total execution time
         executionEndTicks = (uint32_t) tx_time_get();
         executionTimeTicks = executionEndTicks - executionStartTicks;
         recordBuffer[recordNumber][sequenceNumber] = executionTimeTicks;
         recordNumber++;

1 ответ

Настройка выглядит хорошо. Мы проверим это наблюдение и скоро добавим обновление.

Другие вопросы по тегам