Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорная техника Сторожок / MPLAB_C30_Руководство пользователя.pdf
Скачиваний:
161
Добавлен:
20.02.2016
Размер:
1.26 Mб
Скачать

Глава 2. Отличия 16-битового компилятора от ANSI

Если вы хотите перекомпилировать qsort или другие исходные файлы, которые в действительности не используют вашу глобальную регистровую переменную, так чтобы они не использовали этот регистр для любой другой цели, то достаточно задать опцию командной строки компилятора -ffixed-reg. Вам не требуется действительно добавлять декларацию глобальной регистровой переменной к исходному коду.

Функция, которая может изменить величину глобальной регистровой переменной, не может быть безопасно вызвана из функции, компилированной без этой переменной, поскольку она могла бы затереть величину, которую вызывающий код ожидает

получить при возврате. Следовательно, функция, которая является точкой входа в

 

.

часть программы, которая использует глобальную регистровую переменную,

 

A

должна явно сохранять и восстанавливать величину, которая принадлежит

вызывающему ее коду.

 

Библиотечная функция longjmp восстанавливает в каждую глобальную регистровую переменную величину,Wilsonкоторую та имела на момент setjmp.

Все декларации глобальных регистровых переменных должны предшествовать

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

Глобальные регистровые переменные не могут иметь начальных значений,

поскольку выполняемый файл не имеет средства, чтобы обеспечить начальное состояние регистра.

2.3.4.2. Определение локальных регистровых переменных

Вы можете определить локальную переменную в выбранном регистре подобно

этому:

by

 

register int *foo asm ("w8");

Здесь w8 - имя регистра, который должен быть использован. Заметьте, что этот

Определение такой регистровой переменной не резервирует регистр; он остается доступным для другого использования в местах, где управление потоком определяет, что переменная больше не нужна. Использование подобных переменных может оставить компилятору слишком мало доступных регистров, чтобы компилировать отдельные функции.

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

Эта опция не дает полной уверенности в том, что компилятор сгенерирует код, который имеет эту переменную в заданном вами регистре все время. Вы не можете кодировать явную ссылку на этот регистр в операторе asm и рассчитывать, что она всегда сошлется на эту переменную.

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

2.3.5. Комплексные числа

Компилятор поддерживает комплексные типы данных. Вы можете объявить как комплексные целые типы, так и комплексные типы с плавающей точкой, используя ключевое слово __complex__.

Например, __complex__

float

x; объявляет x как

переменную,

чья

вещественная и мнимая части имеют тип float. __complex__

short int

y;

объявляет y как переменную, вещественная и мнимая части которой имеют тип short int.

Для записи констант комплексного типа используйте суффиксы 'i' или 'j' (любой из них, они равноправны). Например, 2.5fi имеет тип __complex__ float, а 3i имеет тип __complex__ int. Такая константа является чисто мнимой величиной, но

© 2008 Microchip Technology Inc.

DS51284H(ru) стр. 2-19

16-битовый компилятор Си. Руководство

вы можете сформировать любую комплексную величину, добавляя ее к вещественной константе.

Для извлечения вещественную части комплексного выражения exp, запишите __real__ exp. Аналогично, использование __imag__ позволит извлекать мнимую часть. Например:

 

__complex__ float z;

 

 

 

 

float r;

 

 

 

 

float i;

 

 

 

 

r = __real__ z;

 

 

 

 

i = __imag__ z;

A

 

 

Оператор

 

комплексного

типа, выполняет

'~', использованный с величинами.

комплексное сопряжение.

 

 

 

 

Wilson

 

автоматические

переменные в

Компилятор может разместить комплексные

несмежных адресах; возможно даже размещение вещественной части в регистре, тогда как мнимая часть будет находится в стеке (или наоборот). Формат отладочной информации не имеет возможности представления несмежного расположения, подобного вышеупомянутому, поэтому компилятор описывает несмежные комплексные переменные как две раздельные переменные некомплексного типа. Если фактическое имя комплексной переменной foo, две фиктивных переменных получают имена foo$real и foo$ mag.

2.3.6. Целые размером в двойное слово

Компилятор поддерживает типы данных для целых, которые в два раза длиннее чем

long

by

 

 

int. Просто запишите long long int для целого со знаком или unsigned

long

long int для целого без знака. Для записи констант типа long

long

int,

добавьте суффикс LL к целому. Для записи констант типа unsigned

long

long

int, добавьте суффикс ULL к целому.

 

типом

Предполагается,Translatedчто x[]() - массив функций; описанный тип является

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

2.3.7. Ссылки на тип с помощью typeof

Другой путь ссылки на тип выражения состоит в использовании ключевого слова typeof. Синтаксис для использования этого ключевого слова выглядит похожим на sizeof, но конструкция семантически работает подобно определению имен типов с помощью typedef.

Есть два способа записи аргумента для typeof: с помощью выражения или типа. Ниже дан пример с выражением:

typeof (x[0](1))

возвращаемых функциями значений.

Вот пример с именем типа в качестве аргумента:

typeof (int *)

Здесь описанный тип является указателем на int.

Если Вы пишете файл заголовка, который должен работать при включении в ANSI Си программу, используйте __typeof__ вместо typeof.

Конструкция typeof может использоваться везде, где допустимо ключевое слово typedef. Например, вы можете использовать его в декларации, в приведении, а также внутри sizeof или typeof.

DS51284H(ru) стр. 2-20

© 2008 Microchip Technology Inc.

Соседние файлы в папке Микропроцессорная техника Сторожок