
- •Основы языка си для микроконтроллеров avr
- •1. Основы языка Си для микроконтроллеров avr
- •Препроцессор языка Cи его команды
- •Директива #include
- •Директивы #define, #undef
- •Директивы #if, #ifdef, #ifndef, #else и #endif
- •Встроенные макросы
- •Директива #line
- •Директива #error
- •Директивы #asmи #endasm
- •Зарезервированные ключевые слова
- •Идентификаторы
- •Комментарии
- •Константы
- •Переменные
- •Массивы
- •Типы данных
- •Операнды и операции
- •Унарные операции
- •Бинарные операции
- •Приоритеты операций и порядок вычислений
- •Операторы
- •If-else
- •Оператор for
- •Do-while
- •Continue
- •Оператор-выражение
- •Пустой оператор
- •Составной оператор
- •Функции
- •Указатели
- •Доступ к регистрам ввода/вывода
- •Побитовый доступ к регистрам ввода/вывода
- •Доступ к eeprom-памяти
- •Использование прерываний
- •Организация памяти sram
Директива #line
Директиву #line можно использовать, чтобы изменить встроенные макросы
_LINE_и_FILE_ (см.1.1.4Встроенные макросы).
Синтаксис:
#1iпе целая_константа ["имя_файла"]
Пример:
/* Установим встроенный макрос _LINE_ в 25, а _FILE_ в "test.с" */
#line 25 "test.с"
/* Установим встроенный макрос _LINE_ в 36 */
#line 36
Директива #error
Директиву terror можно использовать, чтобы остановить компиляцию и отобразить сообщение об ошибках.
Синтаксис:
#errorсообщение;
Пример:
#error Здесь ошибка! // В этом месте компиляция будет остановлена и будет выдано сообщение: "Здесь ошибка!"
Директивы #asmи #endasm
Директивы #asmи #endasmможно использовать для включения в любом месте исходной программы ассемблерного кода.
Директива #asmговорит компилятору о начале ассемблерного кода, а директива #endasm— о его завершении.
Пример:
/* Вставка ассемблерного кода */
void main(void)
{
#asm // начало ассемблерного кода
sei ; // разрешаем глобальные прерывания
#endasm // окончание ассемблерного кода
}
Зарезервированные ключевые слова
Следующий список ключевых слов зарезервирован компилятором. Эти слова НЕ МОГУТ использоваться как имена идентификаторов.
break |
flash |
eeprom |
sfrw |
bit |
float |
else |
static |
case |
for |
enum |
struct |
char |
funcusd |
extern |
switch |
const |
goto |
register |
typedef |
continue |
if |
return |
union |
default |
inline |
short |
unsigned |
defined |
int |
signed |
void |
do |
interrupt |
sizeof |
volatile |
double |
long |
sfrb |
while |
Идентификаторы
Идентификатором является имя, которое даётся переменной, функции, метке или другому объекту. Идентификатор может содержать буквы латинского алфавита (A...Z,a...z) и цифры (0...9), а также символ подчеркивания (_), который считается буквой.
ИДЕНТИФИКАТОР может начинаться ТОЛЬКО с буквы или со знака подчеркивания.
При написании идентификатора имеет значение регистр, т. е. Temp,tempиTEMPбудут восприниматься компилятором как различные идентификаторы.
Максимальная длина идентификатора не должна превышать 31 символ.
В качестве идентификатора нельзя использовать зарезервированные ключевые слова (см. 1.2. Зарезервированные ключевые слова), а также имена функций библиотеки компилятора.
Комментарии
Комментарий — это набор символов, который компилятором игнорируется. Однако на этот набор символов накладываются следующие ограничения. Внутри набора символов, который представляет комментарий, не может быть специальных символов, определяющих начало (/*) и конец (*/). Комментарии могут занимать как одну строку, так и несколько.
Пример:
/* комментарии к программе */
/* начало алгоритма */
или
/*комментарии можно записать в следующем виде, однако следует быть осторожным, чтобы внутри последовательности, которая компилятором игнорируется, не попались операторы программы, которые также будут игнорироваться */
Константы
Константами называются перечисления величин в программе. В отличие от переменных такие имена нельзя изменять.
В языке Си разделяют четыре типа констант: целые константы, константы с плавающей точкой, символьные константы и строковые литералы.
Целая константа — это десятичное, двоичное, восьмеричное или шестнадцатеричное число, которое представляет целую величину в одной из следующих форм: десятичной, двоичной, восьмеричной или шестнадцатеричной.
Десятичная константа состоит из одной или нескольких десятичных цифр, причём первая цифра не должна быть нулем (в противном случае число будет воспринято как восьмеричное). Например, 9876.
Двоичная константа начинается с обязательной последовательностиOb и содержит одну или несколько двоичных цифр (цифры двоичной системы счисления: 0 или 1). Например, Оb1100.
Восьмеричная константа начинается с обязательного префикса 0 и содержит одну или несколько восьмеричных цифр (среди цифр должны отсутствовать восьмерка и девятка, так как эти цифры не входят в восьмеричную систему счисления). Например, 0123.
Шестнадцатеричная константа начинается с обязательной последовательности Ох или ОХ и содержит одну или несколько шестнадцатеричных цифр (цифры, представляющие собой набор цифр шеснадцатеричной системы счисления: (0...9,A,B,C,D,E,F). Например, Охеа или ОХЕА.
Константа с плавающей точкой (floating point) — десятичное число, представленное в виде действительной величины с десятичной точкой или экспонентой.
Число с плавающей точкой состоит из целой и дробной части и/или экспоненты. Константы с плавающей точкой представляют положительные величины удвоенной точности (имеют тип double). Для определения отрицательной величины следует сформировать константное выражение, состоящее из знака минуса и положительной константы.
Например: -1.6Е-3, -0.072, -0.16Е5.
Символьная константа (Character) — представляется символом, заключённым в одиночные кавычки. Значением символьной константы является числовой код символа.
Например: 'g'.
Строковая константа (String), илилитерал, — последовательность символов (включая строковые и прописные буквы русского и латинского алфавита, а также цифры), заключённых в кавычки («...»).
Например: «Сидоров А.Г.», «город С-Петербург», «АБВГ1234», «» (пустая строка). Строковый литерал имеет тип char[].
Константы могут быть сгруппированы в массивы, которые могут иметь до 8 измерений.
Чтобы определить константы, хранящиеся во FLASH-памяти, следует использовать ключевые словаflash илиconst.
Чтобы определить константы, хранящиеся в EEPROM, следует использовать ключевое словоeeprom.
Чтобы определить константы, хранящиеся в регистрах, следует использовать ключевое слово register.
Константные выражения автоматически определяются в течение компиляции.
Пример:
/* Эти константы будут расположены в EEPROM*/
eeprom int int_constl=12-7; // Целая константа int_constl будет равна 5
eeprom char char_const='b'; // Символьная константа char_const будет равна числовому коду ASCII символа 'b', т. е. 0x62
/* Эти константы будут расположены во FLASH-памяти */
flash long long_int_const=136L; // Целая длинная константа
// long_int_const будет равна 136
flash int int_array[10]={9,16}; // Этот целочисленный массив имеет 10 членов, причём первые два это 9 и 16, а остальные нули
const int int_const2=0123; // Целая константаint_const2 будет равна 123 в восьмиричном или 83 в десятичном виде
/* Эта константа будет расположена в регистре */
register int int_const3=0xl0; // Целая константаint_const3 будет равна 16 в десятичном или 10 в // шестнадцатеричном виде
/* Эти константы будут расположены в SRAM*/
int int_const4=0bl0; // Целая константаint_const4 будет равна 2 в десятичном или 10 в двоичном виде
char string_const[]="Hello!"; // Это строковая константа