Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / ТСАиУ.doc
Скачиваний:
57
Добавлен:
22.02.2014
Размер:
1.28 Mб
Скачать

5.1 Некоторые положения языка с, наиболее часто применяемые при программировании контроллеров.

Выбор язык программирования часто зависит от того, какой компилятор имеется в распоряжении разработчика. Так как мы имеем демоверсию автоматического синтезатора программ на языке С CodeVision AVR, то и рассмотрим основные положения этого языка, часто применяемого при программировании контроллеров.

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

Для задания этих действий в языке определены алфавит, списки ключевых (служебных слов), констант, разделителей, операций. Из этих элементов на основании определённых правил создаются конструкции, называемые выражениями, определениями, описаниями, операторами, функциями и т.д.

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

тип_функции имя_функции

(спецификация_формальных_параметров) тело_функции

Тип функции (тип возвращаемого значения) - это тип данных, полученных в результате выполнения функции. Имя функции (идентификатор) должно быть уникальным среди других имён модуля, в котором используется функция.

Спецификация формальных параметров - это либо пусто ( ), либо void - свободно, либо список имён параметров с указанием типа. Допускается резервировать место в списке параметров, указывая только его тип, если параметр не используется в теле функции.

Тело функции - это составной оператор или блок (последовательность описаний и операторов), заключённый в фигурные скобки. В теле функции может присутствовать оператор возврата в точку вызова return или return выражение, которое определяет возвращаемое функцией значение. Если тип функции void, то выражение и оператор return могут быть опущены.

Синтаксис описания (прототипа) функции отличается от синтаксиса определения наличием точки с запятой в конце описания и необязательностью имён формальных параметров:

Тип_функции имя_функции

(спецификация_формальных_параметров);

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

имя_функции (список_фактических_параметров)

Соответствие между списками формальных и фактических параметров определяется их взаимным расположением. Для передачи фактических параметров вычисляется значение каждого аргумента и это значение используется в теле функции вместо формального параметра.

Рассмотрим теперь по порядку понятия, входящие в определение функции.

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

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

Таблица 5.1

Тип данных

Размер, байт

Unsigned char - беззнаковый символьный

1

Char - символьный

1

Unsigned int - беззнаковый целый

2

Short int - короткий целый

2

Int - целый

2

Unsigned long - беззнаковый длинный целый

4

Long - длинный целый

4

Float - вещественный

4

Double - вещественный с удвоенной точностью

8

Long double - длинный вещественный с удвоенной точностью

10

Void - отсутствие значения

Имя функции или параметра - это идентификатор, то есть последовательность из букв латинского алфавита, десятичных цифр и символов подчёркивания, начиняющаяся не с цифры. В языках высокого уровня, таких как С и С++ имя связывается с именованной областью памяти.

Тело_функции - это совокупность операторов и описаний, заключённых в фигурные скобки.

Операторы определяют действия (операции) с данными различных типов и порядок их выполнения в программе. Знаки операций определены стандартом ANSI. Рассмотрим некоторые из них [23].

Унарные операции

& операция получения адреса,

* операция обращения по адресу,

~ операция поразрядного (побитового) инвертирования,

! логическое отрицание значения операнда,

++ инкремент (увеличение на единицу) значения операнда,

- - декремент (уменьшение на единицу) значения операнда,

Бинарные операции

+ сложение арифметических операндов,

- вычитание арифметических операндов,

* умножение арифметических операндов,

/ деление арифметических операндов, результат округляется до целого,

% получение остатка от деления целочисленных операндов

<< сдвиг влево битового представления левого целочисленного операнда на число разрядов, равное значению правого операнда,

>> сдвиг вправо битового представления левого целочисленного операнда на число разрядов, равное значению правого операнда,

& поразрядная конъюнкция (И) битовых значений операндов,

| поразрядная дизъюнкция (ИЛИ) битовых значений операндов,

^ поразрядное исключающее ИЛИ битовых значений операндов,

&& конъюнкция (И) арифметических операндов или отношений,

целочисленный результат 0 или 1,

|| дизъюнкция (ИЛИ) арифметических операндов или отношений,

целочисленный результат 0 или 1.

Совокупности операторов образуют следующий функционально полный набор управляющих структур: последовательную, структуру выбора, структуру цикла. Рассмотрим примеры.

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

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

Фрагмент управляющей программы для контроллера Atmel AT90S2313 – пример составного оператора. Используемый составной оператор осуществляет ввод / вывод информации через порт В, предназначенный для параллельного обмена. Команда поступает в параллельном коде от внешнего шифратора через порт В. Для приёма команды используются выводы В4 - В7 порта В, а для передачи команды используются выводы В0 - В3 того же порта

DDRB=0x0F; //Выводы В0 - В3 порта В настроены на "ВЫХОД",

//Выводы В4 - В7 порта В настроены на "ВХОД",

{PORTB=PINB; //Приём команды в регистр данных порта В

com=PORTB; //Переменной com присвоен код команды

com=com>>4; //Сдвиг кода команды на 4 разряда вправо

PORTB=com;} //Передача команды исполнительным механизмам

В этом составном операторе поименованным регистрам порта В присваиваются некоторые константные значения. В языке С могут использоваться десятичные, восьмеричные и шестнадцатеричные числа. Десятичными константами называется последовательность десятичных цифр, начинающихся не с 0. Восьмеричная константа начинается с 0, а шестнадцатеричная – с префикса 0х. Таким образом, в результате выполнения операции DDRB=0x0F, в регистре DDRB будет записана двоичная последовательность 00001111.

Структура выбора представлена условным оператором (if... else) и переключателем (switch). Синтаксис условного оператора: