Советую сделать так.
Строки в FLASH упаковывать в такую структуру:
Код
typedef struct PackedStr {
unsigned int length;
unsigned char tag;
char string[1];
} PackedStr;
Реально ваша строка (string[1]) будет занимать столько места, сколько надо (после конца структуры).
В памяти строки складывать в буфер достаточной длинны (что бы принять целиком строку) и длинны, кратной 8
Там же (в памяти) у вас будет 2 индекса в этом буфере:
- Индекс последнего занятого байта
- Индекс (в пределах первых 8ми байтов) хвоста от предыдущей записи
При приеме новой строки записываете ее в память, увеличивая длинну. После приема смотрите, если индекс занятого места больше 8 - записываете целое количество страниц, а незаписанный хвост переносите в начало буфера (корректируя указатели).
После приема всех данных записываете последний неполный блок (если он есть)
Чтение из FLASH аналогично: читаете в память и перемещаетесь по ней
Код
#define BUF_SIZE 1024
char buffer[BUF_SIZE];
PackedStr* get_next(PackedStr* str)
{
int len = sizeof(str)-1+str->length;
if (len&-sizeof(int)) len=(len&-sizeof(int))+sizeof(int); // Align for 'int' field
return (PackedStr*)(len+(char*)str);
}
PackedStr* start = (PackedStr*)buffer;
void write_string(char* your_string, char tag)
{
start->tag = tag;
start->length = strlen(your_string);
memcpy(start->string,your_string,start->length);
start = get_next(start);
int len = (char*)start - buffer;
if ( len >= PGM_SIZE_BYTE)
{
int page_aligned = len&-PGM_SIZE_BYTE;
WriteToFlash(buffer,page_aligned);
len &= PGM_SIZE_BYTE-1;
if (len) memcpy(buffer,buffer+page_aligned,len);
start = (PackedStr*)(buffer+len);
}
}
void final_flush()
{
if ((char*)start != buffer)
{
... pad buffer with 0 ...
WriteToFlash(buffer,PGM_SIZE_BYTE);
start = (PackedStr*)buffer;
}
}
Чтение напишите сами (по аналогии)