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. Загружаем программу

Лекция №05: Загружаем программу

Примечание: мною было решено внести некоторые изменения в процесс перевода. Теперь я буду не просто переводить лекции, а адаптировать их под нынешние реалии. Нет никакого резона писать о микроконтроллерах и приложениях трёхлетней давности. Поэтому:
Приложение: Code Composer Studio 5.3.0
Микроконтроллер: msp430g2553. Enjoy.

В этой лекции мы поучимся пользоваться приложением от TI, под названием Code Composer Studio. Это IDE(интегрированная среда разработки) основанная на open-source проекте Eclipse.
Eclipse это замечательный инструмент, и вам непременно понравится использовать его для программирования вашего микроконтроллера :)
Wiki от TI содержит ссылку на загрузку данного программного обеспечения. Для того чтобы загрузить его, вам потребуется регистрация на TI, но это отнюдь не минус - пользуясь вашим аккаунтом, вы можете получать бесплатные примеры кода прямо от Texas Instruments. Да и скорее всего, вы уже там зарегистрированы, так что в этом особой проблемы не будет.
CCS в данном случае - совершенно бесплатна для вас. При запуске, вам будет предложено несколько вариантов лицензирования этого приложения, среди которых, имеется бесплатный - с ограничением на длину кода. Ограничение это составляет аж 16кб. Но стоит огорчаться, для нашего микроконтроллера это в самый раз :) Так что, вы можете со спокойной совестью пользоваться ограниченной версией CCS абсолютно бесплатно, не испытывая никакого дискомфорта. Даже кряк искать не надо ;) Впрочем, когда мы приступим к программированию и отладке, вы сами убедитесь в том, насколько малы наши приложения.

После установки CCS - запустите его. Студия спросит вас о том, где бы вы хотели расположить ваше рабочее пространство(воркспейс). Воркспейс это просто напросто директория в которой будут храниться все ваши проекты. Не больше и не меньше. Кстати говоря, позаботьтесь о том, чтобы в пути к дистрибутиву CCS не было кириллицы. Впрочем, вас об этом предупредят. Вы всегда можете изменить расположение вашего рабочего пространства, кликнув в меню 'File -> Switch Workspace -> ...'

Примечание: я использую англоязычную версию CCS в силу того что я понятия не имею, есть ли вообще в миру русскоязычная. Да и знать не хочу, честно говоря. Привыкайте к английскому ;)


Стартовый экран
Стартовый экран CCS 5.3.0
Для начала, выберите в качестве воркспейса что-нибудь типа 'Мои документы/MSP430 LaunchPad'
Как только вы закончите, перед вами появится стартовый экран, прямо как на этой картинке. Вы, конечно же, можете сразу же кликнуть на 'New Project', но все таки, если вы начинающий - стоит обратить внимание на ролик 'Getting Started'. Я его, кстати, так и не посмотрел, так как он мне почему-то предложил установить Adobe Flash Player, который у меня и так есть. Поэтому о содержании оного, мне остается лишь догадываться(да и лень вообще-то). Так что, в какой-то степени - вам повезло! Смотрите и наслаждайтесь :) Скорее всего, там вам дадут некоторые базовые понятия о данной IDE. 



Code Composer Studio
Как только вы почувствуете что вы готовы, и вас не смущает новое для вас программное окружение - закройте стартовый экран(вы всегда можете вернуться в него по меню Help->Welcome to CCS). Теперь вы в наедине с IDE. По началу, приложение не блещет разнообразием, выглядит довольно пустовато, согласитесь(честно говоря, скриншот был сделан уже после того как я поработал с IDE, поэтому не знаю как он выглядит изначально, но думаю - пустовато :Р), но не отчаивайтесь, скоро вам вообще места хватать не будет. Ну что же, приступим к созданию нашего первого проекта(Woo-Hoo!). Кликаем на 'File->New->CC Project' и введите имя вашего проекта. Не пишите "test" или подобную ерунду, имя программы должно отражать его суть. Кстати говоря, к названиям я предпочитаю добавлять суффикс, который показывал бы, для какой конкретно модели микроконтроллера расчитана данная программа. К примеру для нашей мигалки, это выглядит так: blinky_g2553. В пункте Output File выберите "Executable", остальные пункты подгоните подстать вашему микроконтроллеру, например: Family: MSP430, Variant: MSP430Gxxx Family, MSP430G2553. В пункте Connection обычно уже выставлено то что надо, при условии подключенной платы LaunchPad к вашему компьютеру. Жмём "Finish" и готово!



Исходный код мигалки ;)
Вот и наш редактор кода! Растяните окна так как вам удобно, и введите исходный код нашей мигалки. Ввели? Отлично. Теперь пришло время скомпилировать наш код. Вообще говоря, вовсе не обязательно компилировать вашу программу перед тем как загружать её в микроконтроллер. Но лучше всё таки побороть лень, и сделать это. Зачем? Ну, вам же будет проще, если все возможные ошибки вылезут наружу ДО того как вы приступите к отладке вашего приложения, не так ли?:) Для того чтобы скомпилировать программу, вам следует найти иконку с молотком и нажать на неё. Всё просто. Если вы не допускали ошибок по ходу написания программы, компиляция пройдет как по маслу. Кстати об этом. Вы наверное заметили, что при компиляции программы, внизу CCS появляется два дополнительных окна - "Console" и "Problems" так вот, если вы допустили какие-то ошибки в исходном коде, в окошке "Problems" компилятор на них укажет. Во втором же окне, отображается просто информация о ходе сборки. Ничего важного для нас там, пока что нет. 



Отладка нашей мигалки
Окей, всё хорошо, ошибок нет, код скомпилирован. Хватит дурить, пора заливать код в наш MSP430! Подключите ваш LaunchPad в USB порт. Если при установке CCS драйвера установились корректно и без ошибок, тогда просто кликните на иконку с жуком. Она рядом с молотком :) После нажатия, главное окно CCS полностью поменяется, заполнится всякими пока ещё непонятными окошечками и надписями. Впрочем, некоторые из них уже нам знакомы. Но сейчас не об этом. В общем, если питания поступающего от USB хватает, если драйвера установлены, то все должно пройти без заминки. Если же возникли какие-то проблемы, попробуйте переустановить CCS(или Windows) другого решения проблем в этой ОС я просто не знаю ;) Ладно, ближе к делу. Обратите внимание на окно с заголовком "Console". Там информация о нашей мигалке:

MSP430: Loading complete. Code Size - Text: 180 bytes Data: 2 bytes.

Это информация о загруженных в микроконтроллер данных. Обратите внимание - всего 182 байта. На MSP430G2553 доступно 16кБ. Подсчитайте, сколько таких мигалок туда влезет ;)

Вот вы нажали на "жучка" и затаив дыхание, с глуповатой улыбкой уставились на ваш LaunchPad. Ждёте что он замигает? Ха - нет. По крайней мере, не сразу. Дело в том, что наш отладчик останавливает выполнение программы сразу же после того как было подано питание(Power Up Reset, аббр.: PUC). В середине нашей CCS мы видим, что строка с кодом 
void main(void) {
выделена другим цветом. Так отображается то место в коде, на котором в данный момент остановлено выполнение программы. Возможно вас это несколько обескуражит, но это КРАЙНЕ полезная вещь. Что это такое и с чем это едят, мы рассмотрим в другой лекции. Сейчас же, все что нам надо, это наконец заставить мигать чёртов светодиод! Сказано - сделано :) Жмём зелёный треугольничек(или F8) и наслаждаемся. Треугольничек отключит режим отладки и передаст управление в руки MSP430. Yay! Наша мигалка работает. Мигать она должна с интервалом что-то около секунды. Кстаати, вот ещё что:
Если ваша мигалка вовсе не мигалка, а просто горящий светодиод, то вы немного ошиблись в коде. Держу пари, что для переменной count вы указали тип int, а не unsigned int как было сказано. В знаковом int'е просто напросто нет такой цифры - 60000, он не сможет до неё досчитать. Поэтому нужен беззнаковый - unsigned int.

Спасибо за внимание ;)


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

суббота, 9 марта 2013 г.

Без паники

В общем, к сожалению, я вам наврал. Сегодня я ничего не буду переводить. Потому что следующие статьи включают в себя активное использование IDE. Я - гентушник, у меня тулчейн скомпилирован + вим, мне этого хватает. Но для понимания всего остального, придется качать ИДЕ. Так как винда у меня есть только на работе, переводами я заниматься буду только тут :) Так что, возможно, продолжение будет где-то через трое суток. 

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

Между делом

Забавно складывается жизнь. Сейчас я вынужден читать свои же переводы, чтобы освоить азы. Я уже все забыл, что переводил. Чёртова прокрастинация :3 Возможно, что для кого-то будет хорошей новостью то, что я все таки продолжу переводить статьи. Да, я знаю, что на изиэлектрониксе их уже перевели, но: переводами этими я занимаюсь больше для себя, нежели для вас :) Мне так проще понять, так как когда переводишь, приходится очень глубоко вникать в написанное. Читая русские тексты, все несколько не так.
Большое спасибо тем, кто внес замечания по переводу, с завтрашнего дня я немножко причешу предыдущие статьи и приступлю к переводу следующей. Которая, кстати, довольно скучная, так как там рассматриваются IDE которыми я вообще не пользуюсь.
Ещё раз приношу свои извинения за ещё большую задержку. До скорой встречи.