То, что вы предлагаете, вряд ли будет практичным. Флэш-память записывает слова, стирает блоки. Переписать одно слово невозможно; вам нужно скопировать весь блок стирания в ОЗУ, изменить значение в копии, стереть блок, а затем записать весь блок из измененной копии ОЗУ. Надеясь, что питание не отключится во время процесса.
Это может быть даже невозможно, если ваша оперативная память меньше размера стираемого блока. Более того, если SoC выполняет код из Flash, стирание блока, скорее всего, стирает исполняемый код.
Проверьте документацию по своей детали, но nRF52840 имеет относительно небольшие страницы по 4 КБ. Поэтому лучшим решением будет зарезервировать страницу для ваших данных конфигурации/инициализации и прочитать эти данные в вашем коде и назначить их соответствующим переменным при запуске, а не пытаться переписать сгенерированный компоновщиком код/данные. Еще лучше, чтобы защитить себя от сбоя питания, используйте две страницы с порядковым номером и подтверждением, которые вы пишете последними; затем при запуске используется страница с наибольшим допустимым порядковым номером. Когда вы изменяете данные, вы перезаписываете более старые данные — таким образом, если произойдет сбой до записи порядкового номера и проверки, вы не потеряете все свои данные. Если страница данных пуста, вы используете инициализацию, сгенерированную компоновщиком.
Это только схема того, что вам нужно сделать — уровень сложности зависит от вас.
Если ваше приложение имеет жесткие ограничения в реальном времени; вам может потребоваться проверить, что шина памяти не блокируется во время стирания/записи страницы - это может остановить выполнение кода, включая обработчики прерываний во время стирания/записи, и привести к пропуску сроков. Время стирания страницы составляет до 85 мс для nRF52840. Если это проблема, то вам лучше использовать внешнюю EEPROM.
person
Clifford
schedule
20.02.2018
.data
исполняемого файла? (который вы составили). Если ответ да, то я думаю, что вопрос, который вы, вероятно, хотите задать, будетHow to rewrite the contents of .data segment in an executable
. - person Santosh A   schedule 20.02.2018