093 0 21 октября, 2017 Опубликовано 21 октября, 2017 (изменено) · Жалоба Привет! Нашел в одном проекте любопытную организацию записи во flash: держим в ram массив размеров FLASH_PAGE_SIZE и как только он заполнится - записываем одним большим куском во flash. Абсолютно не понимаю зачем так сделано, можно же по несколько байт записывать - и программа будет более равномерно выполняться, да и так проще гораздо. Единственная версия - это чтобы изменять несколько байт во flash и не затрагивать все остальные, но в коде такое нигде не используется. Может быть автор хотел так сэкономить ресурс? Но разве это повлияет на ресурс памяти? PS: Начинаю догадываться, что такая хитрая запись сделана для экономии электроэнергии, но в данном случае о ней речи не идет, видимо из другого проекта перенесена. Ммм! А можно ли объявить массив вот так: __root const unsigned char place_for_archive[2048] @ 0x20000; //20000 - в начало страницы И далее читать/записывать flash память, взяв указатель от place_for_archive? Только как бы его в начало страницы поместить? Это же поможет избежать ситуацию, когда код программы разрастется и наедет на ту область flash памяти, в которую пишем некий архив событий :) По идеи линкер нас об этом предупредит. Изменено 21 октября, 2017 пользователем 93 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 21 октября, 2017 Опубликовано 21 октября, 2017 · Жалоба Возможные причины: 1. Экономия ресурса циклов. Для MSP их мало. 10К, кажется. Надо смотреть док. 2. Экономия электричества. При батарейном питании "долгоиграющих" девайсов (например счетчик воды или газа) это очень критично, тк. для стирания надо "раскочегарить" преобразователь. Если стирать (и записывать) "оптом" - будет намного экономнее. 3. Экономия процессорного времени. Оноже - экономия электричества :) . . . А можно ли объявить массив вот так . . Вместо абсолютного адреса лучше определите в файле линкера свой сегмент на требуемый адрес. Тогда никаких "наездов" не случится. Я пользую сегмент инфо: --файл линкера --- // --------------------- // Information memory -Z(CONST)INFO=1800-19FF -Z(CONST)INFOA=1980-19FF -Z(CONST)INFOB=1900-197F //-Z(CONST)INFOC=1880-18FF -Z(CONST)MY_SEGMENT_1,MY_SEGMENT_2,INFOC=1880-18FF -Z(CONST)INFOD=1800-187F ---- main.c -------- . . . const WORD SerialNumber @ "MY_SEGMENT_1" = 54321; . . . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
093 0 22 октября, 2017 Опубликовано 22 октября, 2017 (изменено) · Жалоба k155la3, что есть цикл записи/стирания flash памяти? Стёрли всю страницу и записали всю страницу? Или стёрли всю страницу и записали 1 байт тоже считается за цикл? Изменено 22 октября, 2017 пользователем 93 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 22 октября, 2017 Опубликовано 22 октября, 2017 · Жалоба k155la3, что есть цикл записи/стирания flash памяти? Стёрли всю страницу и записали всю страницу? Или стёрли всю страницу и записали 1 байт тоже считается за цикл? Ресурс flash считается в количестве циклов стирания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
093 0 22 октября, 2017 Опубликовано 22 октября, 2017 (изменено) · Жалоба jcxz, ага, понятно. Значит суть того алгоритма записи, что в первом посте только в экономии энергии. Спасибо всем! Изменено 22 октября, 2017 пользователем 93 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 22 октября, 2017 Опубликовано 22 октября, 2017 · Жалоба jcxz, ага, понятно. Значит суть того алгоритма записи, что в первом посте только в экономии энергии. Спасибо всем! Экономия ресурса флеш (циклы, прежде всего, тк их мало) + экономия энергии. DOC F5438A: slas655d, slau208o.pdf, slaz290m.pdf Необходимое, но недостаточное :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
093 0 22 октября, 2017 Опубликовано 22 октября, 2017 (изменено) · Жалоба k155la3, если ресурс рассчитывается в количестве циклов стирания - то алгоритм из первого поста никак не поможет продлить ресурс. Точно также можно и записывать по одному байту, а не целой страницей, при этом стирать страницами. Изменено 22 октября, 2017 пользователем 93 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 22 октября, 2017 Опубликовано 22 октября, 2017 · Жалоба (1) . . . если ресурс рассчитывается в количестве циклов стирания - то алгоритм из первого поста никак не поможет продлить ресурс. (2) Точно также можно и записывать по одному байту, а не целой страницей, при этом стирать страницами. (1) Смотря как работает ваш массив. Если это некий аналог кэш-памяти - то очень даже сэкономит (циклы стирания). (2) Да Курите slau208o, 7.3.2.7 Block Write, и чем оно отличается от режимов записи 1/2/4 байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
093 0 24 октября, 2017 Опубликовано 24 октября, 2017 (изменено) · Жалоба k155la3, раз размер массива равен размеру страницы - получится такое же кол-во циклов стирания, как и в случае отсутствия массива и записи байт за байтом. Мы же не можем не стирать :) Изменено 24 октября, 2017 пользователем 93 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 26 октября, 2017 Опубликовано 26 октября, 2017 · Жалоба Если в сегмент надо до-записать данные (те пишем в ячейки памяти флеш, содержащие 0xFF и продвигаем указатель записи ++), то стирание сегмента не требуется. Например, лог включений прибора. Когда будет заполнены последние ячейки сегмента - стираем сегмент и пишем опять с начала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться