mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-03-03 04:03:59 -04:00
AP_Logger: ensure that we don't read the same block more than once, dramatically increasing performance.
This commit is contained in:
parent
c6b2ab427f
commit
cfdf6306ef
@ -183,13 +183,12 @@ bool AP_Logger_Block::_WritePrioritisedBlock(const void *pBuffer, uint16_t size,
|
|||||||
// read from the page address and return the file number at that location
|
// read from the page address and return the file number at that location
|
||||||
uint16_t AP_Logger_Block::StartRead(uint32_t PageAdr)
|
uint16_t AP_Logger_Block::StartRead(uint32_t PageAdr)
|
||||||
{
|
{
|
||||||
df_Read_PageAdr = PageAdr;
|
|
||||||
|
|
||||||
// copy flash page to buffer
|
// copy flash page to buffer
|
||||||
if (erase_started) {
|
if (erase_started) {
|
||||||
|
df_Read_PageAdr = PageAdr;
|
||||||
memset(buffer, 0xff, df_PageSize);
|
memset(buffer, 0xff, df_PageSize);
|
||||||
} else {
|
} else {
|
||||||
PageToBuffer(df_Read_PageAdr);
|
PageToBuffer(PageAdr);
|
||||||
}
|
}
|
||||||
return ReadHeaders();
|
return ReadHeaders();
|
||||||
}
|
}
|
||||||
@ -239,14 +238,15 @@ bool AP_Logger_Block::ReadBlock(void *pBuffer, uint16_t size)
|
|||||||
df_Read_BufferIdx += n;
|
df_Read_BufferIdx += n;
|
||||||
|
|
||||||
if (df_Read_BufferIdx == df_PageSize) {
|
if (df_Read_BufferIdx == df_PageSize) {
|
||||||
df_Read_PageAdr++;
|
uint32_t new_page_addr = df_Read_PageAdr + 1;
|
||||||
if (df_Read_PageAdr > df_NumPages) {
|
if (new_page_addr > df_NumPages) {
|
||||||
df_Read_PageAdr = 1;
|
new_page_addr = 1;
|
||||||
}
|
}
|
||||||
if (erase_started) {
|
if (erase_started) {
|
||||||
memset(buffer, 0xff, df_PageSize);
|
memset(buffer, 0xff, df_PageSize);
|
||||||
|
df_Read_PageAdr = new_page_addr;
|
||||||
} else {
|
} else {
|
||||||
PageToBuffer(df_Read_PageAdr);
|
PageToBuffer(new_page_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We are starting a new page - read FileNumber and FilePage
|
// We are starting a new page - read FileNumber and FilePage
|
||||||
|
@ -62,6 +62,7 @@ protected:
|
|||||||
|
|
||||||
uint8_t *buffer;
|
uint8_t *buffer;
|
||||||
uint32_t last_messagewrite_message_sent;
|
uint32_t last_messagewrite_message_sent;
|
||||||
|
uint32_t df_Read_PageAdr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*
|
/*
|
||||||
@ -95,8 +96,7 @@ private:
|
|||||||
|
|
||||||
// state variables
|
// state variables
|
||||||
uint16_t df_Read_BufferIdx;
|
uint16_t df_Read_BufferIdx;
|
||||||
uint32_t df_PageAdr;
|
uint32_t df_PageAdr; // current page address for writes
|
||||||
uint32_t df_Read_PageAdr;
|
|
||||||
// file numbers
|
// file numbers
|
||||||
uint16_t df_FileNumber;
|
uint16_t df_FileNumber;
|
||||||
uint16_t df_Write_FileNumber;
|
uint16_t df_Write_FileNumber;
|
||||||
|
@ -219,8 +219,17 @@ void AP_Logger_DataFlash::PageToBuffer(uint32_t pageNum)
|
|||||||
if (pageNum == 0 || pageNum > df_NumPages+1) {
|
if (pageNum == 0 || pageNum > df_NumPages+1) {
|
||||||
printf("Invalid page read %u\n", pageNum);
|
printf("Invalid page read %u\n", pageNum);
|
||||||
memset(buffer, 0xFF, df_PageSize);
|
memset(buffer, 0xFF, df_PageSize);
|
||||||
|
df_Read_PageAdr = pageNum;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// we already just read this page
|
||||||
|
if (pageNum == df_Read_PageAdr && read_cache_valid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
df_Read_PageAdr = pageNum;
|
||||||
|
|
||||||
WaitReady();
|
WaitReady();
|
||||||
|
|
||||||
uint32_t PageAdr = (pageNum-1) * df_PageSize;
|
uint32_t PageAdr = (pageNum-1) * df_PageSize;
|
||||||
@ -230,6 +239,8 @@ void AP_Logger_DataFlash::PageToBuffer(uint32_t pageNum)
|
|||||||
send_command_addr(JEDEC_READ_DATA, PageAdr);
|
send_command_addr(JEDEC_READ_DATA, PageAdr);
|
||||||
dev->transfer(nullptr, 0, buffer, df_PageSize);
|
dev->transfer(nullptr, 0, buffer, df_PageSize);
|
||||||
dev->set_chip_select(false);
|
dev->set_chip_select(false);
|
||||||
|
|
||||||
|
read_cache_valid = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_Logger_DataFlash::BufferToPage(uint32_t pageNum)
|
void AP_Logger_DataFlash::BufferToPage(uint32_t pageNum)
|
||||||
@ -238,6 +249,12 @@ void AP_Logger_DataFlash::BufferToPage(uint32_t pageNum)
|
|||||||
printf("Invalid page write %u\n", pageNum);
|
printf("Invalid page write %u\n", pageNum);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// about to write the cached page
|
||||||
|
if (pageNum != df_Read_PageAdr) {
|
||||||
|
read_cache_valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
WriteEnable();
|
WriteEnable();
|
||||||
|
|
||||||
WITH_SEMAPHORE(dev_sem);
|
WITH_SEMAPHORE(dev_sem);
|
||||||
|
@ -43,6 +43,7 @@ private:
|
|||||||
uint32_t erase_start_ms;
|
uint32_t erase_start_ms;
|
||||||
uint8_t erase_cmd;
|
uint8_t erase_cmd;
|
||||||
bool use_32bit_address;
|
bool use_32bit_address;
|
||||||
|
bool read_cache_valid;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // HAL_LOGGING_DATAFLASH_ENABLED
|
#endif // HAL_LOGGING_DATAFLASH_ENABLED
|
||||||
|
@ -198,9 +198,17 @@ void AP_Logger_W25N01GV::PageToBuffer(uint32_t pageNum)
|
|||||||
if (pageNum == 0 || pageNum > df_NumPages+1) {
|
if (pageNum == 0 || pageNum > df_NumPages+1) {
|
||||||
printf("Invalid page read %u\n", pageNum);
|
printf("Invalid page read %u\n", pageNum);
|
||||||
memset(buffer, 0xFF, df_PageSize);
|
memset(buffer, 0xFF, df_PageSize);
|
||||||
|
df_Read_PageAdr = pageNum;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// we already just read this page
|
||||||
|
if (pageNum == df_Read_PageAdr && read_cache_valid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
df_Read_PageAdr = pageNum;
|
||||||
|
|
||||||
WaitReady();
|
WaitReady();
|
||||||
|
|
||||||
uint32_t PageAdr = (pageNum-1);
|
uint32_t PageAdr = (pageNum-1);
|
||||||
@ -224,6 +232,8 @@ void AP_Logger_W25N01GV::PageToBuffer(uint32_t pageNum)
|
|||||||
dev->transfer(cmd, 4, nullptr, 0);
|
dev->transfer(cmd, 4, nullptr, 0);
|
||||||
dev->transfer(nullptr, 0, buffer, df_PageSize);
|
dev->transfer(nullptr, 0, buffer, df_PageSize);
|
||||||
dev->set_chip_select(false);
|
dev->set_chip_select(false);
|
||||||
|
|
||||||
|
read_cache_valid = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -234,6 +244,11 @@ void AP_Logger_W25N01GV::BufferToPage(uint32_t pageNum)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// just wrote the cached page
|
||||||
|
if (pageNum != df_Read_PageAdr) {
|
||||||
|
read_cache_valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
WriteEnable();
|
WriteEnable();
|
||||||
|
|
||||||
uint32_t PageAdr = (pageNum-1);
|
uint32_t PageAdr = (pageNum-1);
|
||||||
|
@ -42,6 +42,7 @@ private:
|
|||||||
bool flash_died;
|
bool flash_died;
|
||||||
uint32_t erase_start_ms;
|
uint32_t erase_start_ms;
|
||||||
uint16_t erase_block;
|
uint16_t erase_block;
|
||||||
|
bool read_cache_valid;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // HAL_LOGGING_DATAFLASH_ENABLED
|
#endif // HAL_LOGGING_DATAFLASH_ENABLED
|
||||||
|
Loading…
Reference in New Issue
Block a user