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


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




[3]

Необходимо запомнить, что самый старший бит мантиссы (бит, который рсположен слева от десятичной точки) не сохраняется и считается равным 1, кроме случая, когда показатель степени равен нулю, что означает, что все чило равно нулю.

2.9 Статические переменные

Глобальные или статические переменные могут располагаться по абсолютному адресу. Для этого в описании переменной используется специальная конструкция "@ <адрес>". Например:

[[volatile unsigned char Portvar @ 0x06;

Такое описание дает возможность обращаться к абсолютному адресу 0х06 посредствам переменной Portvar. Надо учитывать, что в этом случае компилятор не резервирует память под размещение этой переменной. С точки зрения ассемблера это описание выглядит следующим образом:

I Portvar equ 06h

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

Основной целью данной конструкции является дать возможность напрямую связывать служебные регистры контроллера с переменными. Чтобы разместить переменные, описанные пользователем, по абсолютным адресам, необходимо поместить их в одну секцию и указать компоновщик разместить эту секцию по определенному адресу. Подробнее смотрите описание директивы #pragma psect.


3 Структурные типы данных и строки

3.1Структуры и строки

HI-TECH C поддерживает структурные типы данных struct и union любого размера от одного байта и более, но не стоит забывать и о физических размерах доступной памяти. Переменные структурного типа могут быть переданы в качестве аргумента в функцию и возвращены ей в качестве результата. Позволю себе заметить, что, в соответствии со стандартом, аргументы передаются в функцию по значению, то есть намного гуманнее по отношению к объему кода и расходу памяти передавать не сами структуры а указатели (ссылки) на них. Тем более, что PIC C полностью поддерживает указатели на структурные типы.

3.2Битовые поля

Внутри структурных типов могут быть организованы, так называемые, битовые поля. Такое поле начинается с младшего бита того слова в котором оно будет размещаться. Битовые поля размещаются внутри 8-ми битных слов. Если поле не удается разместить в текущем байте структуры, то размещение продолжается в следующем байте. Битовые поля никогда не пересекают границу между 8-ми битовыми областями, выделенными для данной структуры. Например:

struct {

unsigned hi : 1; unsigned dummy : 6; unsigned lo : 1; } foo @ 0x10;

В данном случае структура будет занимать один байт по адресу 0х10. При этом поле hi будет соответствовать нулевому биту, а lo - 7-му биту регистра по адресу 0х10. Младший бит поля dummy будет располагаться в первом, а старший - в 6-м битах регистра 0х10. Если структура описана как показано выше, то она будет размещена по абсолютному адресу и память под ее размещение выделяться не будет.

Если необходимо определить битовое поле, которое содержит неиспользуемые области, то можно указать безымянные поля:

struct { unsigned hi : 1; unsigned : 6; unsigned lo : 1; } foo @ 0x10;

3.3 Строки в ОЗУ и ПЗУ

Анонимные неизменные строки (строковые литералы) всегда располагаются в ПЗУ и могут быть доступны только через const-указатели. В следующем примере строка "Мама мыла раму" является строковой константой и размещена в ПЗУ. Поэтому к ней можно обращаться только через константный указатель:

#define MATHER "Мама мыла раму" SendBuff(MATHER);

Массивы переменных (в том числе изменяемые строки) должны быть проинициализированы как в следующем примере:

char fred[] = "Мама мыла раму";

В этом случае мы получаем массив в ОЗУ. Этот массив инициализируется строкой "Мама мыла раму" при запуске программы. Образец строки хранится в ПЗУ. Анонимные неизменные строки в другом контексте будут квалифицированы как константы и доступны


непосредственно в ПЗУ.

Если необходимо передать строку в качестве аргумента функции, или сослаться на нее с помощью указателя, то указатель должен быть описан как const char *:

void SendBuff(const char * ptr) {

В этом случае вы вольны передавать в качестве аргумента как указатель на строку в ПЗУ, так и на строку в ОЗУ. Данные будут корректно обработаны в обоих случаях.



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