Александр Микушин - Занимательно о микроконтроллерах стр 38.

Шрифт
Фон

Виды компиляторов

Программы-компиляторы бывают оценочные и профессиональные.

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

Конечно, если программа очень проста, то можно весь программный продукт выполнить на оценочном компиляторе. Оценочные компиляторы позволяют транслировать одиночный файл исходного текста программы. Иногда такие компиляторы позволяют включать в процесс трансляции содержимое отдельных файлов специальной директивой.

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

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

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

При многомодульном программировании процесс получения исполняемого кода программы разбивается на два этапа: компиляция исходного текста модулей (некоторых или всех) и связывание (компоновка) полученных объектных файлов модулей в единую программу. Такой процесс получил название раздельная компиляция-компоновка.

Оценочные компиляторы обычно предлагаются бесплатно фирмами - производителями микроконтроллеров.

Профессиональные компиляторы разрабатываются и продаются независимыми фирмами - разработчиками программного обеспечения. Для микроконтроллеров семейства MCS-51 получили известность продукты таких фирм, как FRANKLIN, IAR, KEIL и др.

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

Теперь, после того как были рассмотрены языки программирования для микроконтроллеров и программы-трансляторы, перейдем к рассмотрению основных принципов написания программ.

Применение подпрограмм

В программах часто приходится повторять одни и те же операторы (например, при реализации алгоритма работы с параллельным или последовательным портом). Было бы неплохо использовать один и тот же участок кода, вместо того, чтобы повторять одни и те же операторы несколько раз.

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

Проблема, с которой приходится сталкиваться при многократном использовании участков кодов, - как определить, в какое место памяти программ возвращаться после завершения подпрограммы. Обращение к подпрограмме производится из нескольких мест основной программы.

Описанную ситуацию иллюстрирует рис. 7.2. На нем изображено адресное пространство микроконтроллера. Младшие адреса адресного пространства находятся в нижней части рисунка.

Александр Микушин - Занимательно о микроконтроллерах

Рис. 7.2.Вызов подпрограммы и возврат к выполнению основной программы

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

Для обращения к подпрограмме и возврата из нее в систему команд микропроцессоров вводят специальные команды. В микроконтроллерах семейства MCS-51 это команды LCALL, ACALL для вызова подпрограммы и команда RET для возврата из подпрограммы. Команды вызова не только осуществляют передачу управления на указанный адрес, но и запоминают адрес команды, следующей за вызовом подпрограммы - адрес возврата. Команда возврата из подпрограммы передает управление по адресу возврата, которой был запомнен при вызове подпрограммы.

Пример вызова подпрограммы и ее реализации на языке программирования ASM-51 приведен на листинге 7.1.

Александр Микушин - Занимательно о микроконтроллерах

Внимание! Ни в коем случае нельзя попадать в подпрограмму любым способом кроме команды вызова подпрограммы CALL! В противном случае команда возврата из подпрограммы передаст управление случайному адресу! По этому адресу могут быть расположены данные, которые в этом случае будут интерпретированы как программа, или обратиться к внешней памяти, откуда будут считываться случайные числа.

В приведенном в листинге 7.1 примере перед подпрограммой обязательно должен быть бесконечный цикл. Иначе в подпрограмму можно попасть не через вызов подпрограммы, а при последовательном выполнении операторов. Тогда команда ret передаст управление на случайный адрес. Это может привести к непредсказуемым последствиям. При особенно неблагоприятных обстоятельствах даже к выходу микропроцессорной системы из строя. В программах, которые пишутся для микроконтроллеров, требуется обеспечить бесконечный цикл для того, чтобы программа никогда не завершала свою работу. Если основная программа микроконтроллера с бесконечным циклом будет располагаться до первой из подпрограмм, то приведенное условие будет выполняться автоматически.

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

Стек, его организация и структура

Адреса возврата из подпрограмм хранятся в области памяти, называемой стеком. Логически доступ к этим ячейкам памяти организован так, чтобы считывание последнего записанного адреса возврата производилось первым, а первого - последним. Логическая организация стека пояснена на рис. 7.3. Адресация ячеек стека осуществляется с использованием специального регистра, называемого указателем стека, SP. Ячейка памяти, в которую в данный момент может быть записан адрес возврата из подпрограммы, называется вершиной стека. Ее адрес всегда хранится в указателе стека. Количество ячеек памяти, выделенных для стека, называется глубиной стека. Последняя ячейка стека, в которую можно производить запись, называется дном стека.

Александр Микушин - Занимательно о микроконтроллерах

Рис. 7.3.Организация стека в памяти данных микропроцессора

Первоначально стек выполнялся аппаратно на отдельных ячейках памяти, затем его стали размещать в обычной памяти данных микропроцессоров. Это позволило в каждом конкретном случае устанавливать необходимую для программы глубину стека. Оставшуюся память можно использовать для размещения глобальных и локальных переменных программы. Глубина стека устанавливается при помощи записи начального адреса вершины стека в регистр SP. Обычно глубина стека устанавливается один раз после включения питания в процедуре инициализации контроллера.

Например, в микроконтроллерах семейства MCS-51 при занесении информации в стек содержимое указателя стека увеличивается (стек растет вверх), поэтому стек размещается в самой верхней части памяти данных.

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

DnoSteka EQU 127 ; для микроконтроллера АТ89с51 размер внутренней памяти равен 128 байтам

MOV SP, #DnoSteka - 28 ;Установить глубину стека 28 байт

Кроме значения программного счетчика, часто требуется запоминать содержимое внутренних регистров и флагов процессора, локальных переменных подпрограммы. Стек оказался удобным средством и для решения этих задач. Сохранение локальных переменных в стеке позволило осуществлять вызов подпрограммы самой из себя (реализовывать рекурсивные алгоритмы). Для работы со стеком в систему команд микропроцессоров введены специальные команды. У микроконтроллеров семейства MCS-51 это команды PUSH и POP. Их использование показано в листинге 7.2.

Александр Микушин - Занимательно о микроконтроллерах

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке