Символьная отладка программ для МК

За редким исключением программы для МК из-за содержащихся в них ошибок не начинают работать с первого раза и требуют отладки. К вопросам отладки разработчики относятся по-разному. Некоторые из них считают, что достаточно внимательно проанализировать исходный текст, посмотреть с помощью осциллографа, что происходит на выводах МК, и можно исправить все ошибки. Такой способ применим, если разработчик имеет большой опыт, отлично знает применяемый МК и располагает транслятором, который всегда генерирует правильный код (обычно это ассемблер), и достаточным временем.

Другие используют в своей практике самодельные отладочные мониторы — наборы специальных подпрограмм, загружаемых в МК вместе с основной программой. Последняя вызывает в контрольных точках подпрограммы монитора, а те выдают информацию о состоянии ресурсов МК. Таким способом можно отладить практически любую программу, но у него есть недостатки, которые могут оказаться существенными. Во-первых, отладочному монитору необходимо предоставить для работы часть ресурсов МК: как минимум — часть адресного пространства кода и некоторое число ячеек стека, а как максимум — еще и часть ОЗУ и периферийные устройства МК, используемые монитором для отображения информации. Выделить ресурсы отладочному монитору бывает непросто, если основная программа сама активно загружает МК. Например, у МК Р1С16С5х (Microchip) всего две ячейки стека, и использовать вызовы подпрограмм отладочного монитора затруднительно. Во-вторых, вызовы монитора отнимают время у основной программы и, следовательно, его нельзя вызывать из критичных ко времени частей программы. В-третьих, создание отладочного монитора, само по себе, требует времени.

Самый эффективный способ отладки программ для МК — применение специализированных профессиональных отладочных средств, к которым следует отнести отладчики-симуляторы и внутрисхемные эмуляторы.

Прежде чем рассказывать о возможностях, предоставляемых такими отладчиками, необходимо коснуться выбора компилятора, с помощью которого исходные тексты программ преобразуются в машинный код. В подавляющем большинстве случаев предпочтительно программирование на языке высокого уровня. Использование ассемблера необходимо, если к размеру и быстродействию генерируемого кода предъявляются очень жесткие требования. В настоящее время таких случаев становится все меньше, так как практически всегда можно взять более "быстрый" МК с большим объемом памяти. Кроме того, современные пакеты кросс-средств позволяют легко писать смешанные программы, где часть модулей написана на Си, а наиболее критичные к быстродействию части — на ассемблере. Компиляторы Си позволяют также вставлять в исходные тексты ассемблерные инструкции.

Каковы же преимущества программирования на Си по сравнению с программированием на ассемблере? Вкратце они заключаются в следующем:

—отпадает необходимость заботиться об операциях с числами большой разрядности. Компилятор автоматически сгенерирует правильный код для операции а+Ь, если а и b будут 8-, 16-, 32-битными числами, числами с плавающей запятой и даже числами разных типов;

—в комплекте с компилятором поставляется обширная библиотека функций (подпрограмм), реализующих различные математические операции (тригонометрические функции, возведение в степень и т. п.), работу с символьными строками, форматированный ввод/вывод и т. д.;

—многие ошибки программиста диагностируются компилятором: он, например, не позволит передать функции неверное число параметров или параметры неверных типов, забыть поставить оператор возврата и т. п.;

—исходный текст, написанный на Си, гораздо легче читается, он компактнее, легче модифицируется;

—программы, написанные на Си, легче переносятся на МК других семейств.

Чтобы эффективно отлаживать программы, написанные на языке высокого

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

—компилятор должен предоставлять достаточную информацию о структуре программы и используемых ею данных. Эту информацию называют символьной (отладочной);

—отладчик должен уметь интерпретировать эту информацию. Все современные компиляторы и ассемблеры в том или ином виде генерируют символьную информацию, но в настоящее время еще не разработано универсального формата, и каждый компилятор генерирует ее в собственном формате. Это создает дополнительные трудности для отладчиков, которые должны уметь "понимать" несколько символьных форматов.

Теперь рассмотрим, как отладчик должен интерпретировать символьную информацию и какие возможности должны в связи с этим предоставляться пользователю.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: