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

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

Когда указатель фрейма не используется, программист на ассемблере должен знать, какой объем стека использован с момента входа в процедуру. Если стек дополнительно больше ни для чего не использовался, вычисление будет аналогично вышеприведенному. b может быть доступно через W15–20: 4 байта для адреса возврата и 16 байтов для получения доступа к началу b.

4.11.2. Возвращаемое значение

Функция использует W0 для возвращения значение 8 и 16-битовых скалярных типов, W1:W0 — для 32-битовых скалярных типов и W3:W2:W1:W0 — для 64 битовых скалярных типов. Объединения возвращаются косвенно через W0, куда функция

заносит адрес значения объединения.

 

A

 

4.11.3. Сохранение регистров при вызове.

функции

Компилятор подразумевает сохранение регистров W8-W15 при вызове обычной функции. Регистры W0-W7 доступны для использования. Для функций обработки прерывания, компилятор подразумевает сохранение всех регистров W0-W15 и RCOUNT.

4.12.Соглашения о регистрах

Отдельные регистры играют специфические роли в среде периода исполнения Си.

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

таблице 4-3

 

 

ТАБЛИЦА 4-3. СОГЛАШЕНИЕ ОWilsonРЕГИСТРАХ

 

Переменная

by

Рабочий регистр

 

 

 

 

char, signed char, unsigned char

W0-W13, и W14, если он не используется в

 

 

 

качестве указателя фрейма

 

 

short, signed short, unsigned

W0-W13, и W14, если он не используется в

Translated

 

качестве указателя фрейма

short

 

 

int, signed int, unsigned int

W0-W13, и W14, если он не используется в

 

 

 

качестве указателя фрейма

void * (или другой указатель)

W0-W13, и W14, если он не используется в

 

 

 

качестве указателя фрейма

long, signed long, unsigned long

Пара смежных регистров, начиная с любого

 

 

 

регистра из набора {W0, W2, W4, W6, W8, W10,

 

 

 

W12}. Регистр с меньшим номером содержит

 

 

 

младшие 16 битов величины.

long lo g, signed long long,

Четверка смежных регистров, начиная с любого

unsig

long long

 

регистра из набора {W0, W4, W8}. Регистр с

 

 

 

меньшим номером содержит младшие 16 битов

 

 

 

величины. Следующие по порядку регистры будут

 

 

 

содержать соответственно все более старшие

 

 

 

биты.

 

 

 

 

float

 

 

Пара смежных регистров, начиная с любого

 

 

 

регистра из набора {W0, W2, W4, W6, W8, W10,

 

 

 

W12}. Регистр с меньшим номером содержит

 

 

 

младшие 16 битов величины.

 

 

 

 

double(1)

 

 

Пара смежных регистров, начиная с любого

 

 

 

регистра из набора {W0, W2, W4, W6, W8, W10,

 

 

 

W12}. Регистр с меньшим номером содержит

 

 

 

младшие 16 битов величины.

 

 

 

 

DS51284H(ru) стр. 4-12

© 2008 Microchip Technology Inc.

 

 

 

 

Глава 4. Среда периода исполнения

 

 

 

 

 

 

 

 

 

 

 

 

ТАБЛИЦА 4-3. (ПРОД-Е) СОГЛАШЕНИЕ О РЕГИСТРАХ

 

 

 

 

 

 

 

 

 

 

Переменная

 

 

 

Рабочий регистр

 

 

 

 

 

 

 

 

 

 

long double

 

 

Четверка смежных регистров, начиная с любого

 

 

 

 

 

 

регистра из набора {W0, W4, W8}. Регистр с

 

 

 

 

 

 

меньшим номером содержит младшие 16 битов

 

 

 

 

 

 

величины.

 

 

 

 

 

 

 

 

 

 

 

structure

 

 

1 регистр на 2 байта структуры

 

 

 

 

 

 

 

 

Примечание 1. Если используется опция -fno-short-double, то double эквивалентен

 

 

long double.

 

 

.

 

4.13.

 

 

 

 

 

 

Двоичная инверсия и модульная адресация

 

 

 

 

 

A

 

 

 

 

Компилятор непосредственно не поддерживает использование двоичной инверсии

 

 

адреса и модульной адресации. Если любой из этих режимов адресации разрешен

 

 

 

 

Wilson

 

 

 

 

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

 

 

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

 

 

то время как разрешен один из этих режимов адресации.

 

 

В Си возможно определить массив так, чтобы он был подходящим образом

 

 

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

 

 

aligned может быть применен для определения массива, который

 

 

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

 

 

инкрементом. Атрибут reverse может быть применен для определения массива,

 

 

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

 

 

адресацией декрементом. Об атрибутах подробнее см. п. 2.3. «Отличия ключевых

 

 

 

by

 

 

 

 

 

 

слов». О модульной адресации подробнее см. главу 3 «dsPIC30F Family Reference

 

 

Manual» (DS70046).

 

 

 

 

 

4.14.

Использование видимости программного

 

 

Translated

 

 

 

 

 

 

пространства (PSV)

 

 

 

 

 

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

Кроме этого, приложение может управлять окном PSV в своих собственных целях. Преимущество непосредственного управления использованием PSV в приложении заключается в том, что это предоставляет большую гибкость, чем наличие единственной секции .const, постоянно отображаемой в окно PSV. Недостаток заключается в том, что приложение должно контролировать управляющие регистры и биты PSV. Задайте опцию -mconst-in-data, чтобы заставить компилятор не использовать окно PSV.

Атрибут space может быть применен при определении переменных, которые предназначены для использования в окне PSV. Чтобы определить отдельные переменные для расположения в управляемой компилятором секции .const, используйте атрибут space(auto_psv). Чтобы определить переменные для доступа через PSV в секции не управляемой компилятором, используйте атрибут space(psv). Более подробно об этих атрибутах см. п. 2.3. «Отличия ключевых слов».

Подробнее об использовании PSV, см. «MPLAB® Assembler, Linker and Utilities for PIC24 MCUs and dsPIC® DSCs User’s Guide» (DS51317).

4.14.1. Загрузочные и защищенные константы

Определяются две новых секции констант psv: .boot_const и .secure_const. Эти секции аналогичны общей секции .const, за исключением того, что компилятор использует их независимо от выбираемой пользователем модели памяти констант.

© 2008 Microchip Technology Inc.

DS51284H(ru) стр. 4-13

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

Независимо от того, что вы выбрали модель памяти constants-in-code или constants- in-data, компилятор создает и управляет секциями констант psv как и требуется для безопасных сегментов. Следовательно, PSVPAG и CORCONbits.PSV должны стать управляющимися компилятором ресурсами. Поддержка управляемых пользователем PSV секций сохраняется через модель объектной совместимости, которая объясняется ниже.

При входе в загрузочную или безопасную функцию в PSVPAG будет установлено правильное значение. Эта величина будет восстановлена после любого вызова внешней функции.

 

.

4.14.2. Строковые константы как аргументы

 

A

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

также быть использованы как аргументы функции. Например:

myputs("Enter the Dragon code:\n");

 

Wilson

 

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

Вспомните, что данные, хранимые в безопасном сегменте, не могут быть считаны любым другим сегментом. Например, невозможно вызывать стандартную библиотечную функцию Cи put() со строкой, которая расположена в безопасном сегменте. Следовательно литералы, которые появляются как аргументы функций, могут быть переданы только в функции в том же сегменте безопасности. Это также справедливо для ссылочных по указателю объектов и массивов. Простые скалярные типы, как например char,byint и float, которые передаются по значению, могут быть переданы в функции других сегментов.

4.14.3. Переменные с квалификатором const в безопасной Flash

ПеременныеTranslatedс квалификатором const и с инициализаторами могут поддерживаться

в безопасных сегментах Flash с использованием управляемых компилятором секций констант PSV. Например:

const int ribute__((boot)) time_delay = 55;

Если квалификатор const был бы опущен в определении time_delay, этот оператор должен быть отвергнут с сообщением об ошибке. (Инициализируемые переменные в безопасной RAM не поддерживаются).

Как только квалификатор const определен, переменная time_delay может быть размещена в секции констант PSV, принадлежащей сегменту загрузки. Допустимо также определить секцию констант PSV явно с атрибутом space(auto_psv):

int ttribute ((boot,space(auto_psv))) bebop = 20;

Переменные-указатели, инициализируемые строковыми литералами, требуют специальной обработки. Например:

char * const foo __attribute__((boot)) = "eek";

Компилятор распознает, что строковый литерал "eek" должен быть расположен в той же секции констант PSV, что и переменная указателя foo. Логика создания связей для поименованных секций PSV уже поддерживается компилятором.

4.14.4. Модель совместимости объектов

Поскольку функции в безопасных сегментах устанавливают PSVPAG соответственно на свою секцию констант psv, требуется принять некоторое соглашение, чтобы управлять многочисленными значениями регистра PSVPAG. В предшествующих версиях компилятора в регистре PSVPAG во время запуска программы устанавливалось единственное значение, если по умолчанию была выбрана модель памяти constants-in-code. Компилятор полагался на это предустановленное

DS51284H(ru) стр. 4-14

© 2008 Microchip Technology Inc.

Глава 4. Среда периода исполнения

значение для доступа к константным переменным и строковым литералам, также как и к любым переменным, особо отмеченным с помощью space(auto_psv).

Компилятор v3.0 будет обеспечивать автоматическую поддержку для многих значений PSVPAG. Переменные, объявленные как space(auto_psv), могут быть объединены с константными переменными безопасного сегмента и/или управляемыми psv переменными-указателями в одном исходном файле. Предварительно компилированные объекты, которые предполагают единственную предустановленную величину PSVPAG, будут совместимы при компоновке с объектами, которые определяют psv константы безопасного сегмента или

управляемые psv переменные.

 

.

 

Даже если PSVPAG

 

 

управляемый компилятором

теперь рассматривается как

ресурс, соглашения

 

A

 

без изменения. Объекты и

о вызове функций остались

библиотеки, созданные более ранними версиями, совместимы с объектами версии 3.0, за исключением некоторых программ обслуживания прерываний, как отмечено в п.8.10 «Использования PSV с программамиWilson обслуживания прерываний».

by Translated

© 2008 Microchip Technology Inc.

DS51284H(ru) стр. 4-15

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

Для заметок.

A . Wilson by Translated

DS51284H(ru) стр. 4-16

© 2008 Microchip Technology Inc.

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