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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Чтение строк из флэш.
Jenya7
сообщение Nov 6 2016, 08:31
Сообщение #1


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

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



Мне пользователь посылает строки по терминалу. Я сохраняю их во флэше. При перезагрузке контроллера мне надо вытащить их. Но как я знаю откуда их тащить? начальный адрес я конечно знаю. но строки разной длины. как мне узнать где начало / конец строки?
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Nov 6 2016, 08:37
Сообщение #2


Гуру
******

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



CR+LF(0x0D+0x0A)?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 6 2016, 08:48
Сообщение #3


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

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



Цитата(HardEgor @ Nov 6 2016, 14:37) *
CR+LF(0x0D+0x0A)?

я не уверен что конец строки указывает на начало следующей. в этом случае мне нужно сохранять строки строго одна после другой.
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Nov 6 2016, 09:40
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



А как же иначе ? А если предполагается, что там еще могут быть какие-то данные между строками, то перед строкой сохранять еще и смещение до следующей (т.е. длину строки и что там еще может лежать).
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 6 2016, 10:00
Сообщение #5


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

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



Цитата(rx3apf @ Nov 6 2016, 15:40) *
А как же иначе ? А если предполагается, что там еще могут быть какие-то данные между строками, то перед строкой сохранять еще и смещение до следующей (т.е. длину строки и что там еще может лежать).

а если так.
принял строку
Код
typedef struct TESTS_S
{
    char *text;
}TESTS;

TESTS tests[MAX_TESTS];
unsigned char test_idx = 0;

void TESTER_AddTest(const char *test)
{
    if (test_idx < MAX_TESTS)
        memcpy (tests[test_idx++].text, test, strlen(test));
    else
        test_idx = 0;
}

и записал ее
Код
void TESTER_SaveTest(uint32_t user_page)
{
    FLASH_PageErase(user_page);
    FLASH_PageProgram(user_page,(uint8_t *) tests, sizeof (tests));
}


так будет работать?
Go to the top of the page
 
+Quote Post
x893
сообщение Nov 6 2016, 11:04
Сообщение #6


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Можно и байтами записывать во флэш. Страница полная будет, а конец по 0xFF определять.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Nov 6 2016, 12:04
Сообщение #7


Гуру
******

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



Цитата(Jenya7 @ Nov 6 2016, 15:48) *
я не уверен что конец строки указывает на начало следующей. в этом случае мне нужно сохранять строки строго одна после другой.

А как вы их сохраняете? Можно как-то по другому?
Если строки приходят по терминалу, то в конце всяко будет или 0x0D или 0x0A.
А, так как чистый flash читается как 0xFF, то можно по ним искать начало строки.

Цитата(Jenya7)
FLASH_PageProgram(user_page,(uint8_t *) tests, sizeof (tests));

т.е. вы на одну страницу записываете одно сообщение?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 6 2016, 12:21
Сообщение #8


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

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



Цитата(HardEgor @ Nov 6 2016, 17:04) *
А как вы их сохраняете? Можно как-то по другому?
Если строки приходят по терминалу, то в конце всяко будет или 0x0D или 0x0A.
А, так как чистый flash читается как 0xFF, то можно по ним искать начало строки.


т.е. вы на одну страницу записываете одно сообщение?

я не могу записать на страницу одно сообщение. я должен стереть страницу а потом ее полностью записать. поэтому строки я сохраняю в массиве tests а потом весь массив строк я хочу записать на страницу.
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Nov 6 2016, 12:25
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



А почему не стирать страницы заранее, и писать данные уже в стертые ?
Go to the top of the page
 
+Quote Post
iosifk
сообщение Nov 6 2016, 12:38
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Jenya7 @ Nov 6 2016, 11:31) *
Мне пользователь посылает строки по терминалу. Я сохраняю их во флэше. При перезагрузке контроллера мне надо вытащить их. Но как я знаю откуда их тащить? начальный адрес я конечно знаю. но строки разной длины. как мне узнать где начало / конец строки?

У меня на сайте есть статья про микроконтроллеры НЕК - эмуляция электрического ПЗУ на флэшь. Только учтите, что циклов перезаписи на страницу не более 10 тыс, а ввовсе не 100 тыс, как в рекламе...
А вообще то - мелкая фрам и никаких проблем...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 6 2016, 12:49
Сообщение #11


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

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



Цитата(rx3apf @ Nov 6 2016, 17:25) *
А почему не стирать страницы заранее, и писать данные уже в стертые ?

флеш пишется постранично. нельзя дописать на страницу. пишется вся страница. суть вопроса как организовать алгоритм записи/чтения строк на флеш страницу.

Цитата(iosifk @ Nov 6 2016, 17:38) *
У меня на сайте есть статья про микроконтроллеры НЕК - эмуляция электрического ПЗУ на флэшь. Только учтите, что циклов перезаписи на страницу не более 10 тыс, а ввовсе не 100 тыс, как в рекламе...
А вообще то - мелкая фрам и никаких проблем...

у STM есть EEPROM Emulator. я с ним работал как то. но сейчас я работаю с Kinetis. но даже с EEPROM нужен алгоритм записи/чтения.

Сообщение отредактировал Jenya7 - Nov 6 2016, 12:46
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 6 2016, 12:53
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
gerber
сообщение Nov 6 2016, 12:56
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(Jenya7 @ Nov 6 2016, 15:43) *
суть вопроса как организовать алгоритм записи/чтения строк на флеш страницу.

В конце каждой строки ставите нулевой байт, после которого стразу начинается новая строка. В последней строке на странице ставите 2 нулевых байта. Таким образом, последняя считанная строка будет всегда пустая.
Считывать можно хотя бы даже с помощью sscanf.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 6 2016, 13:02
Сообщение #14


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

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



Цитата(Dog Pawlowa @ Nov 6 2016, 17:53) *
Как только вы сформулируете проблему, не затрагивая программирование, флэш, и проч, то проблема и решится.
Строки - как клубни картошки - их можно ссыпать в мешки одинакового размера (чтобы заведомо поместилась), и запоминать номер мешка.
Или высыпать на длинный конвейер, и завести тетрадку на каком удалении находится начало каждой строки.
Перевожу.
Или создать массивы фиксированного размера с таблицей индексов, или таблицу указателей.

это сойдет за массив указателей?
Код
typedef struct TESTS_S
{
    char *text;
}TESTS;

TESTS tests[MAX_TESTS];

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


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Dog Pawlowa @ Nov 6 2016, 15:53) *
Перевожу.
Или создать массивы фиксированного размера с таблицей индексов, или таблицу указателей.

+1 И добавлю. Или связанный список, как здесь уже говорилось.
И кстати, утверждение о том, что можно записывать страницу только целиком - это наверняка не правда. Вот стирать - это точно только целиком...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 4th August 2025 - 18:25
Рейтинг@Mail.ru


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