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

Шрифт
Фон

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

Рис. 8.4.Разбиение памяти программ и памяти данных на сегменты

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

- BSEG - абсолютный сегмент в области битовой адресации;

- CSEG - абсолютный сегмент в области памяти программ;

- DSEG - абсолютный сегмент в области внутренней памяти данных;

- ISEG - абсолютный сегмент в области внутренней памяти данных с косвенной адресацией;

- XSEG - абсолютный сегмент в области внешней памяти данных.

Директива bseg позволяет определить абсолютный сегмент во внутренней памяти данных с битовой адресацией по определенному адресу. Эта директива не назначает имени сегменту, т. е. объединение сегментов из различных программных модулей невозможно. Для определения конкретного начального адреса сегмента применяется атрибут AT. Если атрибут AT не используется, то начальный адрес сегмента предполагается равным нулю. Использование битовых переменных позволяет значительно экономить внутреннюю память программ микроконтроллера.

Пример использования директивы BSEG для объявления битовых переменных приведен в листинге 8.24.

Занимательно о микроконтроллерах

Директива cseg позволяет определить абсолютный сегмент в памяти программ по определенному адресу. Директива не назначает имени сегменту, т. е. объединение сегментов из различных программных модулей невозможно. Для определения конкретного начального адреса сегмента применяется атрибут at. Если атрибут AT не используется, то начальный адрес сегмента предполагается равным нулю. Пример использования директивы CSEG для размещения подпрограммы обслуживания прерывания от таймера 0 приведен в листинге 8.25.

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

Директива dseg позволяет определить абсолютный сегмент во внутренней памяти данных по определенному адресу. Предполагается, что к этому сегменту будут обращаться команды с прямой адресацией. Эта директива не назначает имени сегменту, т. е. объединение сегментов из различных программных модулей невозможно. Для определения конкретного начального адреса сегмента применяется атрибут AT. Если атрибут at не используется, то начальный адрес сегмента предполагается равным нулю. Пример использования директивы DSEG для объявления байтовых переменных приведен в листинге 8.26.

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

Последний пример связан с примером, приведенным в листинге 8.24. То есть команды, изменяющие битовые переменные RejInd, RejPriem или Flag, одновременно будут изменять содержимое переменной Rejim, и наоборот команды, работающие с переменной Rejim, одновременно изменяют содержимое флагов RejInd, RejPriem или Flag. Такое объявление переменных позволяет написать наиболее эффективную программу управления контроллером и подключенными к нему устройствами.

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

Напомню, что адресное пространство внутренней памяти с косвенной адресацией в два раза больше адресного пространства памяти с прямой адресацией. Именно в этой области памяти размещается стек. Директива ISEG не назначает имени сегменту, т. е. объединение сегментов из различных программных модулей невозможно. Для определения конкретного начального адреса сегмента применяется атрибут AT. Если атрибут AT не используется, то начальный адрес сегмента предполагается равным нулю. Пример использования директивы ISEG для объявления байтовых переменных приведен в листинге 8.27.

Занимательно о микроконтроллерах

Директива xseg позволяет определить абсолютный сегмент во внешней памяти данных по определенному адресу. Эта директива не назначает имени сегменту, т. е. объединение сегментов из различных программных модулей невозможно. Для определения конкретного начального адреса сегмента применяется атрибут AT. Если атрибут AT не используется, то начальный адрес сегмента предполагается равным нулю. До недавнего времени использование внешней памяти не имело смысла, т. к. это значительно увеличивало габариты и цену устройства. Однако в последнее время ряд фирм стал размещать на кристалле значительные объемы ОЗУ, доступ к которому осуществляется как к внешней памяти. Так как эта директива применяется так же, как DSEG, то отдельный пример приводиться не будет.

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

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

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

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

- data - размещает сегмент во внутренней памяти данных с прямой адресацией;

- idata - размещает сегмент во внутренней памяти данных с косвенной адресацией;

- bit - размещает сегмент во внутренней памяти данных с битовой адресацией;

- xdata - размещает сегмент во внешней памяти данных;

- code - размещает сегмент в памяти программ.

После определения имени сегмента можно использовать этот сегмент при помощи директивы rseg.

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

Использование сегмента зависит от области памяти, для которой он предназначен. Если это память данных, то в сегменте объявляются байтовые или битовые переменные. Если это память программ, то в сегменте размещаются константы или участки кода программы. Пример использования директив segment и rseg для определения байтовых переменных во внутренней памяти данных с косвенной адресацией приведен в листинге 8.28.

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

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

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

Еще один пример использования директив segment и rseg приведен в листинге 8.29. В этом примере директива segment используется для определения сегмента битовых переменных.

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

0
Шрифт
Фон

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