Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чтение строк из флэш.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
Мне пользователь посылает строки по терминалу. Я сохраняю их во флэше. При перезагрузке контроллера мне надо вытащить их. Но как я знаю откуда их тащить? начальный адрес я конечно знаю. но строки разной длины. как мне узнать где начало / конец строки?
HardEgor
CR+LF(0x0D+0x0A)?
Jenya7
Цитата(HardEgor @ Nov 6 2016, 14:37) *
CR+LF(0x0D+0x0A)?

я не уверен что конец строки указывает на начало следующей. в этом случае мне нужно сохранять строки строго одна после другой.
rx3apf
А как же иначе ? А если предполагается, что там еще могут быть какие-то данные между строками, то перед строкой сохранять еще и смещение до следующей (т.е. длину строки и что там еще может лежать).
Jenya7
Цитата(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));
}


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

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

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

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


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

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

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

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

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

у STM есть EEPROM Emulator. я с ним работал как то. но сейчас я работаю с Kinetis. но даже с EEPROM нужен алгоритм записи/чтения.
Dog Pawlowa
Как только вы сформулируете проблему, не затрагивая программирование, флэш, и проч, то проблема и решится.
Строки - как клубни картошки - их можно ссыпать в мешки одинакового размера (чтобы заведомо поместилась), и запоминать номер мешка.
Или высыпать на длинный конвейер, и завести тетрадку на каком удалении находится начало каждой строки.
Перевожу.
Или создать массивы фиксированного размера с таблицей индексов, или таблицу указателей.
gerber
Цитата(Jenya7 @ Nov 6 2016, 15:43) *
суть вопроса как организовать алгоритм записи/чтения строк на флеш страницу.

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

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

TESTS tests[MAX_TESTS];

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

+1 И добавлю. Или связанный список, как здесь уже говорилось.
И кстати, утверждение о том, что можно записывать страницу только целиком - это наверняка не правда. Вот стирать - это точно только целиком...
rx3apf
Цитата(Jenya7 @ Nov 6 2016, 15:49) *
флеш пишется постранично. нельзя дописать на страницу. пишется вся страница.

Тогда и конкретный тип микросхемы озвучьте, pls ?
Jenya7
Цитата(rx3apf @ Nov 6 2016, 18:05) *
Тогда и конкретный тип микросхемы озвучьте, pls ?

это Kinetis - K70.

а вообще какая разница как пишется флэш. о чем мы тут говорим?
вопрос о том как добавлять приходящие строки во флеш. и как считать их при перезагрузке.

HardEgor
Цитата(Jenya7 @ Nov 6 2016, 20:12) *
а вообще какая разница как пишется флэш. о чем мы тут говорим?

Flash пишется побайтово, но стирается страницами.
Поэтому просто дописываете пришедшую строку в конец предыдущей, ну и разделители какие-нибудь - уже писал, наверняка в конце строки приходит CR.
Никаких проблем.
Jenya7
Цитата(HardEgor @ Nov 6 2016, 18:23) *
Flash пишется побайтово, но стирается страницами.
Поэтому просто дописываете пришедшую строку в конец предыдущей, ну и разделители какие-нибудь - уже писал, наверняка в конце строки приходит CR.
Никаких проблем.

так мне нужно следить за адресом? я ведь должен знать куда писать следующую строку...
нет что то тут не то. у меня функция записи
uint32_t FLASH_PageProgram(uint32_t page_num, uint8_t *buffer, uint32_t size)
то есть я передал номер страницы. это мне нужно переделать функцию так чтоб был доступ к адресам? в stm32 я писал во флеш постранично.
HardEgor
Цитата(Jenya7 @ Nov 6 2016, 20:34) *
нет что то тут не то. у меня функция записи
uint32_t FLASH_PageProgram(uint32_t page_num, uint8_t *buffer, uint32_t size)

Вы сами себе устроили проблемы, а теперь героически их решаете.
Должна быть функция которая пишет побайтово, вот из K70 reference manual :
8-bit, 16-bit, and 32-bit read and write operations to FlexNVM and FlexRAM used as EEPROM
Если такой функции нет, то её надо просто написать.
Jenya7
Цитата(HardEgor @ Nov 6 2016, 19:38) *
Вы сами себе устроили проблемы, а теперь героически их решаете.
Должна быть функция которая пишет побайтово, вот из K70 reference manual :
8-bit, 16-bit, and 32-bit read and write operations to FlexNVM and FlexRAM used as EEPROM
Если такой функции нет, то её надо просто написать.

я понял. спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.