d7d1cd 0 17 июля, 2012 Опубликовано 17 июля, 2012 · Жалоба Привет всем! Почитав книжки понял, что записать Flash память можно, предварительно стерев ее. Минимально можно стереть 1 сегмент. Как мне поступить, если необходимо во время работы устройства на MSP430F149, при получении определенной команды по UART, поменять адрес вектора сброса? Ясно то, что чтобы поменять, нужно стереть сегмент 0. Но ведь тогда я потеряю адреса других векторов. Мне их нужно где-то хранить в программе, чтобы потом перезаписать? И больше никак? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KARLSON 1 17 июля, 2012 Опубликовано 17 июля, 2012 · Жалоба Больше никак. Копируем сегмент, меняем то, что нужно и обратно записываем. Только учтите. В случае когда пошёл процесс записи и отключиться питание/провал, контроллер на перепрограммирование через JTAG, т.к. не запуститься больше, стёрт адрес старта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
controller_m30 1 17 июля, 2012 Опубликовано 17 июля, 2012 · Жалоба Ну можно ещё на этапе программирования, по вектору сброса задать адрес на программу, которая будет брать адрес для перехода из сегмента например №50. И при получении по UART команды на перезапись вектора RESET, делать это в 50-ом сегменте. А 0 сегмент не трогать. Последовательность будет такая: 1. По сигналу сброса проц. переходит по адресу взятому из FFFE 2. По этому адресу находится программа берущая адрес из ячейки (например) FC00. Программа берёт адрес и делает переход на основную программу. 3. При получении команды по UART переписывается вектор по адресу FC00. И всё. А 0 сегмент не трогаем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 17 июля, 2012 Опубликовано 17 июля, 2012 · Жалоба 3. При получении команды по UART переписывается вектор по адресу FC00. И всё. А 0 сегмент не трогаем. Так все равно адрес FC00 находится во флеш. Для перезаписи этого адреса надо стереть сегмент, где этот адрес лежит. А размер сегмента там гораздо больше, чем сегмент 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
controller_m30 1 18 июля, 2012 Опубликовано 18 июля, 2012 · Жалоба Так все равно адрес FC00 находится во флеш. Для перезаписи этого адреса надо стереть сегмент, где этот адрес лежит. А размер сегмента там гораздо больше, чем сегмент 0.Вот такой вариант. Отводим для записи адреса перехода какой либо сегмент целиком. В начале эксплуатации он заполнен FFFF. Память заполненная единицами доступна для записи нулей: по-битно, по-байтно, по-словно (стирание сегмента нужно только для перевода 0 в 1). При каждом приходе команды из UARTa, записываем этот присланный вектор в первый свободный адрес в сегменте. Программа выполняемая при RESET будет искать в сегменте тот вектор, после которого есть слово FFFF (т.е. последнюю запись в сегменте). При размере сегмента 512 байт (основная память) - его ресурса без стирания хватит на 256 изменений адреса. А для информационной памяти - на 64 перезаписи. Если планируемое количество изменений адреса меньше чем ресурс сегмента - то этого достаточно. Можно сделать ещё интеллектуальнее, чтоб при ошибке данных из UART не задать случайно такой вектор, который не годится для старта программы. Для этого создаём таблицу с адресами всех возможных векторов старта программы (допустим их 30 штук). А по UART шлём только номер нужного вектора. Этот номер и будем менять. Если векторов всего 30 - то писать нужно только один байт, значит ресурс сегмента возрастает в два раза (для основной памяти ресурс = 512 обновлений, для инф.памяти = 128). Программа начального запуска будет проверять корректность имеющегося номера на <= 30, и если номер последней записи больше - то либо делается переход по последнему корректному вектору из имеющихся, либо на основное тело программы которая выполнялась при первом пуске после программирования. Это по крайней мере гарантирует предсказуемость выполнения программы при любых ошибках данных из UART. А если нужно сделать только одну перезапись стартового адреса (например контроллер выдаётся заказчику для разового использования) - то достаточно в программке выполняемой по RESET задать "вилку" которая будет выполняться в зависимости от значения одного бита(!) Flash памяти. При значении бита =1 - выполняется основная программа, а после стирания бита - напоминалка с просьбой заплатить бабки автору программы В общем, если Вы напишете подробней как часто, и для чего собираетесь менять адрес старта, то можно придумать ещё варианты :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться