Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSP430F5438A. Запись во flash и ресурс памяти.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
093
Привет!
Нашел в одном проекте любопытную организацию записи во flash: держим в ram массив размеров FLASH_PAGE_SIZE и как только он заполнится - записываем одним большим куском во flash.
Абсолютно не понимаю зачем так сделано, можно же по несколько байт записывать - и программа будет более равномерно выполняться, да и так проще гораздо.
Единственная версия - это чтобы изменять несколько байт во flash и не затрагивать все остальные, но в коде такое нигде не используется.

Может быть автор хотел так сэкономить ресурс?
Но разве это повлияет на ресурс памяти?

PS: Начинаю догадываться, что такая хитрая запись сделана для экономии электроэнергии, но в данном случае о ней речи не идет, видимо из другого проекта перенесена.


Ммм! А можно ли объявить массив вот так:
Код
__root const unsigned char place_for_archive[2048] @ 0x20000; //20000 - в начало страницы

И далее читать/записывать flash память, взяв указатель от place_for_archive? Только как бы его в начало страницы поместить?
Это же поможет избежать ситуацию, когда код программы разрастется и наедет на ту область flash памяти, в которую пишем некий архив событий sm.gif По идеи линкер нас об этом предупредит.

k155la3
Возможные причины:
1. Экономия ресурса циклов. Для MSP их мало. 10К, кажется. Надо смотреть док.
2. Экономия электричества. При батарейном питании "долгоиграющих" девайсов (например счетчик воды или газа) это очень критично, тк.
для стирания надо "раскочегарить" преобразователь. Если стирать (и записывать) "оптом" - будет намного экономнее.
3. Экономия процессорного времени. Оноже - экономия электричества sm.gif
Цитата(93 @ Oct 21 2017, 16:05) *
. . . А можно ли объявить массив вот так . .

Вместо абсолютного адреса лучше определите в файле линкера свой сегмент на требуемый адрес.
Тогда никаких "наездов" не случится.
Я пользую сегмент инфо:

Код
--файл линкера ---
// ---------------------
// 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
k155la3, что есть цикл записи/стирания flash памяти? Стёрли всю страницу и записали всю страницу? Или стёрли всю страницу и записали 1 байт тоже считается за цикл?
jcxz
Цитата(93 @ Oct 22 2017, 11:42) *
k155la3, что есть цикл записи/стирания flash памяти? Стёрли всю страницу и записали всю страницу? Или стёрли всю страницу и записали 1 байт тоже считается за цикл?

Ресурс flash считается в количестве циклов стирания.
093
jcxz, ага, понятно. Значит суть того алгоритма записи, что в первом посте только в экономии энергии.
Спасибо всем!
k155la3
Цитата(93 @ Oct 22 2017, 12:16) *
jcxz, ага, понятно. Значит суть того алгоритма записи, что в первом посте только в экономии энергии.
Спасибо всем!

Экономия ресурса флеш (циклы, прежде всего, тк их мало) + экономия энергии.
DOC F5438A: slas655d, slau208o.pdf, slaz290m.pdf
Необходимое, но недостаточное sm.gif

093
k155la3, если ресурс рассчитывается в количестве циклов стирания - то алгоритм из первого поста никак не поможет продлить ресурс. Точно также можно и записывать по одному байту, а не целой страницей, при этом стирать страницами.
k155la3
Цитата(93 @ Oct 22 2017, 13:35) *
(1) . . . если ресурс рассчитывается в количестве циклов стирания - то алгоритм из первого поста никак не поможет продлить ресурс.
(2) Точно также можно и записывать по одному байту, а не целой страницей, при этом стирать страницами.

(1) Смотря как работает ваш массив.
Если это некий аналог кэш-памяти - то очень даже сэкономит (циклы стирания).
(2) Да

Курите slau208o, 7.3.2.7 Block Write, и чем оно отличается от режимов записи 1/2/4 байт.
093
k155la3, раз размер массива равен размеру страницы - получится такое же кол-во циклов стирания, как и в случае отсутствия массива и записи байт за байтом. Мы же не можем не стирать sm.gif
k155la3
Если в сегмент надо до-записать данные (те пишем в ячейки памяти флеш, содержащие 0xFF и продвигаем указатель записи ++), то стирание сегмента не требуется. Например, лог включений прибора. Когда будет заполнены последние ячейки сегмента - стираем сегмент и пишем опять с начала.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.