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

 
 
> Запись структуры во флеш.
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
Ответов
XVR
сообщение Nov 16 2016, 13:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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 индекса в этом буфере:
  1. Индекс последнего занятого байта
  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;
  }
}

Чтение напишите сами (по аналогии)
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Nov 16 2016, 13:37
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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 и сложение.
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 16 2016, 19:47
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(HardEgor @ Nov 16 2016, 16:37) *
А почему-бы при выравнивании, длину не вычислить напрямую:
len = (str->length/8+1)*8
Эта формула увеличит длинну на 8 даже если она уже была выровнена на 8, а этого делать не стоит rolleyes.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
|- - 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


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

 


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


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