|
Запись структуры во флеш. |
|
|
|
Nov 14 2016, 14:01
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Есть структура. Код typedef struct TEST_S { unsigned char start; unsigned int length; char *text; }TEST;
extern TEST tests[MAX_TESTS]; я инициализирую структуру и пытаюсь записать. Код unsigned int TESTER_SaveTest(unsigned int user_page) { unsigned int ret; unsigned int addr; tests[0].start = 0xDA; tests[0].length = 5; tests[0].text = "HELLO"; tests[1].start = 0xDA; tests[1].length = 6; tests[1].text = "WORLD!"; ret = FLASH_PageErase(user_page); if (ret) return ret; addr = 0; ret = FLASH_PageProgram(user_page, addr, (uint8_t *) &tests[0], BUFFER_SIZE_BYTE); if (ret) return ret; addr += (sizeof(tests[0])) + 1; ret = FLASH_PageProgram(user_page, addr, (uint8_t *) &tests[1], BUFFER_SIZE_BYTE); //тут я получаю ошибку - 32. if (ret) return ret; return ret; } Первая запись проходит нормально. Вторая со смещением 13 выдает ошибку 32 - Access error is set in the FSTAT register. Я что то упускаю в логике?
|
|
|
|
|
 |
Ответов
|
Nov 16 2016, 13:26
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Советую сделать так. Строки в 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; } } Чтение напишите сами (по аналогии)
|
|
|
|
|
Nov 16 2016, 13:37
|
Гуру
     
Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925

|
Цитата(XVR @ Nov 16 2016, 20:26)  Код 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); } А почему-бы при выравнивании, длину не вычислить напрямую: len = (str->length/8+1)*8 два сдвига на 8 и сложение.
|
|
|
|
Сообщений в этой теме
Jenya7 Запись структуры во флеш. Nov 14 2016, 14:01 aaarrr Цитата(Jenya7 @ Nov 14 2016, 17:01) Я что... Nov 14 2016, 14:26 Jenya7 Цитата(aaarrr @ Nov 14 2016, 20:26) Для с... Nov 14 2016, 14:43  aaarrr Цитата(Jenya7 @ Nov 14 2016, 17:43) Они в... Nov 14 2016, 15:03   Jenya7 Цитата(aaarrr @ Nov 14 2016, 21:03) Может... Nov 14 2016, 15:25 aaarrr Что-то вроде. Nov 14 2016, 15:27 Jenya7 Цитата(aaarrr @ Nov 14 2016, 21:27) Что-т... Nov 14 2016, 15:29  aaarrr Цитата(Jenya7 @ Nov 14 2016, 18:29) я воо... Nov 14 2016, 15:33   Jenya7 Цитата(aaarrr @ Nov 14 2016, 21:33) О, ск... Nov 14 2016, 15:35  k155la3 Цитата(Jenya7 @ Nov 14 2016, 18:29) . . .... Nov 15 2016, 07:22   Jenya7 Цитата(k155la3 @ Nov 15 2016, 13:22) Не В... Nov 15 2016, 10:11    k155la3 Цитата(Jenya7 @ Nov 15 2016, 13:11) сериа... Nov 15 2016, 11:21     Jenya7 Цитата(k155la3 @ Nov 15 2016, 17:21) ссыл... Nov 15 2016, 11:58      k155la3 Цитата(Jenya7 @ Nov 15 2016, 15:58) (uint... Nov 15 2016, 13:43       Jenya7 Цитата(k155la3 @ Nov 15 2016, 19:43) Може... Nov 15 2016, 14:09        HardEgor Цитата(Jenya7 @ Nov 15 2016, 21:09) пишет... Nov 15 2016, 14:23         Jenya7 Цитата(HardEgor @ Nov 15 2016, 20:23) Я д... Nov 15 2016, 14:26         k155la3 Цитата(HardEgor @ Nov 15 2016, 17:23) Я д... Nov 15 2016, 14:35          Jenya7 Цитата(k155la3 @ Nov 15 2016, 20:35) А чт... Nov 15 2016, 15:10           HardEgor Цитата(Jenya7 @ Nov 15 2016, 22:10) струк... Nov 15 2016, 15:54            Jenya7 Цитата(HardEgor @ Nov 15 2016, 21:54) Вы ... Nov 15 2016, 16:16             aaarrr Цитата(Jenya7 @ Nov 15 2016, 19:16) ...я ... Nov 15 2016, 16:18              Jenya7 Цитата(aaarrr @ Nov 15 2016, 22:18) Эта с... Nov 15 2016, 16:32             XVR Цитата(Jenya7 @ Nov 15 2016, 19:16) допус... Nov 16 2016, 10:22              Jenya7 Цитата(XVR @ Nov 16 2016, 15:22) Жесть ... Nov 16 2016, 12:49               aaarrr Цитата(Jenya7 @ Nov 16 2016, 15:49) Кроме... Nov 16 2016, 13:06                Jenya7 Цитата(aaarrr @ Nov 16 2016, 18:06) Мне, ... Nov 16 2016, 13:23               k155la3 Цитата(Jenya7 @ Nov 16 2016, 16:49) . . .... Nov 16 2016, 13:41                Jenya7 Цитата(k155la3 @ Nov 16 2016, 18:41) Скол... Nov 16 2016, 13:50 Alex11 Цитатачтобы получить реальную длину я должен приба... Nov 14 2016, 17:45 Jenya7 Цитата(Alex11 @ Nov 14 2016, 23:45) Какой... Nov 15 2016, 06:40 aaarrr Совершенно верно, в два приема. Nov 15 2016, 17:05 toweroff Коллеги, прекратите использовать этот "ньюанс... Nov 15 2016, 19:21   ViKo Цитата(XVR @ Nov 16 2016, 22:47) Эта форм... Nov 16 2016, 20:02 Jenya7 это интересно. надо попробовать. char buffer[BUF_... Nov 16 2016, 13:36 Jenya7 Тестирую запись.
Создал структуру.
Кодtypedef stru... Nov 17 2016, 08:14
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|