Перейти к содержанию

    

MSP430F5438A. Запись во flash и ресурс памяти.

Привет!

Нашел в одном проекте любопытную организацию записи во flash: держим в ram массив размеров FLASH_PAGE_SIZE и как только он заполнится - записываем одним большим куском во flash.

Абсолютно не понимаю зачем так сделано, можно же по несколько байт записывать - и программа будет более равномерно выполняться, да и так проще гораздо.

Единственная версия - это чтобы изменять несколько байт во flash и не затрагивать все остальные, но в коде такое нигде не используется.

 

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

Но разве это повлияет на ресурс памяти?

 

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

 

 

Ммм! А можно ли объявить массив вот так:

__root const unsigned char place_for_archive[2048] @ 0x20000; //20000 - в начало страницы

И далее читать/записывать flash память, взяв указатель от place_for_archive? Только как бы его в начало страницы поместить?

Это же поможет избежать ситуацию, когда код программы разрастется и наедет на ту область flash памяти, в которую пишем некий архив событий :) По идеи линкер нас об этом предупредит.

 

 

Изменено пользователем 93

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможные причины:

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;
. . .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
k155la3, что есть цикл записи/стирания flash памяти? Стёрли всю страницу и записали всю страницу? Или стёрли всю страницу и записали 1 байт тоже считается за цикл?
Изменено пользователем 93

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
k155la3, что есть цикл записи/стирания flash памяти? Стёрли всю страницу и записали всю страницу? Или стёрли всю страницу и записали 1 байт тоже считается за цикл?

Ресурс flash считается в количестве циклов стирания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

jcxz, ага, понятно. Значит суть того алгоритма записи, что в первом посте только в экономии энергии.

Спасибо всем!

Изменено пользователем 93

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
jcxz, ага, понятно. Значит суть того алгоритма записи, что в первом посте только в экономии энергии.

Спасибо всем!

Экономия ресурса флеш (циклы, прежде всего, тк их мало) + экономия энергии.

DOC F5438A: slas655d, slau208o.pdf, slaz290m.pdf

Необходимое, но недостаточное :)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
k155la3, если ресурс рассчитывается в количестве циклов стирания - то алгоритм из первого поста никак не поможет продлить ресурс. Точно также можно и записывать по одному байту, а не целой страницей, при этом стирать страницами.
Изменено пользователем 93

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
(1) . . . если ресурс рассчитывается в количестве циклов стирания - то алгоритм из первого поста никак не поможет продлить ресурс.

(2) Точно также можно и записывать по одному байту, а не целой страницей, при этом стирать страницами.

(1) Смотря как работает ваш массив.

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

(2) Да

 

Курите slau208o, 7.3.2.7 Block Write, и чем оно отличается от режимов записи 1/2/4 байт.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
k155la3, раз размер массива равен размеру страницы - получится такое же кол-во циклов стирания, как и в случае отсутствия массива и записи байт за байтом. Мы же не можем не стирать :)
Изменено пользователем 93

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если в сегмент надо до-записать данные (те пишем в ячейки памяти флеш, содержащие 0xFF и продвигаем указатель записи ++), то стирание сегмента не требуется. Например, лог включений прибора. Когда будет заполнены последние ячейки сегмента - стираем сегмент и пишем опять с начала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация