
- •Глава 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. Битовые поля

Глава 3. Использование компилятора в командной строке
3.5.9. Опции для компоновщика
Если хотя бы одна из опций -c, -S или -E используется, компоновщик не запускается и имена объектных файлов не будут использоваться в качестве аргументов.
ТАБЛИЦА 3-13. ОПЦИИ ДЛЯ КОМПОНОВЩИКА
Опция |
Описание |
|
|
|
|
-Ldir |
Добавить каталог dir к списку каталогов, в которых будет |
|
|
производиться поиск библиотек, определенных опцией -l. |
|
|
|
|
-llibrary |
При компоновке искать библиотеку library. |
|
|
Компоновщик ищет библиотеку, файл которой имеет в |
|
|
A |
library.a в стандартном списке |
|
действительности имя lib. |
|
|
каталогов библиотек. После этого он использует этот файл |
|
|
так, как если бы он был точно задан своим именем. |
|
|
Wilson |
|
|
Есть разница, в каком месте командной строки указана |
|
|
опция; Компоновщик обрабатывает библиотеки и объектные |
|
|
файлы в той последовательности, в которой они заданы. Т.е. |
|
|
foo. -lz bar.o даст поиск библиотеки z после файла |
|
|
foo.o, но перед файлом bar.o. Если файл bar.o ссылается |
|
|
на функции из libz.a, то эти функции могут не загрузиться. |
|
|
Каталоги для поиска включают некоторое количество |
|
|
стандартных системных директорий, плюс те, что были |
|
|
определены опциями -L. |
|
|
Обычно файлы, найденные таким способом, являются |
|
|
библиотечными (файлами архивов, состоящих из объектных |
|
|
by |
|
|
файлов). Компоновщик обрабатывает архивы путем поиска в |
|
|
них объектных файлов, в которых определены символы, на |
|
|
которые уже были ссылки, но не было определений. Но если |
|
|
обрабатываемый файл является просто объектным файлом, |
|
Translated |
то он компонуется обычным способом. Единственной |
|
разрешаются точками входа в стандартных библиотеках |
||
|
разницей между использованием опции -l (т.е. -lmylib) и |
|
|
простым заданием имени файла библиотеки (т.е. |
|
|
libmylib.a) является то, что -l ищет библиотеку в ряде |
|
|
каталогов, как определено. По умолчанию компоновщик |
|
|
будет искать библиотеки, заданные опцией -l в каталоге: |
|
|
<install-path>\lib |
|
|
При установке компилятора в каталог, принятый по |
|
|
умолчанию, это будет: |
|
|
c:\Program Files\Microchip\MPLAB C30\lib |
|
|
Такое поведение может быть изменено с использованием |
|
|
переменных окружения, описанных в п. 3.6. «Переменные |
|
|
окружения». |
|
|
|
|
-nodef ultlibs |
Не использовать стандартные системные библиотеки при |
|
|
компоновке. Компоновщику будут переданы только |
|
|
библиотеки, которые вы зададите. Компилятор может |
|
|
создавать вызовы memcmp, memset и memcpy. Обычно они |
|
|
компилятора. При использовании данной опции описанные |
|
|
точки входа должны поддерживаться каким-то другим |
|
|
способом. |
|
|
|
|
-s |
Удалить все таблицы символов и информацию о |
|
|
перемещении из исполняемого кода. |
|
|
|
|
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 3-23 |

16-битовый компилятор Си. Руководство
ТАБЛИЦА 3-13. (ПРОД-Е) ОПЦИИ ДЛЯ КОМПОНОВЩИКА
Опция |
|
Описание |
|
|
|
-u symbol |
Сделать вид, что symbol не определен, чтобы заставить |
|
|
прикомпоновать библиотечные модули с его определением. |
|
|
Допустимо многократное использование опции -u с разными |
|
|
символами, для загрузки дополнительных библиотечных |
|
|
модулей. |
|
|
|
|
-Wl, option |
Передать опцию option компоновщику. Если option |
|
|
содержит запятые, она разбивается этими запятыми на |
|
|
несколько опций. |
|
|
|
|
-Xlinker option |
|
. |
Передать опцию option компоновщику. Может |
||
|
|
A |
|
использоваться для поддержки специфических системных |
|
|
опций компоновщика, которые компилятор не распознает. |
|
|
Wilson |
|
3.5.10. Опции для поиска в каталогах |
|
Следующие опции подсказывают компилятору где находятся директории и файлы для поиска.
ТАБЛИЦА 3-14. ОПЦИИ ДЛЯ ПОИСКА В КАТАЛОГАХ
Опция |
Описание |
|
|
-Bprefix |
Эта опция определяет, где искать исполняемые, |
|
библиотечные, включаемые файлы и файлы данных самого |
|
компилятора. Драйвер компилятора запускает одну или |
|
более программ pic30-cpp, pic30-cc1, pic30-as и |
|
pic30-ld. Он пробует prefix в качестве префикса для |
|
каждой программы, которую пытается запустить. |
|
Для каждой запускаемой программы драйвер компилятора |
|
первым делом проверяет префикс опции -B, если есть. Если |
|
by |
|
программа не найдена или опция -B отсутствует, драйвер |
|
использует значение, хранимое в переменной окружения |
|
PIC30_EXEC_PREFIX, если оно задано. Подробнее см. п. 3.6. |
|
«Переменные окружения». Наконец, драйвер будет искать |
|
для программ текущую переменную окружения PATH. |
|
Префикс опции -B, который эффективно определяет названия |
|
каталогов, также используется для библиотек |
|
компоновщиком, потому что компилятор переводит его в |
|
опцию -L для компоновщика. Он также применяется для |
|
включаемых препроцессором файлов, поскольку компилятор |
|
переводит его в опцию -isystem для препроцессора. В этом |
|
случае компилятор добавляет к префиксу include. |
|
Другой, очень похожий на опцию -B способ задать префикс, |
|
заключается в использовании переменной окружения |
|
PIC30_EXEC_PREFIX |
|
|
-specs=file |
Обработать файл после того, как компилятор причитает |
Translated |
стандартный файл specs, для того, чтобы аннулировать |
умолчания, которые управляющая программа pic30-gcc |
|
|
использует для определения, какие опции передавать |
|
pic30-cc1, pic30-as, pic30-ld, и т.п. В командной |
|
строке может быть определено больше одной опции |
|
-specs=file, и все они будут обработаны в порядке слева |
|
направо. |
|
|
3.5.11. Опции для соглашений по генерации кода
Опции формы -fflag определяют машинно-независимые признаки. Большинство опций имеют как положительные, так и отрицательные формы; отрицательная форма
DS51284H(ru) стр. 3-24 |
© 2008 Microchip Technology Inc. |

Глава 3. Использование компилятора в командной строке
-ffoo будет -fno-foo. В таблице ниже приводится только одна из форм (та, которая не является умолчанием.)
ТАБЛИЦА 3-15. ОПЦИИ СОГЛАШЕНИЙ О ГЕНЕРАЦИИ КОДА
Опция |
|
Описание |
|
|
|
-fargument-alias |
|
Определяет возможные соотношения между параметрами и |
-fargument-noalias |
|
между параметрами и глобальными данными. |
-fargument- |
|
-fargument-alias — определяет, что аргументы |
noalias-global |
|
(параметры) могут перекрываться друг с другом и с |
|
|
глобальной областью памяти. |
|
|
. |
|
|
-fargument-noalias — определяет, что аргументы не |
|
|
A |
|
|
могут перекрываться друг с другом, но могут перекрываться |
|
|
с глобальной областью памяти. |
|
|
-fargument-noalias-global — определяет, что |
|
|
Wilson |
|
|
аргументы не могут перекрываться друг с другом и с |
|
|
глобальной областью памяти. |
|
|
Каждый язык будет автоматически использовать ту опцию, |
|
|
какая необходима по языковому стандарту. Вам |
|
|
необязательно использовать эти опции самому. |
-fcall-saved-reg |
|
Трактовать регистр с именем reg как доступный регистр |
|
|
сохраняемый функциями. Он может быть выделен даже для |
|
|
временных нужд или переменных, которые существуют до и |
|
|
после вызова. Функции, компилированные таким способом, |
|
|
будут сохранять и восстанавливать регистр reg, если они |
|
|
используют его. |
|
|
Использование этой опции с указателями фрейма или стека |
|
|
является ошибкой. Использование этой опции для другого |
|
|
регистра, которому отводится фиксированная повсеместная |
|
|
роль в машинной модели исполнения, приведет к |
Translated |
byкатастрофическим результатам. |
|
|
Беда другого свойства произойдет при использовании этой |
|
|
|
|
|
|
опции для регистра, в котором функция может возвращать |
|
|
результат. |
|
|
Этот флаг должен использоваться равным образом для всех |
|
|
модулей. |
|
|
|
-fcall-used-reg |
|
Трактовать регистр с именем reg как доступный регистр, |
|
|
который затирается функциями. Он может быть выделен для |
|
|
временных нужд или переменных, которые существуют |
|
|
только до вызова. Функции, компилированные таким |
|
|
способом, будут не будут сохранять и восстанавливать |
|
|
регистр reg. |
|
|
Использование этой опции с указателями фрейма или стека |
|
|
является ошибкой. Использование этой опции для другого |
|
|
регистра, которому отводится фиксированная повсеместная |
|
|
роль в машинной модели исполнения, приведет к |
|
|
катастрофическим результатам. |
|
|
Этот флаг должен использоваться равным образом для всех |
|
|
модулей. |
|
|
|
-ffixes-reg |
|
Трактовать регистр с именем reg как защищенный регистр; |
|
|
генерируемый код никогда не должен ссылаться на него |
|
|
(кроме, возможно, как на указатели стека и фрейма и |
|
|
некоторые другие регистры постоянного назначения). |
|
|
reg должно быть именем регистра, например: |
|
|
-ffixed-w3 |
|
|
|
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 3-25 |

16-битовый компилятор Си. Руководство
ТАБЛИЦА 3-15. (ПРОД-Е) ОПЦИИ СОГЛАШЕНИЙ О ГЕНЕРАЦИИ КОДА
|
Опция |
|
|
Описание |
|
|
|
|
|
|
-finstrument-functions |
|
Генерировать инструментальные вызовы на входе и выходе |
|
|
|
|
функции. Сразу после входа в функцию и точно перед |
|
|
|
|
выходом из функции, будут вызваны следующие |
|
|
|
|
профилирующие функции с адресом текущей функции и |
|
|
|
|
местоположением вызова. |
|
|
|
|
void __cyg_profile_func_enter |
|
|
|
|
(void *this_fn, void *call_site); |
|
|
|
|
void __cyg_profile_func_exit |
|
|
|
|
(void *this_fn, void *call_site); |
|
|
|
|
Первый аргумент является адресом начала текущей функции |
|
|
|
|
|
. |
|
|
|
и однозначно может быть обнаружен в таблице символов. |
|
|
|
|
Функции профилирования должны быть предусмотрены |
|
|
|
|
пользователем. |
A |
|
|
|
|
|
|
|
|
Такое оснащение функций требует использования указателя |
|
|
|
|
фреймов. Некоторые уровни оптимизации запрещают |
|
|
|
|
использование указателя фреймов. Предохранит от этого |
|
|
|
|
задание опции -fno-omit-frame-pointer. |
|
|
|
|
Это оснастка также делается для функций, inline |
|
|
|
|
встраиваемых в другие функции. Профилирующие вызовы |
|
|
|
|
будут указывать где, в принципе, происходит вход и выход из |
|
|
|
|
inline встроенной функции. Это означает, что должны быть |
|
|
|
|
доступны адресуемые версии таких функций. Если все |
|
|
|
|
используемые вами функции встроены inline, вышесказанное |
|
|
|
|
Wilson |
|
|
|
|
может означать дополнительное увеличение размеров кода. |
|
|
|
|
Если extern inline используется в вашем коде Cи, то |
|
|
|
|
должна быть предусмотрена адресуемая версия таких |
|
|
|
|
функций. |
|
|
|
|
Если функции присвоен атрибут no_instrument_function, |
|
|
|
by |
|
|
|
|
|
тогда эта оснастка не будет сделана. |
|
|
-fno-ident |
|
Игнорировать директиву #ident |
|
|
|
|
|
|
|
-fpack-struct |
|
Паковать члены структур вместе без пропусков. Обычно вы |
|
|
|
|
не горите желанием использовать эту опцию, поскольку она |
|
|
|
|
делает код не оптимальным, а смещения членов структур не |
|
|
|
|
будут согласовываться с системными библиотеками. |
|
|
|
|
Устройство dsPIC® требует, чтобы слова были выровнены по |
|
|
|
|
границе четных байтов, так что следует быть весьма |
|
|
|
|
аккуратными при использовании атрибута упаковки, чтобы |
|
|
|
|
избежать ошибок адресации на этапе исполнения. |
|
|
|
|
|
|
|
-fpcc-struct-return |
|
Возвращать значения коротких struct и union, подобно |
|
|
Translated |
|
длинным, в памяти, а не в регистрах. Это соглашение менее |
|
|
|
эффективно, но у него есть преимущество совместимости |
||
|
|
вызовов между файлами, откомпилированными 16-битовым |
||
|
|
компилятором, и файлами, откомпилированными другими |
||
|
|
компиляторами. |
|
|
|
|
Короткие структуры и союзы — те, чей размер и |
||
|
|
выравнивание соответствует одному из целых типов. |
||
|
|
|
||
|
|
|
|
|
|
-fno-short-double |
|
По умолчанию компилятор использует тип double |
|
|
|
|
эквивалентный типу float. Эта опция делает double |
|
|
|
|
эквивалентным long double. Выборочное применение этой |
|
|
|
|
опции к разным модулям может иметь непредсказуемые |
|
|
|
|
результаты, если модули совместно используют данные типа |
|
|
|
|
double как непосредственно, через передачу аргументов, |
|
|
|
|
так и косвенно, через общее буферное пространство. |
|
|
|
|
Штатные библиотеки предусматривают обе установки опции. |
|
|
|
|
|
|
|
-fshort-enums |
|
Выделять для типа enum только такое количество байтов, |
|
|
|
|
которое нужно для объявленного диапазона возможных |
|
|
|
|
значений. А именно, тип enum будет эквивалентен |
|
|
|
|
наименьшему целому типу, который его вмещает. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DS51284H(ru) стр. 3-26 |
© 2008 Microchip Technology Inc. |