Микроконтроллеры предназначены для миниатюризации устройств управления, поэтому они интересны, прежде всего, для разработчиков различной аппаратуры. Однако обычно у этих специалистов отсутствуют навыки программирования. В данной главе будут описаны основные принципы разработки программного обеспечения, причем основное внимание будет уделено особенностям построения программ для микроконтроллеров.
Основное внимание будет уделено методу структурного программирования, как наиболее подходящему для современного уровня развития микроконтроллеров. Кроме того, мы остановимся на особенностях построения программ, реагирующих на сигналы, поступающие извне, рассмотрим программную реализацию блоков, которые ранее выполнялись но, и взаимодействие программы с человеком.
Все современные программы пишутся на каких-либо языках программирования, поэтому начнем главу с обзора существующих языков программирования и программ-трансляторов этих языков.
Программирование для микроконтроллеров, как и программирование для универсальных компьютеров, прошло большой путь развития — от использования машинных кодов до применения современных интегрированных сред, предоставляющих встроенный текстовый редактор, обеспечивающих трансляцию программ, их отладку и загрузку во внутреннюю память микроконтроллеров. В настоящее время исходный текст программы пишется на каком-либо из языков программирования, относящемся к одной из двух групп:
— языки программирования «низкого» уровня;
— языки программирования «высокого» уровня.
Классификация языков программирования приведена на рис. 7.1.
Рис. 7.1.
В языках «низкого» уровня каждому оператору соответствует не более одной машинной команды. В их состав обязательно входит набор машинных команд каждого конкретного процессора. Языки программирования низкого уровня в настоящее время называются ассемблерами (старое название «автокоды»). Для каждого процессора существует своя группа ассемблеров. Ассемблеры для одного и того же процессора различаются между собой дополнительными возможностями, облегчающими программирование.
Языки программирования «высокого» уровня позволяют заменять один оператор несколькими машинными командами. Это увеличивает производительность труда программистов. Кроме того, языки «высокого» уровня позволяют писать программы, которые могут выполняться на различных микропроцессорах. (Естественно, что при этом необходимо использовать программы-трансляторы для соответствующего процессора.) В настоящее время для микроконтроллеров широко используются такие языки программирования высокого уровня, как
О преимуществах и недостатках языков высокого и низкого уровней говорилось достаточно много. Выбор языка программирования зависит от состава аппаратуры, для которой пишется программа, наличия тех или иных средств разработки программного обеспечения, а также от требуемого быстродействия всего программно-аппаратного комплекса в целом.
В тех случаях, когда объем ОЗУ и ПЗУ мал (в районе нескольких килобайтов), альтернативы ассемблеру нет. Именно этот язык программирования позволяет получать самый короткий и самый быстродействующий код программы (при прочих равных условиях, т. к. испортить можно все!).
Языки программирования высокого уровня позволяют значительно сократить время создания программы, но при этом увеличивается ее размер, поэтому использование такого языка программирования для микропроцессорных систем требует достаточно большого объема памяти программ (несколько десятков килобайтов). Увеличение объема программы связано с несколькими факторами:
1. Язык программирования рассчитывается на все случаи жизни, поэтому в большинстве случаев человек мог бы написать программу короче, исключив ненужные в данном конкретном случае проверки или защиты.
2. Если программист не знает, к чему приводит использование тех или других операторов языка программирования, то он может выбирать операторы, неоптимальные как с точки зрения длины машинного кода программы, так и с точки зрения быстродействия программы.
3. Программист не использует подпрограммы там, где они могли бы сократить объем программы, т. к. на языке программирования высокого уровня это всего один или несколько операторов.
Первый из этих пунктов постепенно утрачивает свое значение с появлением все более совершенных трансляторов. Третий пункт тоже решается тем же путем при применении различных видов оптимизаторов, входящих в состав компилятора. Однако в большинстве случаев оптимизатор не может определить одинаковые действия, если они отличаются хотя бы одной командой. Кроме того, оптимизатор работает только в пределах одного программного модуля! Понятие программного модуля будет рассмотрено позднее.