
Для обмена данными с основной программой используется глобальная переменная буфера команд cmd и флаг завершения приема команды cmPrinjata. Выберем длину буфера команд равной максимальной длине команды - шесть байтов.
Первое действие этой подпрограммы - обнуление флага запроса прерывания для того, чтобы разрешить дальнейшие прерывания от приемника последовательного порта. Затем принятый байт сохраняется в буфере команд. Для работы с буфером команд используется указатель, в который при запуске программы занесен адрес первого байта буфера команд.
При приеме очередного байта указатель переходит к следующему байту буфера команд. Использование указателя позволяет сделать подпрограмму обслуживания прерываниями максимально короткой, а это значит, ее выполнение будет занимать минимальное время, что и требуется от любой подпрограммы обслуживания прерывания.
Флаг завершения приема команды cmPrinjata устанавливается при обнаружении символа возврата каретки. Теперь необходимо подготовиться к приему следующей команды. Для этого в указатель ptr записывается адрес начального байта буфера обмена.
Работа с другими источниками прерываний происходит так же, как в рассмотренном примере. Подпрограмма обслуживания прерывания должна осуществить ввод или вывод информации, и не более того! Вся основная обработка информации будет проводиться в главной программе. Это делается с целью не пропустить очередное прерывание.
Итак, подведем итоги
В главе были рассмотрены языки программирования, применяющиеся при разработке программ для микроконтроллеров. При этом были рассмотрены преимущества и недостатки использования языков программирования высокого и низкого уровней. Для полноты картины было описано, что такое подпрограммы, виды подпрограмм и как можно ими пользоваться. При этом основной акцент сделан на использовании подпрограмм для структурирования программ. Особое внимание в главе было уделено комментариям к программе и различным способам их использования. Рассмотрено структурное программирование и примеры реализации структурных управляющих конструкций на различных языках программирования.
Особое внимание было уделено методу создания программ сверху вниз. Для этого был рассмотрен пример развития программы от построения программы-прототипа до детализации, достаточной для реализации устройства.
В главе были использованы некоторые интуитивно понятные конструкции языков программирования С и ASM-51. Однако для написания серьезных программ требуются более глубокие знания по этим языкам программирования, поэтому в последующих главах мы остановимся на этих языках подробнее.
Глава 8
Язык программирования ASM-51
Язык программирования ASM-51 поддерживает модульное написание программ. Графическое изображение процесса разработки программы на языке программирования ASM-51 приведено на рис. 8.1.

Рис. 8.1.Схема процесса написания программы на языке программирования ASM-51
Файл, в котором хранится программа, написанная на языке ASM-51 (исходный текст программы), называется исходным модулем. Его можно создать, используя любой текстовый редактор. Для файла исходного текста программы принято использовать следующие расширения: asm, а51, srs, s51.
Получить объектный модуль можно, указав имя исходного модуля программы в качестве параметра вызова программы-транслятора в DOS-строке или строке командного файла: asm51.exe modul.asm
Получить исполняемый модуль программы можно, указав все имена объектных модулей программы в качестве параметров вызова программы-редактора связей в DOS-строке или строке командного файла: bl51.exe main.obj, modull.obj, modul2.obj
Имя исполняемого модуля программы по умолчанию совпадает с именем первого объектного файла в списке параметров командной строки, используемой для запуска редактора связей. Исполняемый модуль программы записывается в файл с именем, но без расширения.
Большинство программаторов не может работать с объектным форматом исполняемого модуля программы, поэтому для загрузки машинного кода в микроконтроллер необходимо преобразовать объектный формат исполняемого модуля в общепринятый для программаторов НЕХ-формат. При таком преобразовании вся отладочная информация, содержащаяся в исполняемом модуле, теряется. Машинный код процессора, записанный в НЕХ-формате, называется загрузочным модулем.
Загрузочный модуль программы можно получить при помощи программы-преобразователя oh.exe, передав ей при вызове в качестве параметра имя файла исполняемого модуля, например: oh.exe main
После того как программные модули успешно оттранслированы, размещены по конкретным адресам и связаны между собой, для отладки программы можно воспользоваться внутрисхемным эмулятором. Это инструментальное средство позволяет отображать переменные программы на дисплее персонального компьютера и оказывает значительную помощь при отладке программ непосредственно на разрабатываемой аппаратуре.
Необходимое для отладки программ оборудование показано на рис. 8.2.

Рис. 8.2. Пример системы отладки программного обеспечения для микроконтроллеров
Отдельные участки программы могут быть отлажены и при помощи специальных программ-отладчиков (симуляторов).
Как эмуляторы, так и симуляторы предназначены для обнаружения логических ошибок, содержащихся в исходном тексте программы, поэтому после обнаружения ошибки приходится исправлять исходный текст и заново транслировать его для получения исправленной версии исполняемого или загрузочного модуля. Тем не менее, окончательная отладка программного обеспечения для разрабатываемого устройства производится только после записи загрузочного модуля в память микроконтроллерной системы. Именно на этом этапе находятся и устраняются последние ошибки, допущенные при написании программы.
Исходный текст программы на языке программирования ASM-51
Исходный текст программы представляет собой последовательность операторов языка программирования ASM-51, сгруппированных в сегменты и оформленных в виде файла.
Оператор - это базовая конструкция языка программирования, определяющая действия в программе. В языке программирования ASM-51 в одной строке может быть записан только один оператор! Максимальный допустимый размер строки - 255 символов. Признаком конца оператора является символ "возврат каретки", который вводится в текст про- программы при нажатии на клавишу <Enter> в конце строки.
Оператор языка программирования ASM-51 состоит из трех полей:
<поле метки> <поле операции> <поле комментария>
Любое из полей, в том числе и все поля, могут отсутствовать. Оператор, в котором все поля отсутствуют, называется пустым оператором. Он используется для увеличения наглядности программы. Пример оператора, записанного на языке программирования ASM-51, приведен на рис. 8.3.
Поле метки используется для записи меток. Метка представляет собой определяемое программистом имя, заканчивающееся двоеточием, и используется для организации условных и безусловных переходов, а также для объявления переменных и констант.
Если в операторе присутствует только метка, то она помечает ближайший следующий оператор, в котором присутствует инструкция процессора или директива ассемблера. Использование оператора, содержащего только метку, может быть вызвано либо слишком большой длиной самой метки, либо необходимостью присвоить одному непустому оператору нескольких меток. Наиболее яркий пример использования нескольких меток - это когда одна метка используется в качестве имени подпрограммы, а другая обозначает начало цикла. Пример использования оператора, содержащего только метку, приведен в листинге 8.1.

Поле операции используется для записи директивы языка или команды микроконтроллера. В последнем случае оно состоит из мнемонического обозначения команды и одного или нескольких операндов. При этом первый операнд всегда является приемником результата операции. Второй операнд всегда является источником данных для выполняемой операции. Если в команде для выполнения операции требуется два источника данных (например, операция суммирования), то первый операнд используется и в качестве источника и в качестве приемника данных.
В качестве операндов могут использоваться адреса ячеек памяти, обозначения регистров или метки операторов. Операнды отделяются друг от друга запятыми. Вместе с запятыми для увеличения читаемости программы допускается использование символов интервала (пробел или табуляция). Поле операции подробно показано на рис. 8.3.