|
|
  |
Запись структуры во флеш. |
|
|
|
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:06
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Jenya7 @ Nov 16 2016, 15:49)  Кроме как динамическое выделение памяти я придумать не смог. Код char *test_str = malloc(sizeof(char) * (strlen(str) + padding_size)); но мне это очень не нравиться. Мне, например, тоже. И в чем смысл динамического выделения, если строка - str - уже есть?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|