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

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

2.3.4. Переменные в определенных регистрах

Компилятор позволяет вам помещать несколько глобальных переменных в определенные аппаратные регистры.

Примечание Использование слишком многих регистров, а особенно W0, может повредить способность 16-битового компилятора к компиляции.

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

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

Локальные переменные в регистрахWilsonне резервируют их. Анализ потока данных компилятора позволяет определять, где конкретные регистры содержат работающие переменные, и где регистры доступны для другого использования. Хранимые в локальных регистрах переменные могут быть удалены, когда они оказывается неиспользуемыми. Ссылки на локальные регистровые переменные могут быть удалены, перемещены или упрощены.

Эти локальные переменные иногда удобные для использования с ассемблерными inline вставками (см. главу 9 «Совместное использование ассемблера и Си»), если вы хотите записать один результат инструкции ассемблера непосредственно в конкретный регистр. (Это будет работать при условии, что регистр, указанный вами,

соответствует ограничениям, определенным для операндов в inline операторе ассемблера).

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

by

Вы можете определить глобальную регистровую переменную подобно этому: registerTranslatedint *foo asm ("w8");

Здесь w8 - имя регистра, который должен быть использован. Выбирайте регистр, который обычно сохраняется и восстанавливается вызовами функций (W8-W13), чтобы библиотечные программы не затерли его.

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

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

Небезопасно для одной функции, которая использует глобальную регистровую переменную, вызывать другую такую функцию foo посредством третьей функции lose, которая была компилирована без сведений об этой переменной (т.е. в исходном файле которой эта переменная не была декларирована). Дело в том, что lose может сохранить регистр и поместить туда некоторое другое значение. К примеру, вы не можете рассчитывать на то, что глобальная регистровая переменная будет доступна в функции сравнения, которую вы передаете qsort, так как qsort вероятно поместит нечто другое в этот регистр. Эта проблема может быть снята перекомпиляцией qsort с определением такой же глобальной регистровой переменной.

DS51284H(ru) стр. 2-18

© 2008 Microchip Technology Inc.

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