реклама на сайте
подробности

 
 
> Запись структуры во флеш.
Jenya7
сообщение Nov 14 2016, 14:01
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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.

Я что то упускаю в логике?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Nov 14 2016, 15:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Что-то вроде.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 14 2016, 15:29
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 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 я писал любой размер и все были довольны и я и флеш.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 15 2016, 07:22
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Nov 14 2016, 18:29) *
. . . .
я вообще не понимаю что за клоунада такая. в STM32 и EFM32 я писал любой размер и все были довольны и я и флеш.


Не Вы первый ходите по этим граблям.
Такой метод записи сильно "компиляторо-прагма"-зависим.
Чтоб с этим не заморачиваться (раз и навсегда), почитайте за сериализацию.

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 15 2016, 10:11
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Nov 15 2016, 13:22) *
Не Вы первый ходите по этим граблям.
Такой метод записи сильно "компиляторо-прагма"-зависим.
Чтоб с этим не заморачиваться (раз и навсегда), почитайте за сериализацию.

сериализация очень широкое понятие. буду признателен если ткнете носом.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 15 2016, 11:21
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Nov 15 2016, 13:11) *
сериализация очень широкое понятие. буду признателен если ткнете носом.

ссылки, где это внятно расписано, под рукой нет.
Если в двух словах - преобразование различных данных (в том числе структур, классов и чегоугодно)
в последовательность байт (в нашем случае) для сохранения или передачи где-куда-либо.
С целю последующего однозначного восстановления, напр. при приеме из канала связи.
Одна из основных особенностей-достоинств - платформо и компиляторо-независимость.
Вы сохраняете структуру "оптом", по сути в виде образа из памяти.
При сериализации придется
- брать каждое поле структуры,
- определять его размер,
- преобразовывать его в последовательность байт (исходя из размера поля/типа данных),
- и затем их (поля) "цепочкой" записывать в флеш.

При этом на выравнивание можно не обращать внимание.
Единственный ньюанс - надо учитывать платформенный Big-Little Endian формат для чисел конкретного процессора.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 15 2016, 11:58
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Nov 15 2016, 17:21) *
ссылки, где это внятно расписано, под рукой нет.
Если в двух словах - преобразование различных данных (в том числе структур, классов и чегоугодно)
в последовательность байт (в нашем случае) для сохранения или передачи где-куда-либо.
С целю последующего однозначного восстановления, напр. при приеме из канала связи.
Одна из основных особенностей-достоинств - платформо и компиляторо-независимость.
Вы сохраняете структуру "оптом", по сути в виде образа из памяти.
При сериализации придется
- брать каждое поле структуры,
- определять его размер,
- преобразовывать его в последовательность байт (исходя из размера поля/типа данных),
- и затем их (поля) "цепочкой" записывать в флеш.

При этом на выравнивание можно не обращать внимание.
Единственный ньюанс - надо учитывать платформенный Big-Little Endian формат для чисел конкретного процессора.

(uint8_t *) &MyStruct - прекрасная сериализация только речь тут о другом . ребята из NXP говорят надо делать падинг буферу до размера кратного 8.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 15 2016, 13:43
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 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] ) - чревато боком, особенно когда
в качестве параметра передается указатель, по адресу которого вызываемая ф-ия должна записать данные.

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 15 2016, 14:09
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Nov 15 2016, 14:23
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Jenya7 @ Nov 15 2016, 21:09) *
пишется и читается правильно. но если писать кусками надо будет дополнять буфер до кратного 8.

Я для таких приколов делаю union массива байтов и структуры. Конечно приходится пересчитывать размер массива при изменении структуры, но удобно в пересылке или вот при таком выравнивании.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 15 2016, 14:35
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(HardEgor @ Nov 15 2016, 17:23) *
Я для таких приколов делаю union массива байтов и структуры. Конечно приходится пересчитывать размер массива при изменении структуры, но удобно в пересылке или вот при таком выравнивании.


А что, компилятор ругается на MyCharArray[ sizeof( TypeMyStuct ) ] ?
(если конечно с #pragma pack(1) не накручено)

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 15 2016, 15:10
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Nov 15 2016, 20:35) *
А что, компилятор ругается на MyCharArray[ sizeof( TypeMyStuct ) ] ?
(если конечно с #pragma pack(1) не накручено)

структура включает в себя указатель на строку переменной длины. Я не знаю ее конечный размер. Только в ран-тайм.

Go to the top of the page
 
+Quote Post
HardEgor
сообщение Nov 15 2016, 15:54
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Jenya7 @ Nov 15 2016, 22:10) *
структура включает в себя указатель на строку переменной длины. Я не знаю ее конечный размер. Только в ран-тайм.

Вы не правы. У вас получается структура отдельно, а строка отдельно. соответственно и сохранять надо и структуру и строку. А смысл?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 15 2016, 16:16
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 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 и записать во флеш.

Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 16 2016, 10:22
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 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;
}
Жесть wacko.gif А память под строку кто выделять будет?

Цитата
я понял. то есть мне нужно записать в два приема?
Я бы сказал в три приема (или даже в 4) - еще надо выделить память под строку, а потом ее вернуть обратно

То, как вы пытаетесь записать принятую от пользователя строку, крайне неэффективно и в текущем виде не работоспособно.

  1. Вам надо писать строки во флешь сразу при их поступлении, или можно с некоторой задержкой?
  2. Что еще кроме строк надо записать?
  3. Может ли в строках встречаться код 0?

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 16 2016, 12:49
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(XVR @ Nov 16 2016, 15:22) *
Жесть wacko.gif А память под строку кто выделять будет?

Я бы сказал в три приема (или даже в 4) - еще надо выделить память под строку, а потом ее вернуть обратно

То, как вы пытаетесь записать принятую от пользователя строку, крайне неэффективно и в текущем виде не работоспособно.

  1. Вам надо писать строки во флешь сразу при их поступлении, или можно с некоторой задержкой?
  2. Что еще кроме строк надо записать?
  3. Может ли в строках встречаться код 0?

надо записать:
1.стартовый маркер
2.длину строки
3.саму строку.
писать во флеш сразу по принятии строки? я думаю не критично хотя наверно правильней всего.
ломаю голову как выделить место под строку.
Кроме как динамическое выделение памяти я придумать не смог.
Код
char *test_str = malloc(sizeof(char) *  (strlen(str) + padding_size));

но мне это очень не нравиться.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 16 2016, 13:41
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Nov 16 2016, 16:49) *
. . . .
ломаю голову как выделить место под строку.
. . . .

Сколько в процессоре RAM ?
И какой тип флеш ?
(ответ требуется в формате исповеди)
---
Смысл выделять динамически, если памяти достаточно.
Размер стоки (максимальный) имеет какие-то приближенные к жизни размеры,
илиже ОНО бескоечно, аки Вселенная ?
sm.gif


Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 02:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01606 секунд с 7
ELECTRONIX ©2004-2016