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

|
Цитата(aaarrr @ Nov 14 2016, 21:27)  Что-то вроде. а где вставить прагму? так вроде не ругается Код #pragma pack(8) typedef struct TEST_S { unsigned char start; unsigned int length; char *text; }TEST; я вообще не понимаю что за клоунада такая. в STM32 и EFM32 я писал любой размер и все были довольны и я и флеш.
|
|
|
|
|
Nov 15 2016, 07:22
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Jenya7 @ Nov 14 2016, 18:29)  . . . . я вообще не понимаю что за клоунада такая. в STM32 и EFM32 я писал любой размер и все были довольны и я и флеш. Не Вы первый ходите по этим граблям. Такой метод записи сильно "компиляторо-прагма"-зависим. Чтоб с этим не заморачиваться (раз и навсегда), почитайте за сериализацию.
|
|
|
|
|
Nov 15 2016, 11:21
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Jenya7 @ Nov 15 2016, 13:11)  сериализация очень широкое понятие. буду признателен если ткнете носом. ссылки, где это внятно расписано, под рукой нет. Если в двух словах - преобразование различных данных (в том числе структур, классов и чегоугодно) в последовательность байт (в нашем случае) для сохранения или передачи где-куда-либо. С целю последующего однозначного восстановления, напр. при приеме из канала связи. Одна из основных особенностей-достоинств - платформо и компиляторо-независимость. Вы сохраняете структуру "оптом", по сути в виде образа из памяти. При сериализации придется - брать каждое поле структуры, - определять его размер, - преобразовывать его в последовательность байт (исходя из размера поля/типа данных), - и затем их (поля) "цепочкой" записывать в флеш. При этом на выравнивание можно не обращать внимание. Единственный ньюанс - надо учитывать платформенный Big-Little Endian формат для чисел конкретного процессора.
|
|
|
|
|
Nov 15 2016, 11:58
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(k155la3 @ Nov 15 2016, 17:21)  ссылки, где это внятно расписано, под рукой нет. Если в двух словах - преобразование различных данных (в том числе структур, классов и чегоугодно) в последовательность байт (в нашем случае) для сохранения или передачи где-куда-либо. С целю последующего однозначного восстановления, напр. при приеме из канала связи. Одна из основных особенностей-достоинств - платформо и компиляторо-независимость. Вы сохраняете структуру "оптом", по сути в виде образа из памяти. При сериализации придется - брать каждое поле структуры, - определять его размер, - преобразовывать его в последовательность байт (исходя из размера поля/типа данных), - и затем их (поля) "цепочкой" записывать в флеш.
При этом на выравнивание можно не обращать внимание. Единственный ньюанс - надо учитывать платформенный Big-Little Endian формат для чисел конкретного процессора. (uint8_t *) &MyStruct - прекрасная сериализация только речь тут о другом . ребята из NXP говорят надо делать падинг буферу до размера кратного 8.
|
|
|
|
|
Nov 15 2016, 13:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Jenya7 @ Nov 15 2016, 15:58)  (uint8_t *) &MyStruct - прекрасная сериализация только речь тут о другом . ребята из NXP говорят надо делать падинг буферу до размера кратного 8. Может и так. Вы вообще делали "гарантированное" чтение из флеш ее содержимого, в смысле, например, программатором ? Если нет, то ошибка может быть как на записи, так и на чтении инф. из нее. Причем даже не при работе процедуры RD/WR во флеш, а при "прокачке" в них данных. К примеру, если в параметре ф-ии указано fun( t_uint32 * ptr) то делать так fun( (t_uint32 *) &MyCharArr[0] ) - чревато боком, особенно когда в качестве параметра передается указатель, по адресу которого вызываемая ф-ия должна записать данные.
|
|
|
|
|
Nov 15 2016, 14:09
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(k155la3 @ Nov 15 2016, 19:43)  Может и так.
Вы вообще делали "гарантированное" чтение из флеш ее содержимого, в смысле, например, программатором ?
Если нет, то ошибка может быть как на записи, так и на чтении инф. из нее. Причем даже не при работе процедуры RD/WR во флеш, а при "прокачке" в них данных.
К примеру, если в параметре ф-ии указано fun( t_uint32 * ptr) то делать так fun( (t_uint32 *) &MyCharArr[0] ) - чревато боком, особенно когда в качестве параметра передается указатель, по адресу которого вызываемая ф-ия должна записать данные. скажем так Код status = FLASH_Init(); status = FLASH_PageErase(250); status = FLASH_PageProgram(250, 0, "hello", BUFFER_SIZE_BYTE); uint8_t buff[5]; #define FLASH_PARAM_ADDR (0x00000000U + (250 * 0x00001000U)) memcpy(&buff, (uint8_t*)FLASH_PARAM_ADDR, 5); пишется и читается правильно. но если писать кусками надо будет дополнять буфер до кратного 8.
|
|
|
|
|
Nov 15 2016, 16:16
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(HardEgor @ Nov 15 2016, 21:54)  Вы не правы. У вас получается структура отдельно, а строка отдельно. соответственно и сохранять надо и структуру и строку. А смысл? вот тут я кстати в раздумьях. я принимаю строки от пользователя по UART. Эти строки мне надо сохранить во флеш. поэтому я сделал структуру включающую строку, длину строки, начало пакета. Код typedef struct TEST_S { unsigned char start; unsigned int length; char *text; }TEST;
extern TEST tests[MAX_TESTS]; допустим я принял строку. Код void TESTER_AddTest(const char *test) { if (test_idx < MAX_TESTS) { memcpy (tests[test_idx].text, test, strlen(test)); test_idx++; } else test_idx = 0; } теперь мне надо вычислить общий размер дополнить до кратный 8 и записать во флеш.
|
|
|
|
|
Nov 16 2016, 10:22
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Jenya7 @ Nov 15 2016, 19:16)  допустим я принял строку. Код void TESTER_AddTest(const char *test) { if (test_idx < MAX_TESTS) { memcpy (tests[test_idx].text, test, strlen(test)); test_idx++; } else test_idx = 0; } Жесть  А память под строку кто выделять будет? Цитата я понял. то есть мне нужно записать в два приема? Я бы сказал в три приема (или даже в 4) - еще надо выделить память под строку, а потом ее вернуть обратно То, как вы пытаетесь записать принятую от пользователя строку, крайне неэффективно и в текущем виде не работоспособно. - Вам надо писать строки во флешь сразу при их поступлении, или можно с некоторой задержкой?
- Что еще кроме строк надо записать?
- Может ли в строках встречаться код 0?
|
|
|
|
|
Nov 16 2016, 12:49
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(XVR @ Nov 16 2016, 15:22)  Жесть  А память под строку кто выделять будет? Я бы сказал в три приема (или даже в 4) - еще надо выделить память под строку, а потом ее вернуть обратно То, как вы пытаетесь записать принятую от пользователя строку, крайне неэффективно и в текущем виде не работоспособно. - Вам надо писать строки во флешь сразу при их поступлении, или можно с некоторой задержкой?
- Что еще кроме строк надо записать?
- Может ли в строках встречаться код 0?
надо записать: 1.стартовый маркер 2.длину строки 3.саму строку. писать во флеш сразу по принятии строки? я думаю не критично хотя наверно правильней всего. ломаю голову как выделить место под строку. Кроме как динамическое выделение памяти я придумать не смог. Код char *test_str = malloc(sizeof(char) * (strlen(str) + padding_size)); но мне это очень не нравиться.
|
|
|
|
|
Nov 16 2016, 13:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Jenya7 @ Nov 16 2016, 16:49)  . . . . ломаю голову как выделить место под строку. . . . . Сколько в процессоре RAM ? И какой тип флеш ? (ответ требуется в формате исповеди) --- Смысл выделять динамически, если памяти достаточно. Размер стоки (максимальный) имеет какие-то приближенные к жизни размеры, илиже ОНО бескоечно, аки Вселенная ?
|
|
|
|
Сообщений в этой теме
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 Цитата(Jenya7 @ Nov 14 2016, 18:29) я воо... Nov 14 2016, 15:33   Jenya7 Цитата(aaarrr @ Nov 14 2016, 21:33) О, ск... Nov 14 2016, 15:35         Jenya7 Цитата(HardEgor @ Nov 15 2016, 20:23) Я д... Nov 15 2016, 14:26             aaarrr Цитата(Jenya7 @ Nov 15 2016, 19:16) ...я ... Nov 15 2016, 16:18              Jenya7 Цитата(aaarrr @ Nov 15 2016, 22:18) Эта с... Nov 15 2016, 16:32               aaarrr Цитата(Jenya7 @ Nov 16 2016, 15:49) Кроме... Nov 16 2016, 13:06                Jenya7 Цитата(aaarrr @ Nov 16 2016, 18:06) Мне, ... Nov 16 2016, 13:23                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 XVR Советую сделать так.
Строки в FLASH упаковывать в... Nov 16 2016, 13:26 HardEgor Цитата(XVR @ Nov 16 2016, 20:26) КодPacke... Nov 16 2016, 13:37  XVR Цитата(HardEgor @ Nov 16 2016, 16:37) А п... Nov 16 2016, 19:47   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
|
|
|