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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Запись структуры во флеш.
k155la3
сообщение Nov 15 2016, 13:43
Сообщение #16


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

Группа: Свой
Сообщений: 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
Сообщение #17


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

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


Гуру
******

Группа: Свой
Сообщений: 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
Jenya7
сообщение Nov 15 2016, 14:26
Сообщение #19


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

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



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

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


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

Группа: Свой
Сообщений: 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
Сообщение #21


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

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


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #23


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

Группа: Участник
Сообщений: 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
aaarrr
сообщение Nov 15 2016, 16:18
Сообщение #24


Гуру
******

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



Цитата(Jenya7 @ Nov 15 2016, 19:16) *
...я сделал структуру включающую строку

Эта структура НЕ включает строку. И размер её никоим образом не меняется.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 15 2016, 16:32
Сообщение #25


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

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



Цитата(aaarrr @ Nov 15 2016, 22:18) *
Эта структура НЕ включает строку. И размер её никоим образом не меняется.

я понял. то есть мне нужно записать в два приема? сначала члены структуры потом строку?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 15 2016, 17:05
Сообщение #26


Гуру
******

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



Совершенно верно, в два приема.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Nov 15 2016, 19:21
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Коллеги, прекратите использовать этот "ньюанс"
Либо уберите лишнюю букву, либо добавьте недостающую
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 16 2016, 10:22
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #29


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

Группа: Участник
Сообщений: 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
aaarrr
сообщение Nov 16 2016, 13:06
Сообщение #30


Гуру
******

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



Цитата(Jenya7 @ Nov 16 2016, 15:49) *
Кроме как динамическое выделение памяти я придумать не смог.
Код
char *test_str = malloc(sizeof(char) *  (strlen(str) + padding_size));

но мне это очень не нравиться.

Мне, например, тоже. И в чем смысл динамического выделения, если строка - str - уже есть?
Go to the top of the page
 
+Quote Post

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

 


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


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