Типы переменных языка C при использовании AVR-GCC (WinAVR) Печать
Добавил(а) microsin   

Для программирования на языке C для микроконтроллеров AVR очень важно понимать типы, используемые в AVR-GCC (WinAVR), что заслуживает более глубокого рассмотрения. Правильный выбор типа переменной иногда может быть критическим при разработке программного обеспечения (firmware) для встраиваемых систем, поскольку ресурсы микроконтроллера обычно весьма ограничены. Правильный выбор типа переменной может сократить код, сохранить пространство памяти программ, и может ускорить выполнение программы.

[Типы char, unsigned char (байт, 8-разрядные типы)]

Какой общий используемый тип в 8-битной системе (ядро AVR как раз 8-битное)? Конечно же, это байт, или тип char, unsigned char. Поскольку 8-разрядные типы полностью соответствуют регистрам и ячейкам памяти AVR, это самый эффективный тип, который желательно использовать как можно чаще. Имя char произошло от слова "character" (символ, буква), потому что обычно тип char использовался для сохранения кода цифробуквенных символов английского (и позже русского) алфавита (ASCII). Тип char может хранить значения в диапазоне от -128 до +127 (дополнительный код, где информацию о знаке числа несет старший бит D7). Тип unsigned char может принимать значения от 0 до 255. Некоторые компиляторы могут использовать тип byte вместо типа unsigned char.

[Типы, определенные пользователем]

Язык C позволяет программисту определить свои типы данных (user types). Это могут быть как простые типы, целочисленные и с плавающей точкой, так и более сложные, такие как структуры. Для создания пользовательских типов применяется ключевое слово typedef:

typedef unsigned char byte; //создание типа - байт
typedef unsigned int word;  //создание типа - слово (для AVR это 2 байта)

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

typedef стандартный_тип пользовательский_тип;

Компилятор WinAVR (точнее говоря, поставляемые вместе с ним библиотечные заголовки) имеют некоторые заданные пользовательские типы, которые стали стандартом де-факто:

typedef signed char int8_t;                //находится в файле заголовка inttypes.h
typedef unsigned char uint8_t;             //находится в файле заголовка inttypes.h
typedef int int16_t;                       //находится в файле заголовка inttypes.h
typedef unsigned int uint16_t;             //находится в файле заголовка inttypes.h
typedef long int32_t;                      //находится в файле заголовка inttypes.h
typedef unsigned long uint32_t;            //находится в файле заголовка inttypes.h
typedef long long int64_t;                 //находится в файле заголовка inttypes.h
typedef unsigned long long uint64_t;       //находится в файле заголовка inttypes.h
typedef struct {int quot; int rem} div_t;  //находится в файле заголовка stdlib.h.
                                           //используется для стандартной функции ldiv();