Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
Имя переменной может быть произвольным, но оно не должно совпадать с зарезервированными в языке Си служебными словами:
auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, struct, switch, typedef, union, unsigned, void, volatile, while
Шесть слов из приведенного списка используются в Си для определения класса хранения переменной:
extern, auto, static, register, const, volatile
Программист может управлять размещением данных, поместив их либо в сегмент данных, либо в сегмент стека. Осуществляется это путём размещения объявлений данных в различных частях модуля программы на языке Си, что определяет так называемый класс хранения объекта, который в свою очередь задаёт время его жизни и область действия.
К внешнему классу хранения (extern) относятся переменные, определения которых в тексте программы размещены вне текста некоторого программного модуля, т.е. в другом файле. Переменные с внешним классом хранения размещаются в сегменте данных (т.е. в ОЗУ микроконтроллера) и сохраняются в течение всего времени выполнения программы. Областью действия переменной с внешним классом хранения является вся программа. Т.е. такая переменная доступна во всех функциях данного модуля и во всех других модулях программы.
Служебное слово auto определяет автоматический класс хранения переменной. Если при определении переменной указание на ее класс хранения отсутствует, т.е. ни одно из служебных слов не предшествует спецификации типа переменной, то по умолчанию переменной назначается автоматический класс хранения. Областью действия переменных с автоматическим классом хранения является функция (блок), в которой они определены, а также все вложенные функции (блоки). Автоматические переменные размещаются в сегменте стека на время выполнения функции, в которой они определены. После окончания выполнения функции память, отводимая под эти переменные (стек) освобождается и может быть использована для размещения других переменных. Таким образом, время жизни переменных с автоматическим классом хранения является время выполнения функции, в которой они определены. Эти переменные доступны для чтения или изменения только в тех функциях, в которых определены.
Служебное слово static в строке определения переменной обозначает статический класс ее хранения. Переменные с этим классом хранения имеют только одно отличие от переменных с автоматическим классом хранения. Статические переменные размещаются в сегменте данных (ОЗУ микроконтроллера) и сохраняют свои значения в промежутках между выполнением функций или блоков, в которых они определены. Таким образом, время жизни данных, относящихся к статическому классу хранения, совпадает с временем выполнения всей программы.
Если в определении переменной указано служебное слово register, то компилятор постарается создать код так, чтобы переменная размещалась в регистре центрального процессора. В основном это необходимо для увеличения быстродействия. Если регистры заняты (уже все используются), то переменная будет размещена в стеке, аналогично автоматическому классу хранения.
Служебное слово const указывается в определении переменных, значения которых не изменяются на протяжении исполнения программы. Эти переменные обычно помещаются в область ПЗУ микроконтроллера. Следует обратить внимание, что в некоторых аппаратных средствах отладки для инициализации начального значения переменной типа const должен быть использован режим программирования постоянной памяти микроконтроллера.
Класс хранения volatile назначается для тех переменных, которые могут изменять свое значение не в результате действия программы, а под управлением аппаратных средств микроконтроллера. Мы рассмотрим примеры с использованием переменных класса volatile при обсуждении приложений с использованием периферийных модулей МК 68HC12.
В процессе определения переменной, которое назначает область памяти и число байтов для ее хранения, можно также установить начальное численное значение этой переменной, т.е. инициализировать переменную. Например, определение целочисленной константы «change» со значением 23 может быть проведено посредством записи:
const int change = 23
После того, как мы научились задавать необходимые для использования в прикладной программе переменные, следует научиться выполнять арифметические и логические операции над этими переменными. Этим мы займемся в следующем параграфе.
3.3. Операторы языка Си
Язык Си обладает некоторым набором операторов, которые представлены в табл. 3.2. Полное множество операторов разбито на пять групп: общие, арифметические, логические, битовые манипуляции, унарные.
Операторы общей группы предназначаются для записи выражений на языке Си. Арифметические операторы предназначены для выполнения математических действий над переменными, таких как сложение, вычитание, умножение и деление. Логические операторы используются в выражениях для определения истинности некоторого условия. Битовые операции предназначены для модификации одного или нескольких битов переменной. Унарные операции используются для выполнения действий только над одной переменной.
В первой колонке табл. 3.2. указан приоритет оператора в том случае, если выражение содержит сразу несколько операторов. Приведем примеры последовательности применения операторов.
Приоритет в выражениях Имя оператора Символ для обозначения Общие 1 Скобки (), {} 1 Разделители -> , . 11 Условие ?: 12 Присваивание =, +=, *= и т.д. Арифметические 3 Умножение * 3 Деление / 3 Получение целочисленного остатка от деления % 4 Сложение + 4 Вычитание - Логические 6 Меньше < 6 Меньше или равно <= 6 Больше > 6 Больше или равно >= 7 Равно == 7 Не равно != 9 Логическое И && 10 Логическое ИЛИ || Битовые манипуляции 5 Сдвиг влево << 5 Сдвиг вправо >> 8 Поразрядное И & 8 Поразрядное исключающее ИЛИ ^ 8 Поразрядное ИЛИ | Унарные 2 Инверсия ! 2 Взятие обратного кода числа ~ 2 Инкремент ++ 2 Декремент -- 2 Минус - 2 Привести к типу (type) 2 Указатель * 2 Взять адрес & 2 Определить размер sizeofТабл. 3.2. Операторы языка Си