обработка строк hex менее 16 байт

исправлен баг с загрузкой hex файла, в котором не все Data-записи по 16 байт
This commit is contained in:
khristolyubov 2024-08-19 13:05:50 +07:00 committed by GitHub
parent 64825e628e
commit bb5a94e9ab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -182,7 +182,8 @@ void Bootloader_LoadArrayInRam(uint8_t uart_data[])
uint32_t abs_addr = 0; // адрес из хекса uint32_t abs_addr = 0; // адрес из хекса
uint32_t rel_addr = 0; // адрес от начала области spifi, по нему определяем, надо ли стирать сектор и какой именно uint32_t rel_addr = 0; // адрес от начала области spifi, по нему определяем, надо ли стирать сектор и какой именно
uint8_t page_data[256] = {0}; // сюда собираем распарсенные данные из хекса #define TAIL_SIZE 15 // если попадутся строки хекса, в которых не 16 байт, то мы рискуем записать данные уарта мимо буфера package_data. а если больше 16 байт, то это проблема завтрашнего дня
uint8_t page_data[MAX_PACKAGE_SIZE + TAIL_SIZE] = {0}; // сюда собираем распарсенные данные из хекса
uint16_t page_fill_size = 0; // счетчик, сколько заполнно в page_data. когда page_data заполнена до конца - будем записывать в spifi uint16_t page_fill_size = 0; // счетчик, сколько заполнно в page_data. когда page_data заполнена до конца - будем записывать в spifi
void go_to_spifi(); void go_to_spifi();
@ -195,12 +196,19 @@ void mem_write()
HAL_SPIFI_W25_SectorErase4K(&spifi, rel_addr); HAL_SPIFI_W25_SectorErase4K(&spifi, rel_addr);
// записываем страницу в 256 байт в spifi // записываем страницу в 256 байт в spifi
HAL_SPIFI_W25_PageProgram(&spifi, (uint32_t)hBootloader.address, 256, page_data); HAL_SPIFI_W25_PageProgram(&spifi, (uint32_t)hBootloader.address, MAX_PACKAGE_SIZE, page_data);
// увеличиваем адреса, по которым писать и стирать // увеличиваем адреса, по которым писать и стирать
hBootloader.address += 256; hBootloader.address += MAX_PACKAGE_SIZE;
// обнуляем буфер и счетчик заполнения буфера // обнуляем часть буфера, которая была записана в память и уменьшаем счетчик заполнения буфера на столько, сколько было записано
page_fill_size = 0; if (page_fill_size <= MAX_PACKAGE_SIZE)
memset(page_data, 0, 256); page_fill_size = 0;
else
page_fill_size -= MAX_PACKAGE_SIZE;
memset(&page_data[0], 0, MAX_PACKAGE_SIZE);
// хвост копируем в начало буфера, чтобы записать его в следующий раз
memcpy(&page_data[0], &page_data[MAX_PACKAGE_SIZE], TAIL_SIZE);
// а сам хвост обнуляем
memset(&page_data[MAX_PACKAGE_SIZE], 0, TAIL_SIZE);
} }
void Bootloader_parseHexAndLoadInMemory(uint8_t rx_data[]) void Bootloader_parseHexAndLoadInMemory(uint8_t rx_data[])
{ {
@ -223,7 +231,7 @@ void Bootloader_parseHexAndLoadInMemory(uint8_t rx_data[])
// указываем, на сколько заполнился буфер // указываем, на сколько заполнился буфер
page_fill_size += rx_data[BYTE_COUNT_POS]; page_fill_size += rx_data[BYTE_COUNT_POS];
// если пора записывать целую страницу - пишемм // если пора записывать целую страницу - пишемм
if (page_fill_size == 256) if (page_fill_size >= 256)
mem_write(); mem_write();
break; break;