|
|
  |
МК не выполняет команды... |
|
|
|
Jul 10 2012, 17:13
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Привет всем! Ребята, подскажите как быть. Весь измучался уже... У меня есть устройство на MSP430F149 и прошивка от этого МК. Устройство по оптопорту принимает данные и отправляет ответ. Мне необходимо поставить счетчик принятых байт. Так как исходника у меня нет, то используя прошивку и дизассемблер я сделал ассемблерную вставку кода в незанятое программой место МК. Адрес вектора сброса USART0 (по нему происходит "общение" с прибором) я изменил на адрес начала моей вставки. Сама вставка выглядит так: Код ADD #1, &FE30 ;Увеличиваем счетчик принятых байт
BR #B91E ;Переходим к истинной процедуре обработки прерывания Однако, после заливки такой модифицированной прошивки, устройство вообще перестало отвечать на запросы. Пробовал после запросов прочитать адрес FE30 - его значение так и осталось неизменным. Если адрес вектора сброса установить так, чтобы он указывал сразу на вторую строку вставки, то все работает как и до изменения прошивки. Подскажите, почему не выполняется первая строка? Что я не так делаю?
Сообщение отредактировал d7d1cd - Jul 10 2012, 17:15
|
|
|
|
|
Jul 10 2012, 17:35
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(d7d1cd @ Jul 10 2012, 21:13)  Пробовал после запросов прочитать адрес FE30 - его значение так и осталось неизменным. Если адрес вектора сброса установить так, чтобы он указывал сразу на вторую строку вставки, то все работает как и до изменения прошивки. Подскажите, почему не выполняется первая строка? Что я не так делаю? Может я чего не понимаю, но FE30 - это же область flash-памяти, таким способом она никак не может меняться. Правда, это не объясняет, почему нет реакции на запросы, попытка записи не должна никак влиять на работу процессора. Попробуйте инкрементировать какой-нибудь свободный регистр (если есть) или укажите адрес в свободной области RAM.
|
|
|
|
|
Jul 10 2012, 17:58
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(rezident @ Jul 10 2012, 21:33)  Адрес 0xFE30 находится во Flash. Его содержимое одной командой изменить нельзя. Ибо Flash это ЭППЗУ. Измените адрес Flash на адрес ячейки в ОЗУ. Спасибо за разъяснения. Вы говорите, что " Его содержимое одной командой изменить нельзя". А вообще можно как-то изменить содержимое по этому адресу (в частности)? Цитата(rx3apf @ Jul 10 2012, 21:35)  Может я чего не понимаю, но FE30 - это же область flash-памяти, таким способом она никак не может меняться. Правда, это не объясняет, почему нет реакции на запросы, попытка записи не должна никак влиять на работу процессора. Попробуйте инкрементировать какой-нибудь свободный регистр (если есть) или укажите адрес в свободной области RAM. Пока меня больше всего и волнует то, что перестает работать стандартный обработчик прерывания... Завтра попробую инкрементировать слово в ОЗУ. Но я не знаю где там есть свободное место. Желательно бы как-то менять именно адрес FLASH. Или это недопустимо?
|
|
|
|
|
Jul 10 2012, 18:54
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(d7d1cd @ Jul 10 2012, 22:58)  Спасибо за разъяснения. Вы говорите, что " Его содержимое одной командой изменить нельзя". А вообще можно как-то изменить содержимое по этому адресу (в частности)? Можно (читайте раздел Chapter 5. Flash Memory Controller в MSP430x1xx Family User's Guide), но не нужно - во-первых, число перезаписей ячейки Flash весьма ограничено, во-вторых, запись одной ячейки требует предварительного стирания всего сегмента Flash (512 байт) в котором она расположена, в-третьих, запись одной ячейки задерживает выполнение программы из Flash на время записи (около 10мс). Цитата(d7d1cd @ Jul 10 2012, 22:58)  Пока меня больше всего и волнует то, что перестает работать стандартный обработчик прерывания... Ничего удивительного, срабатывает встроенная защита от несанкционированной записи Flash (access violation to the flash memory), которая вызывает немаскируемое прерывание и рестарт программы. Цитата(d7d1cd @ Jul 10 2012, 22:58)  Завтра попробую инкрементировать слово в ОЗУ. Но я не знаю где там есть свободное место. Найдите в самом начале программы команду инициализации стека и измените (сдвиньте на одно слово) начальное значение указателя стека. В освободившуюся ячейку памяти ОЗУ (2 байта) будете писать свой счетчик. Цитата(d7d1cd @ Jul 10 2012, 22:58)  Желательно бы как-то менять именно адрес FLASH. Или это недопустимо? См. выше.
|
|
|
|
|
Jul 12 2012, 14:07
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(d7d1cd @ Jul 11 2012, 22:28)  возможно ли выполнить запись в информационную память без использования контроллера Flash памяти? Вы упорно не желаете самостоятельно изучать документацию? Ведь ссылку на User's Guide я вам как минимум уже три раза давал! Ну тогда я пожалуй и не буду потакать вашей лени. Цитата(d7d1cd @ Jul 11 2012, 22:28)  Если возможно, то какой ресурс перезаписей у этой памяти? Datasheet MSP430F149 (rev.F), стр. 39, таблица Flash Memory, значение параметра Program/Erase endurance. Цитата(d7d1cd @ Jul 11 2012, 22:28)  И еще: допустимо ли осуществлять чтение слова по нечетному адресу? 16-и разрядного слова - нет. К нечетным адресам можно обращаться только побайтно. См. (даю ссылку в 4-й раз) MSP430x1xx Family User's Guide (Rev.F), стр. 16, первый параграф главы 1.4 Address Space.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|