- •Глава 1. Сведения о компиляторе
- •1.1.Введение
- •1.2. Основные вопросы
- •1.3. Описание компилятора и документация
- •1.4. Компилятор и другие средства разработки
- •1.5. Набор возможностей компилятора
- •1.5.1. Стандарт ANSI Си
- •1.5.2. Оптимизация
- •1.5.3. Поддержка стандартной ANSI библиотеки
- •1.5.4. Гибкие модели памяти
- •1.5.5. Драйвер компилятора
- •Глава 2. Отличия 16-битового компилятора от ANSI
- •2.1. Введение
- •2.2. Основные вопросы
- •2.3. Отличия ключевых слов
- •2.3.1. Определение атрибутов переменных
- •2.3.2. Определение атрибутов функций
- •2.3.3. Inline функции
- •2.3.4. Переменные в определенных регистрах
- •2.3.4.1. Определение глобальных регистровых переменных
- •2.3.4.2. Определение локальных регистровых переменных
- •2.3.5. Комплексные числа
- •2.3.6. Целые размером в двойное слово
- •2.3.7. Ссылки на тип с помощью typeof
- •2.4. Отличия операторов
- •2.4.1. Метки как значения
- •2.4.2. Условные операторы с опущенными операндами
- •2.4.3. Диапазоны case
- •2.5. Отличия выражений
- •2.5.1. Двоичные константы
- •Глава 3. Использование компилятора в командной строке
- •3.1. Введение
- •3.2. Основные вопросы
- •3.3. Обзор
- •3.4. Соглашение для имен файлов
- •3.5. Опции
- •3.5.1. Опции, специфические для устройств dsPIC
- •3.5.2. Опции для управления типом результатов
- •3.5.3. Опции для управления диалектом Cи
- •3.5.5. Опции для отладки
- •3.5.6. Опции для управления оптимизацией
- •3.5.7. Опции для управления препроцессором
- •3.5.8. Опции для ассемблера
- •3.5.9. Опции для компоновщика
- •3.5.10. Опции для поиска в каталогах
- •3.5.11. Опции для соглашений по генерации кода
- •3.6. Переменные окружения
- •3.7. Предопределенные имена макро
- •3.9. Компиляция нескольких файлов в командной строке
- •3.10. Особенные символы
- •Глава 4. Среда периода исполнения
- •4.1. Введение
- •4.2. Основные вопросы
- •4.3. Адресное пространство
- •4.4. Запуск и инициализация
- •4.5. Пространства памяти
- •4.6. Модели памяти
- •4.6.1. Ближние и дальние данные
- •4.6.2. Ближний и дальний код
- •4.7. Расположение кода и данных
- •4.8. Программный стек
- •4.9. Использование стека в Си
- •4.11. Соглашения по вызову функций
- •4.11.1. Параметры функции
- •4.11.2. Возвращаемое значение
- •4.12. Соглашения о регистрах
- •4.13. Двоичная инверсия и модульная адресация
- •4.14.1. Загрузочные и защищенные константы
- •4.14.2. Строковые константы как аргументы
- •4.14.3. Переменные с квалификатором const в безопасной Flash
- •4.14.4. Модель совместимости объектов
- •Глава 5. Типы данных
- •5.1. Введение
- •5.2. Основные вопросы
- •5.3. Представление данных
- •5.4. Целые
- •5.5. С плавающей точкой
- •5.6. Указатели
- •Глава 6. Дополнительные типы указателей Си
- •6.1. Введение
- •6.2. Управляющие PSV указатели
- •6.2.1. Определение данных для управления доступом PSV
- •6.2.2. Управляемый доступ PSV
- •6.2.3. Рассмотрение ISR
- •6.3. PMP указатели
- •6.3.1. Инициализация PMP
- •6.3.2. Объявление нового пространства памяти
- •6.3.3. Определение переменных в пространстве PMP
- •6.4. Внешние указатели
- •6.4.1. Объявление нового пространства памяти
- •6.4.2. Определение переменных во внешнем пространстве
- •6.4.3. Определение способа доступа к пространству памяти
- •6.4.3.2. Функции записи
- •6.4.4. Пример внешней памяти
- •Глава 7. Файлы поддержки устройства
- •7.1. Введение
- •7.2. Основные вопросы
- •7.3. Файлы заголовков процессора
- •7.4. Файлы определения регистров
- •7.5. Использование SFR
- •7.6. Использование макросов
- •7.6.1. Макросы настройки битов конфигурации
- •7.6.2. Макросы использования ассемблера inline
- •7.6.3. Макросы выделения памяти данных
- •7.6.4. Макросы объявления ISR
- •7.7. Адресация EEDATA из Си - только для dsPIC30F
- •7.7.1. Доступ к EEDATA через PSV
- •7.7.2. Доступ к EEDATA посредством команд TBLRDx
- •7.7.3. Дополнительные источники информации
- •Глава 8. Прерывания
- •8.1. Введение
- •8.2. Основные вопросы
- •8.3. Написание программы обработки прерывания
- •8.3.1. Рекомендации по написанию ISR
- •8.3.3. Кодирование ISR
- •8.3.4. Использование макросов для объявления простых ISR
- •8.4. Запись вектора прерывания
- •8.4.1. Вектора прерываний dsPIC30F (без SMPS)
- •8.4.3. Вектора прерываний PIC24F
- •8.4.4. Вектора прерываний dsPIC33F/PIC24H
- •8.5. Сохранение контекста в ISR
- •8.7. Вложенные прерывания
- •8.8. Разрешение/запрещение прерываний
- •8.9. Разделение памяти между основной программой и ISR
- •8.9.1. Разработка проблем
- •8.9.2. Разработка решений
- •8.9.3. Пример приложения
- •8.10. Использование PSV в ISR
- •Глава 9. Совместное использование ассемблера и Си
- •9.1. Введение
- •9.2. Основные вопросы
- •9.3. Смесь переменных и функций на ассемблере и Си
- •9.4. Использование ассемблера inline
- •Приложение A. Определяемое реализацией поведение
- •A.12. Квалификаторы
- •A.13. Деклараторы
- •A.14. Операторы
- •A.17. Сигналы
- •A.18. Потоки и файлы
- •A.20. Errno
- •A.22. Abort
- •A.23. Exit
- •A.24. Getenv
- •A.25. Система
- •A.26. Strerror
- •Приложение B. Встроенные функции
- •B.2. Список встроенных функций
- •Приложение C. Диагностика
- •Приложение D. Компиляторы Си PIC18 и PIC24/dsPIC
- •D.6. Использование стека
- •D.11. Банк доступа
- •D.12. Inline ассемблер
- •D.13. Прагмы
- •D.14. Модели памяти
- •D.15. Соглашения о вызове
- •D.16. Код запуска
- •D.17. Управляемые компилятором ресурсы
- •D.18. Оптимизация
- •D.20. Определяемое реализацией поведение
- •D.21. Битовые поля
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. |