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

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

void __attribute__((secure)) chuck_cookies()

{

int hurl;

 

int them = 55;

 

char *where = "far";

 

splat(where);

 

/* ... */

 

}

.

Заметьте, что начальное значение для

where представляет строковый литерал,

который расположен в секции констант PSV .secure_const. Компилятор запишет

в PSVPAG необходимую величину при входе в функцию. Если необходимо,

компилятор также восстановит PSVPAG после вызоваA

splat().

shadow

Wilson

 

 

 

Атрибут shadow заставляет компилятор использовать теневые регистры, а не программный стек для сохранения контекста. Этот атрибут обычно используется вместе с атрибутом interrupt.

void __attribute__ ((interrupt, shadow)) _T1Interrupt (void);

unused

Этот атрибут, примененный к функции, означает, что функция предположительно

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

типами параметра и возвращаемогоby значения. Применение этого атрибута заставит

user_init

Атрибут user_init может быть применен к любой непрерываемой функции с void

weakTranslated

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

void

attribute__((user_init))

initialize_me(void) {

// выполнить последовательность

инициализации альфа альфа бета

}

 

 

Для подробной информации см. п. 2.3.1. «Определение атрибутов переменных»

2.3.3. Inline функции

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

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

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

DS51284H(ru) стр. 2-16

© 2008 Microchip Technology Inc.

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

inline int inc (int *a)

{

(*a)++;

}

(Если вы используете опции -traditional или -ansi, пишите __inline__ вместо inline.) Вы можете также сделать все «достаточно простые» функции inline встроенными с помощью опции командной строки -finline-functions.

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

 

.

размера функций, решает, какие функции достаточно простые, чтобы имело смысл

внедрение их кода.

A

 

Примечание Ключевое слово inline будет распознано, только если разрешены опция -finline или оптимизация.

Отдельные приемы, используемые в определении функции, могут сделать ее неподходящей для inline подстановки. К таким приемам можно отнести: использование varargs, использования alloca, использование данных переменного размера, использование вычисляемого goto и использования нелокального goto. С помощью опции командной строки -Winline можно получить предупреждение, когда функция, отмеченная как inline, не может быть вставлена в код, и узнать причину неудачи.

В синтаксисе компилятора ключевое слово inline не влияет на прикомпоновку

функции.

Wilson

Когда функция является одновременноby inline и static, а все вызовы функции

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

компилятор не выводит собственный ассемблерный код функции, если только вы не укажетеTranslatedопцию командной строки -fkeep-inline-functions. Некоторые вызовы не могут быть интегрированы по различным причинам (в частности, вызовы, которые

предшествуют определению функции, не могут быть встроены и не допускается рекурсивного вызова внутри определения). Если есть вызов, который не удалось встроить в виде кода, то функция компилируется в ассемблер как обычно. Функция также должна быть компилирована обычным образом, если программа имеет ссылку на ее адрес, поскольку встраивание кода не решает эту проблему. Компилятор удалит встроенные функции, только если они объявлены как static и если определение функции предшествует всем ее вызовам.

Когда i line функция не является static, то компилятор должен предположить, что она может быть вызвана из других исходных файлов. Поскольку глобальный символ может быть определен в программе только единственный раз, функция не должна иметь определений в других исходных файлах, так что вызовы в этих файлах не могут быть inline интегрированы. Следовательно, не static inline функция всегда компилируется обычным способом.

Если вы используете одновременно inline и extern в определении функции, то определение используется только для inline встраивания. Ни при каких обстоятельствах функция не будет компилированная в свой собственной код, даже не если вы сошлетесь на ее адрес явно. Такой адрес становится внешней ссылкой, как будто вы только объявили функцию и не определили ее.

Эта комбинация inline и extern имеет аналогичный эффект на макро. Поместите определение функции в файл заголовка с этими ключевыми словами и поместите другую копию определения (без inline и extern) в библиотечный файл. Определение в файле заголовка приведет к тому, что большинство вызовов функции будет встроено inline. Если какие-то вызовы функции останутся, они разрешатся ссылкой на единственную копию в библиотеке.

© 2008 Microchip Technology Inc.

DS51284H(ru) стр. 2-17

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