Analytics

пятница, 15 марта 2013 г.

Лекция №06: Отладка приложения

Режим отладки приложения, это одна из наиболее полезных возможностей при разработке ваших проектов. Что-ж, пришло время рассмотреть её поближе. Запустите CSS, откройте в нём мигалку и запустите режим отладки, кликнув на старого-доброго жука. Только в этот раз, не надо запускать приложение. Не жмите треугольник. Ведь нам нужен именно режим отладки. Сделали? Отлично. Теперь на вашем экране должно быть примерно тоже, что и на картинке. По умолчанию, в режиме отладки, открывается 4 активных окна. С двумя из них, мы уже знакомы. Нижнее - различная информация о ходе работы IDE:  сообщения компилятора, или информация о загруженном коде. Там много всякой ерунды :) Ну и среднее окно - собственно, это наш редактор. Его-то вы точно узнали.

Что касается оставшихся двух окон, "Debug" и "Variables/Expressions/Registers". Тут на самом деле, тоже ничего сложного. Окно "Debug" показывает наше текущее положение в иерархии нашего проекта. Звучит не очень понятно, как и выглядит, но не забивайте себе голову. Просто напросто наша программа состоит всего из одного файла - main.c(ну не считая хидера), так что иерархии-то как таковой и нет вовсе. Поэтому выглядит не наглядно. Чуть позже вы всё поймете. Что касается второго окна, в нем отображаются текущие значения переменных используемых в коде и значения регистров нашего микроконтроллера.


Play/Pause/Stop
Обратите внимание коллекцию иконок в окне отвечающем за отладку. Тут вы можете увидеть ту самую кнопку запуска приложения, которую нажимали в конце предыдущей лекции. Помимо неё тут присутствует кнопка "Пауза"(которая, кстати, не активна до тех пор, пока не нажмёте кнопку запуска), следом за ней идёт кнопка останова. В общем, все как в вашем любимом аудио или видео плеере, до боли знакомые "Play", "Pause" и "Stop" Не хватает только клавиш перемотки :) Или... хватает? 

Теперь о клавишах перемотки. Их есть у нас :) По крайней мере, ближайшие аналоги. Взглянем на следующее изображение. На нём изображен целый ряд иконок со стрелочками. Пока что, нас интересует только первая из них. Она называется "Step Into" что по русски звучит как "С шагом в ...". Именно эту кнопку сегодня мы и будем использовать. Причем крайне активно. Сразу после ряда иконок со стрелочками, есть кнопка на которой изображён процессор с двумя вращающимися стрелками. Эта кнопка сбрасывает наш MSP430 и возвращает отладчик в начало кода.


Примеры


Прежде чем мы приступим к отладке нашего кода, давайте внесём в код некоторые изменения. К примеру, в цикле, где организована задержка, поменяем число 60000 на 6. Особо догадливые, наверное, уже поняли зачем это, если вы не из их числа, то наберитесь немножко терпения. Скоро все станет очевидно. Итак, после того как вы внесёте изменения в код, скомпилируйте и залейте в микроконтроллер обновленную версию мигалки.

Примечание переводчика: в оригинальной статье на скриншотах есть какая-то волшебная кнопка которая автоматически в режиме отладки компилирует измененный код и загружает новую версию приложения в MSP430. В своей CCS я этой кнопки в упор не вижу, поэтому буду благодарен если вы мне её покажете. Если у вас её тоже нет, - действуйте по старинке. Останавливайте отладку, и заново загружайте код в МК. Good Luck, sugarcubes :3

Ну что-ж, пришло время для использования нашей заветной кнопочки "перемотки", она же "Step Into". Когда вы её нажимаете, управление передается следующей строке вашего кода. Клик - строка. Клик - строка. Все просто и очень удобно. Таким образом вы можете пошагово проследить выполнение программы. В самом начале отладки, курсор должен стоять на строке в которой вы выключаете сторожевой таймер. Заметьте, то что эта строка выделена, вовсе не значит, что она выполнилась. Скорей наоборот, она выполнится тогда и только тогда, когда вы перейдете к следующему участку кода. Кстати, вы уже заметили, что переменная count уже появилась в окне Variables? Нет? Так вот она там есть :) CCS загружает эту информацию автоматически, ещё до начала отладки. Эта переменная, кстати, скорее всего имеет какое-нибудь совершенно случайное значение. Оно и верно, ведь переменная-то ещё не инициализирована.


Прежде чем мы "выполним" строку меняющую значение регистра WDTCTL, давайте взглянем на ещё одно крайне полезное окно. Кликните на менюшку View->Registers и вы увидите ещё одно окно, в котором содержатся все регистры вашего устройства. (Это КРАЙНЕ полезная фича, обучаться работе с регистрами нашего микроконтроллера с помощью неё - просто сказка) Найдите в этом списке регистр Watchdog_Timer. Раскройте его и увидите тот самый регистр который вы вот-вот измените - WDTCTL. Отладчик показывает, что в данный момент, значение регистра WDTCTL - 0x6900 (помните, что префикс 0x означает шестнадцатеричные данные). Раскройте и этот регистр, чтобы посмотреть на значения конкретных битов. Как вы видите, все они обнулены при включении нашего микроконтроллера. Это означает то, что при таких настройках, сторожевой таймер будет выполнять свои прямые обязанности, а именно - сбрасывать наш МК с определенным интервалом. Нужно ли нам это? Сейчас - нет. Как мы исправим наше положение? Правильно - нажмем 'Step Into' чтобы внести изменения в наш регистр.
Классно, правда? Значение WDTHOLD изменилось на 1(а само поле пожелтело, сигнализируя о том, что за этот такт в регистре что-то изменилось) а сам WDTCTL теперь равняется 0x6980. Ничего не настораживает? Хорошо если да. Особо внимательные из вас должны помнить, что WDTCTL для изменения требует константу 0x5A(WDTPW), в то время как при попытке чтения этих битов, возвращаемое значение всегда 0x69. Вот такие пироги.

(Кстати, хотите выполнить форсированный сброс вашего микроконтроллера? Легко! Просто напишите с виду безобидную строку WDTCTL = WDTCTL. Ведь правая часть этого выражения, подразумевает чтение значений, а чтение первых восьми битов этого регистра всегда возвращает 0x69, в то время как запись(левая часть) требует 0x5A. Таким образом, получается то, что WDTPW записывается неверный. Ну, а когда наш MSP430 получает некорректный пароль, он моментально сбрасывается. Мало ли чего)

Попробуйте, найдите регистры первого порта(P1) и выполните следующие две строчки кода. Посмотрите, как изменяются значения регистров. Завораживает =) Теперь, "курсор" отладчика должен стоять на строке который переключает состояние светодиода. То есть включает если он выключен, и выключает если включен. Всё просто. Кстати, гляньте ещё разок на переменную count, она всё ещё содержит случайное значение. Настало время для знаменательного момента - жмём ещё раз F5(Step Into) и ... он загорелся! Сейчас курсор отладчика располагается на строке с циклом for который выполняет нашу задержку. Жмём F5 и проходим первую итерацию цикла. Тут-то переменная count наконец-то инициализирована. Как мы видим, она принимает значение 0. F5. Переменная count теперь 1. Таким образом, мы жмём F5 до тех пор(теперь прикиньте, если бы там до сих пор стояло 60000), пока не выйдем из цикла, перейдя на следующую итерацию вышестоящего for, где мы снова переключаем значение регистра P1OUT и выключаем светодиод. В любой момент времени, вы можете нажать кнопку Run и сложить управление на плечи MSP430. Чтобы тот мигал самостоятельно, без вашего вмешательства. Есть один нюанс - вы этого не заметите. Этот микроконтроллер достаточно быстр, чтобы ваш глаз попросту не заметил его подмигиваний с задержкой в 6 тактов :)

Как видите, отладчик  - крайне полезная вещь, но вам следует помнить, что он не всегда сможет вам помочь. MSP430 спроектирована для взаимодействия с окружающим миром. Отладчик, останавливая часики внутри нашего микроконтроллера, к сожалению не способен останавливать время нашей вселенной. Это влечёт некоторые нестыковки при попытке отладки приложений взаимодействующих с чем-то в режиме реального времени. В следующих лекциях, мы изучим то, как можно производить отладку приложений зависящих от тактов окружающего мира, но это будет потом :) Надеюсь, я смог вас убедить в том, что отладка это крайне удобная процедура не только для отлова ошибок, но и для обучения. Для визуализации того, что происходит внутри микроконтроллера, когда выполняется та или иная строка кода.

Собственно, друзья, теперь наших знаний вполне достаточно для того, чтобы писать свои собственные несложные программы, загружать их в микроконтроллер, вылавливать ошибки, с помощью отладчика, в общем-то, это уже довольно много! Поздравляю вас :)
Совсем скоро, мы начнём более углублённое изучение этого микроконтроллера. Ну, а пока что - побалуйтесь, попробуйте написать более сложные мигалки :)

Домашнее задание: попробуйте отладить код из лекции №04. Ведёт ли он себя так, как вы ожидали? Не забудьте изменить условие в цикле задержки, чтобы не жать F5 шестьдесят тысяч раз :) Убедитесь, что программа работает в точности так, как вы запланировали. 

Перевёл и дополнил: Александр Мошкин
Оригинал статьи: Tutorial 06. Getting the Bugs Out
Следующая лекция:
Предыдущая лекция: Лекция №05. Загружаем программу