Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[2]

суффиксы. Так суффикс "l" или "L" показывает, что литерал должен рассматриваться как принадлежащий к типу long. Суффикс "u" или "U" указывает компилятору, что рассматриваемое целое значение не имеет знака (тип целое без знака). Возможно использовать комбинацию суффиксов. Результат, получаемый при этом, вполне предсказуем.

Если константа не может быть соотнесена ни с одним из целых типов, то она рассматривается как double. Чтобы явно указать ее принадлежность к типу float, что кроме прочего экономит память, необходимо воспользоваться суффиксом "f" или "F".

Символьные константы (char) записываются в одинарных кавычках типа a и могут быть размещены в переменных типа char. многобайтные символьные константы и переменные не поддерживаются.

Строковые литералы (константы) записываются в двойных кавычках, например "мама мыла раму". Строковые константы сохраняются как const char * в ПЗУ. Рассмотрим следующие примеры:

char * cp= "one";

const char * ccp = "two"; char ca[]= "two";

В первом случае указатель не const в результате чего будет выведено соответствующее предупреждение. Второй пример совершенно корректен и приведет к формированию в ПЗУ указанной строчки, а доступ к ней можно будет получить посредствам указателя ccp. Последний пример надо рассмотреть особо. Так в этом случае мы хотим получить строковую переменную (строку, размещенную в ОЗУ и позволяющую производить модификации). В этом случае будет создан код, который при запуске программы будет выделять в ОЗУ массив требуемого размера и переносить в него из ПЗУ указанную строку.

2.3 Тип данных - бит

Как уже несколько раз отмечалось, операции с битами имеют важное значение и часто используются при программировании микроконтроллеров. Чтобы обеспечить максимальное удобство программиста при решении задач, связанных с манипуляциями отдельными битами, был введен дополнительный тип данных - бит (bit). Переменные этого типа описываются как обычно: static bit over flag;

переменные типа бит не могут иметь модификатор auto и не могут передаваться в функцию в качестве аргумента, но функция может возвращать значение типа бит. По большому счету переменные этого типа ведут себя как обычные переменные типа unsigned char, но при этом могут принимать значение 0 или 1. Поэтому их удобно использовать для определения различных логических переменных и флагов. Такой подход значительно экономит оперативную память. Компилятор не позволяет создавать указатели типа бит или статически инициализировать переменные этого типа. Все операции с переменными типа бит выполняются с помощью бит-ориентированных инструкций ассемблера, насколько это вообще возможно, при этом создается очень эффективный и компактный код.

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

bitvar = char var != 0;

Все переменные этого типа упаковываются таким образом, что 8 переменных займут до одного байта.


2.4 Использование бит-адресуемых регистров

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

static unsigned char STATUS @ 0x03;

При описании битовых переменных с указанием абсолютного адреса необходимо указывать абсолютный номер бита в непрерывном битовом поле, которое образуется из последовательности регистров. Например 3-тий бит в ячейке памяти с адресом 5 будет иметь абсолютный номер равный 5*8+3. Таким образом, если мы хотим эксклюзивно обращаться к биту PD регистра STATUS, то достаточно совершить следующий реверанс:

fstatic bit PD @ (unsigned)&STATUS*8 + 3;

Справедливости ради, хочу напомнить, что все стандартные регистры и служебные биты уже описаны до нас и за нас в файле заголовка <pic.h>.

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

#definePORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit))

Используя этот скрипт, вы упрощаете себе жизнь и повышаете читабельность ваших программ:

fstatic bit PD @ PORTBIT(STATUS, 3);

или более жизненный пример:

static unsigned char ptKeys @ &PORTB; static bit btLeft @ PORTBIT(ptKeys, 0); static bit btRight @ PORTBIT(ptKeys, 1); static bit btDown @ PORTBIT(ptKeys, 2); static bit btUp @ PORTBIT(ptKeys, 3);

2.58-бит - целые

Компилятор PIC C поддерживает символьный тип как с указанием знака так и без. Для микроконтроллеров среднего класса этот тип является основным. По-умолчанию символьный тип (char) считается без учета знака. Чтобы это изменить можно воспользоваться опцией компилятора SIGNEDCHAR. Если использован указанный параметр, то возможно использование целых с учетом знака в диапазоне от -128 до +127 включительно или без учета знака (unsigned) от 0 до 255 включительно. В ламерской среде существует предрассудок, что тип данных char предназначен исключительно для хранения кодов символов ASCII. Но это глубокое заблуждение, тем более теперь, когда повсеместно применяются 16-и битовые кодировки. Реально же тип char это наименьший из существующих целых типов и ничем не отличается от своих больших собратьев. Исторически сложилось так, что на компьютерах, где С получил наибольшее распространение использовались кодировки, для которых тип char был идеальным хранилищем символов. Использовать же его для хранения чисел было не выгодно, так как адресация памяти была как минимум словами (16 бит), да и диапазон маловат для прикладных ПС программ. А вот для контроллера (конкретно того семейства о котором идет речь в этом труде) char - это родной тип и с ним он работает очень эффективно. Так что, если вы планируете использовать С для разработки встроенных систем на базе PIC-контроллеров, то привыкайте использовать тип char как основной.

2.616-бит - целые

Для представления 16-и битных данных в PIC C есть 4 типа short, int, unsigned short,


unsigned int. Котрые могут вмещать числа из диапазонов от -32768 до 32767 с учетом знака и от 0 до 65535 без учета знака. Как мы видим, в PIC C два типа int и short практически не имеют отличий. Это связано со стремлением соответствовать стандартам. И это очень серьезный довод, тем более что 8-ми битные целые числа поддержаны в полном объеме посредствам типа char, поэтому последний рекомендуется использовать вместо int, где это только возможно.

2.732-бит - целые

Компилятор PIC C поддерживает два вид целых 32 битных чисел - long и unsigned long. Они могут содержать числа от -2,147,483,648 до 2,147,483,647 включительно и от 0 до 4,294,967,295 соответственно. В соответствии со стандартом ANSI на язык С, 32 бита - это наименьший размер для типа long.

2.8Числа с плавающей запятой

Числа с плавающей запятой реализованы в соответствии со стандартом IEEE 754 (32 бита) и модифицированный IEEE 754 (24 бита). Для представления чисел с плавающей запятой используется два типа float и double. По умолчанию оба типа реализуют урезанный стандарт. Если требуется повышенная точность в вычислениях, то необходимо воспользоваться опцией компилятора -D32. В этом случае для типа double бедет использован полный IEEE 754.

В соответствии со стандартом число с плавающей запятой представлено тремя полями (см. табл. 4):

•знак - это один бит определяющий знак числа);

•показатель степени - это 8-и битное дополнение до 127 показателя степени, если реальный показатель степени равен 0 то в это поле будет записано число 127;

•мантисса - это мантисса числа (правая часть от десятичной точки), значащая часть числа с левой стороны от десятичной точки всегда равна 1 за исключением случая, когда само число равно нулю. Индикатором равенства всего числа нулю является равенство нулю показателя степени.

Зная чему равны отдельные поля, можно легко расчитать чему равно сохраненное число, воспользовавшись следующей формулой:

гт{л \Знак г\ {Показатель степени-127) л

Число = { -1) -2Т.мантисса .

Несколько примеров записи чисел с плавающей запятой в разных форматах приведены в таблице 5.

Таблица 4 Форматы записи чисел с плавающей запятой

Смещенный показатель

мантисса

степени

IEEE 754 (32 бита)

хххх хххх

ххх хххх хххх хххх хххх хххх

Уркзанный IEEE 754 (24 бита)

хххх хххх

ххх хххх хххх хххх

Таблица 5 Примеры записи чисел с плавающей запятой

Смещенный показатель степени

1.мантисса

Десятичное число

IEEE 754 (32 бита)

7DA6B69Bh

11111011b (251)

1.01001101011011010011011b (1.302447676659)

2.77000e+37

Уркзанный IEEE 754 (24 бита)

42123Ah

10000100b (132)

1.001001000111010b (1.142395019531)



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7]