ВУЗ:
Составители:
134
окне «Flash EE/Code», но содержимое окна листинга при такой модификации
никак не изменится. При последующем запуске на выполнение инструкции в
программе будут выполняться не в соответствии с их мнемоническими
изображениями в окне листинга, а в соответствии с новым, измененным и
записанным в кристалл содержимым программной памяти, что поначалу может
вызвать недоумение пользователя.
Сказанное можно пояснить на следующем примере. Модифицируем одну
из инструкций в программной памяти МК таким образом, чтобы при
выполнении программы это сразу стало заметно. Пусть это будет инструкция,
расположенная в памяти по адресу 011F и в окне листинга имеющая мнемонику
SETB _OUT_LED. Она зажигает светодиод. Как можно видеть из листинга,
инструкция двухбайтовая, ее код – D2A0. Изменим первый байт (код операции)
на значение C2, чтобы получилась инструкция с кодом C2A0, которая в
соответствии с таблицей команд контроллеров семейства 8051 имеет
мнемонику CLR _OUT_LED, т. е. наоборот, гасит светодиод. Таким образом,
при выполнении получившейся программы в случае, если кнопка не нажата,
светодиод не должен светится вообще, так как в программной ветви, по
которой пойдет управление не будет инструкций, которые его зажигают. А
инструкций, гасящих светодиод, будет теперь две. Для осуществления
модификации наведем курсор на число D2 по адресу 011F в окне «Flash
EE/Code» и изменим его на C2 описанным выше способом. После запуска
программы на выполнение в пошаговом режиме можно легко убедиться в том,
что в результате выполнения инструкции «283 011F D2A0 SETB _OUT_LED»
светодиод теперь не загорается или гаснет, если он был включен до этого.
Теперь удостоверимся в том, что произведенные изменения программы
действительно сохранились в «железе». Снимем все контрольные точки (это
важно!), закроем отладчик, отказавшись от предложения сохранить файл
сессии, отключим питание эволюционной платы, разомкнем перемычку X1 и
включим питание платы снова. Программа начнет выполняться с учетом
внесенных изменений, т. е. физическая модификация программной памяти
действительно имела место.
Любопытно, что если в сеансе отладки оставить в тексте листинга
программы контрольные точки, то они будут работать и в «железе»,
останавливая выполнение программы при попадании на них управления. В
этом легко убедиться, установив контрольную точку, например, в строке «272
0113 02010E LJMP La_OSN» и проделав все изложенное в предыдущем абзаце.
Теперь при нажатии на кнопку светодиод будет загораться, затем управление
попадет на адрес контрольной точки, и светодиод останется гореть до
проведения аппаратного сброса ADuC824.
Этот факт можно объяснить следующим образом. При установке
контрольной точки по некоторому адресу содержимое байта программной
памяти по этому адресу заменяется на значение A5, что сразу же отображается
в окне «Flash EE/Code» (рис. 2.11). Код команды по адресу 0113 LJMP La_OSN
Страницы
- « первая
- ‹ предыдущая
- …
- 132
- 133
- 134
- 135
- 136
- …
- следующая ›
- последняя »
