реклама на сайте
подробности

 
 
> Переписать содержимое адреса 0xFFFE
d7d1cd
сообщение Jul 17 2012, 02:58
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Привет всем! Почитав книжки понял, что записать Flash память можно, предварительно стерев ее. Минимально можно стереть 1 сегмент. Как мне поступить, если необходимо во время работы устройства на MSP430F149, при получении определенной команды по UART, поменять адрес вектора сброса? Ясно то, что чтобы поменять, нужно стереть сегмент 0. Но ведь тогда я потеряю адреса других векторов. Мне их нужно где-то хранить в программе, чтобы потом перезаписать? И больше никак?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
KARLSON
сообщение Jul 17 2012, 04:19
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 604
Регистрация: 5-05-06
Из: Нижегородская обл.
Пользователь №: 16 819



Больше никак. Копируем сегмент, меняем то, что нужно и обратно записываем.
Только учтите. В случае когда пошёл процесс записи и отключиться питание/провал, контроллер на перепрограммирование через JTAG, т.к. не запуститься больше, стёрт адрес старта.


--------------------
Кризис - это не отсутствие денег, а отсутствие идей! Учитесь и никаких кризисов не будет.
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Jul 17 2012, 14:18
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



Ну можно ещё на этапе программирования, по вектору сброса задать адрес на программу, которая будет брать адрес для перехода из сегмента например №50. И при получении по UART команды на перезапись вектора RESET, делать это в 50-ом сегменте. А 0 сегмент не трогать.
Последовательность будет такая:
1. По сигналу сброса проц. переходит по адресу взятому из FFFE
2. По этому адресу находится программа берущая адрес из ячейки (например) FC00. Программа берёт адрес и делает переход на основную программу.
3. При получении команды по UART переписывается вектор по адресу FC00. И всё. А 0 сегмент не трогаем.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jul 17 2012, 15:51
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(controller_m30 @ Jul 17 2012, 18:18) *
3. При получении команды по UART переписывается вектор по адресу FC00. И всё. А 0 сегмент не трогаем.

Так все равно адрес FC00 находится во флеш. Для перезаписи этого адреса надо стереть сегмент, где этот адрес лежит. А размер сегмента там гораздо больше, чем сегмент 0.


Go to the top of the page
 
+Quote Post
controller_m30
сообщение Jul 18 2012, 07:51
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



Цитата(d7d1cd @ Jul 17 2012, 18:51) *
Так все равно адрес FC00 находится во флеш. Для перезаписи этого адреса надо стереть сегмент, где этот адрес лежит. А размер сегмента там гораздо больше, чем сегмент 0.
Вот такой вариант.
Отводим для записи адреса перехода какой либо сегмент целиком. В начале эксплуатации он заполнен FFFF. Память заполненная единицами доступна для записи нулей: по-битно, по-байтно, по-словно (стирание сегмента нужно только для перевода 0 в 1).
При каждом приходе команды из UARTa, записываем этот присланный вектор в первый свободный адрес в сегменте.
Программа выполняемая при RESET будет искать в сегменте тот вектор, после которого есть слово FFFF (т.е. последнюю запись в сегменте). При размере сегмента 512 байт (основная память) - его ресурса без стирания хватит на 256 изменений адреса. А для информационной памяти - на 64 перезаписи.
Если планируемое количество изменений адреса меньше чем ресурс сегмента - то этого достаточно.

Можно сделать ещё интеллектуальнее, чтоб при ошибке данных из UART не задать случайно такой вектор, который не годится для старта программы. Для этого создаём таблицу с адресами всех возможных векторов старта программы (допустим их 30 штук). А по UART шлём только номер нужного вектора. Этот номер и будем менять. Если векторов всего 30 - то писать нужно только один байт, значит ресурс сегмента возрастает в два раза (для основной памяти ресурс = 512 обновлений, для инф.памяти = 128).
Программа начального запуска будет проверять корректность имеющегося номера на <= 30, и если номер последней записи больше - то либо делается переход по последнему корректному вектору из имеющихся, либо на основное тело программы которая выполнялась при первом пуске после программирования.
Это по крайней мере гарантирует предсказуемость выполнения программы при любых ошибках данных из UART.

А если нужно сделать только одну перезапись стартового адреса (например контроллер выдаётся заказчику для разового использования) - то достаточно в программке выполняемой по RESET задать "вилку" которая будет выполняться в зависимости от значения одного бита(!) Flash памяти. При значении бита =1 - выполняется основная программа, а после стирания бита - напоминалка с просьбой заплатить бабки автору программы biggrin.gif

В общем, если Вы напишете подробней как часто, и для чего собираетесь менять адрес старта, то можно придумать ещё варианты rolleyes.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 00:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016