В этом примере объявлен массив buferKlav, состоящий из восьми байтовых переменных. Кроме того, в данном примере объявлена переменная Vershsteka, соответствующая последней ячейке памяти, используемой для хранения переменных. Переменная Vershsteka может быть использована для начальной инициализации указателя стека для того, чтобы отвести под стек максимально доступное количество ячеек внутренней памяти. Это необходимо для того, чтобы избежать переполнения стека при вложенных вызовах подпрограмм.
Объявление и использование сегментов данных в области внутренней или внешней памяти данных не отличается от приведенного в последнем примере за исключением ключевого слова, определяющего область памяти данных.
Еще один пример использования директив segment и rseg приведен в листинге 8.29. В этом примере директива segment используется для определения сегмента битовых переменных.
Наибольший эффект от применения сегментов можно получить при написании основного текста программы с использованием модулей. Обычно каждый программный модуль оформляется в виде отдельного перемещаемого сегмента. Это позволяет редактору связей скомпоновать программу оптимальным образом. При использовании абсолютных сегментов памяти программ пришлось бы это делать вручную, а т. к. в процессе написания программы размер программных модулей постоянно меняется, то пришлось бы вводить защитные области неиспользуемой памяти между программными модулями.
Пример использования перемещаемых сегментов в исходном тексте программы содержится в листинге 8.30. В этом примере приведен начальный участок основной программы микроконтроллера, на который производится переход с нулевой ячейки памяти программ. Использование такой структуры программы позволяет в любой момент времени при необходимости использовать любой из векторов прерывания, доступный в конкретном микроконтроллере, для которого пишется эта программа. Достаточно поместить определение этого вектора с использованием директивы cseg.
В приведенном примере использовано имя перемещаемого сегмента _code. Оно было объявлено в самой первой строке исходного текста программы. Конкретное имя перемещаемого сегмента может быть любым, но, как уже говорилось ранее, оно должно отображать ту задачу, которую решает данный конкретный модуль.
В данной главе рассмотрены основные средства языка программирования ASM-51, достаточные для написания довольно сложных программ, однако в процессе работы может потребоваться дополнительная информация, которую можно получить в описании языка программирования, поставляемом вместе с самой программой-транслятором.
Язык программирования ассемблер позволяет разрабатывать самые компактные и эффективные программы, однако процесс создания программ на этом языке трудоемкий, а это значит, что он занимает достаточно длительное время. В то же время сейчас предлагаются, причем по приемлемой цене, микросхемы с внутренними ресурсами, достаточными для размещения и выполнения программ, написанных на языке высокого уровня. Поэтому в настоящее время программы все чаще создаются на языке С как наиболее распространенном для микроконтроллеров. В следующей главе мы рассмотрим один из таких языков программирования — С-51.
Глава 9
Язык программирования С-51
С — это язык программирования общего назначения, предназначенный для написания программ, эффективных по исполняемому коду, с элементами структурного программирования и богатым набором операторов. Это позволяет использовать его для эффективного решения широкого круга задач. Однако при написании программ для микроконтроллеров, принадлежащих к семейству MCS-51, необходимо учитывать особенности построения аппаратуры этих микросхем, поэтому создан диалект этого языка, С-51.
В состав языка программирования С-51 введен ряд изменений, отображающих особенности построения памяти микроконтроллеров семейства MCS-51. Кроме того, эти изменения позволяют непосредственно обращаться к встроенным портам, таймерам и другим устройствам микроконтроллеров указанного семейства. Особенности микроконтроллеров этого семейства в основном отображаются через описания переменных.
Язык программирования С-51 удовлетворяет стандарту ANSI–C и предназначен для получения компактных быстродействующих программ для микроконтроллеров семейства MCS-51. Язык С-51 обеспечивает гибкость программирования на широко известном языке С, при скорости работы и компактности, сравнимой с программами, написанными на ассемблере.
Так как язык программирования С не имеет собственных средств ввода и вывода, то он обращается к соответствующим функциям операционных систем. В языке программирования С-51 вместо этого имеется возможность изменять библиотечные функции, и тем самым обращаться к конкретным ячейкам памяти микроконтроллера, для которого пишется программа.