- •Глава 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-10. (ПРОД-Е) ОПЦИИ МАШИННО-НЕЗАВИСИМОЙ ОПТИМИЗАЦИИ
Опция |
|
|
Описание |
|
|
|
|
|
|
-fno-inline |
|
|
Не обращать внимание на ключевое слово inline. Обычно |
|
|
|
|
эта опция используется, чтобы запретить компилятору |
|
|
|
|
встраивание любых inline функций. Если оптимизация не |
|
|
|
|
разрешена, никакие функции не могут быть встроены. |
|
|
|
|
||
-fomit-frame-pointer |
|
Не хранить указатель фрейма в регистре для функций, |
||
|
|
|
которым он не нужен. Это помогает избежать команд |
|
|
|
|
сохранения, установки и восстановления указателей |
|
|
|
|
фреймов, а также делает дополнительные регистры |
|
|
|
|
доступными во многих функциях. |
|
|
|
|
||
-foptimize-sibling- |
|
Оптимизировать родственные (sibling) и хвостовые (tail) |
||
calls |
|
|
рекурсивные вызовы. |
. |
|
|
|
A |
|
3.5.7. Опции для управления препроцессором |
||||
Следующие опции управляют препроцессором компилятора. |
||||
ТАБЛИЦА 3-11. ОПЦИИ ПРЕПРОЦЕССОРА |
|
|||
|
|
|
|
|
Опция |
|
|
Описание |
|
|
|
|
||
-Aquestion (answer) |
|
Назначает ответ answer для вопроса question, в случае |
||
|
|
|
если он проверяется условиями препроцессора |
|
|
|
|
#if #question (answer). Опция -A отменяет стандартные |
|
|
|
|
назначения, которые обычно описывают целевую машину. |
|
|
|
|
Wilson |
|
|
|
|
Например прототип функции main может быть объявлен как: |
|
|
|
|
#if #environ(freestanding) |
|
|
|
|
int main(void); |
|
|
|
|
#else |
|
|
|
|
int main(int argc, char *argv[]); |
|
|
|
by |
|
|
|
|
|
#endif |
|
|
|
|
Опция командной строки -A затем может быть использована |
|
|
|
|
для выбора между двумя прототипами. Например, для |
|
|
|
|
выбора первого из двух, может быть использована |
|
|
|
|
следующая опция командной строки: |
|
|
|
|
-Aenviron (freestanding) |
|
|
|
|
|
|
-A -predic |
=answer |
|
Отменяет назначение с предикатом predicate и ответом |
|
|
|
|
answer. |
|
|
|
|
||
-A predicate =answer |
|
Создание назначения с предикатом predicate и ответом |
||
|
|
|
answer. Эта форма предпочтительней старой формы |
|
|
|
|
-A predicate(answer), которая продолжает |
|
|
|
|
поддерживаться, поскольку не использует специальные |
|
|
|
|
символы оболочки. |
|
|
|
|
|
|
-C |
|
|
Предписание препроцессору не избавляться от |
|
|
|
|
комментариев. Используется с опцией -E. |
|
|
|
|
|
|
-dD |
|
|
Предписание препроцессору не удалять макроопределения в |
|
Translated |
|
выходном файле в их реальной последовательности. |
||
-Dmacro |
|
|
Определение макро как macro=’1’ |
|
|
|
|
|
|
-Dmacro=defn |
|
|
Определение макро как macro=’defn’. Все вхождения -D |
|
|
|
|
в командной строке обрабатываются до обработки опций -U |
|
|
|
|
|
|
-dM |
|
|
Предписание препроцессору вывести только список |
|
|
|
|
макроопределений, которые действуют в конце |
|
|
|
|
препроцессирования. Используется с опцией -E. |
|
|
|
|
|
|
-dN |
|
|
Аналогична -dD, за исключением того, что опускаются |
|
|
|
|
аргументы и содержание макро. Выводятся только |
|
|
|
|
#define name. |
|
|
|
|
|
|
DS51284H(ru) стр. 3-19
16-битовый компилятор Си. Руководство
ТАБЛИЦА 3-11. (ПРОД-Е) ОПЦИИ ПРЕПРОЦЕССОРА
|
Опция |
|
Описание |
|
|
|
|
|
-fno-show-column |
Не выводить номера колонок в диагностических сообщениях. |
|
|
|
Это может быть необходимо, когда диагностика выдается |
|
|
|
программой, которая не понимает номера колонок, такой как |
|
|
|
dejagnu. |
|
|
|
|
|
|
-H |
Выводить имя каждого использованного файла заголовка |
|
|
|
вдобавок к обычному выводу. |
|
|
|
|
|
|
-I- |
Любые каталоги, определенные с опцией -I до опции -I- |
|
|
|
|
. |
|
|
используются для поиска только файлов заданных |
|
|
|
директивой #include "file", но не для поиска файлов, |
|
|
|
заданных #include <file>. |
|
|
|
Если дополнительные директории определяются опцией -I |
|
|
|
после опции -I-, то ониA |
используются для поиска всех |
|
|
Wilson |
|
|
|
файлов заданных директивами #include. (Обычно все -I |
|
|
|
директории используются таким способом.) Кроме того, |
|
|
|
опция -I- запрещает использование текущего каталога (т.е. |
|
|
|
того, откуда берется текущий входной файл) как первого |
|
|
|
каталога для поиска файлов по #include "file". Нет |
|
|
|
способа аннулировать этот эффект -I-. С помощью опции |
|
|
|
-I. вы можете определить для поиска директорию, которая |
|
|
|
была текущей при вызове компилятора. Это не точно то же |
|
|
|
самое, что препроцессор делает по умолчанию, но часто |
|
|
|
этого вполне достаточно. |
|
|
|
-I- не запрещает использования стандартных системных |
|
|
|
by |
|
|
|
каталогов для файлов заголовка. Т.е. опции -I- и -nostdinc |
|
|
|
— независимы. |
|
|
-Idir |
Добавить каталог dir в начало списка директорий для поиска |
|
|
|
файлов заголовка. Это может быть использовано, чтобы |
|
|
Translated |
аннулировать системный файл заголовка, заменяющий вашу |
|
|
пригодных для использования при просмотре основного |
||
|
|
собственную версию, поскольку в этих директориях поиск |
|
|
|
будет производиться перед поиском в директориях |
|
|
|
системных файлов заголовка. Если Вы используете более, |
|
|
|
чем одну опцию -I, директории будут сканироваться в |
|
|
|
порядке слева направо, стандартные системные директории |
|
|
|
будут проверены после. |
|
|
-idirafter dir |
Добавить каталог dir ко второму маршруту поиска |
|
|
|
включаемых файлов. Поиск в каталогах второго маршрута |
|
|
|
производится, когда заголовочный файл не обнаружен ни в |
|
|
|
одном из каталогов в главном маршруте включения (т.е. в |
|
|
|
том, к которому добавляет каталоги опция -I). |
|
|
|
|
|
|
-im cros file |
Перед обработкой обычного входного файла обработать |
|
|
|
заданный именем file файл как входной, без выдачи |
|
|
|
выходного результата. Т.к. выходной результат обработки |
|
|
|
отсутствует, то единственным эффектом опции |
|
|
|
-imacros file будет создание макроопределений, |
|
|
|
входного файла. |
|
|
|
Любые -D и -U опции командной строки всегда |
|
|
|
обрабатываются перед -imacros file, независимо от |
|
|
|
последовательности, в которой они записаны. Все опции |
|
|
|
-include и -imacros обрабатываются в том порядке, в |
|
|
|
котором они записаны. |
|
|
|
|
|
|
-include file |
Обработать файл как входной перед обработкой обычного |
|
|
|
входного файла. Реально содержание файла компилируется |
|
|
|
первым. Любые -D и -U опции командной строки всегда |
|
|
|
обрабатываются перед -include file, независимо от |
|
|
|
последовательности в которой они записаны. Все опции |
|
|
|
-include и -imacros обрабатываются в том порядке, в |
|
|
|
котором они записаны. |
|
|
|
|
|
|
|
|
|
|
|
|
|
DS51284H(ru) стр. 3-20 |
© 2008 Microchip Technology Inc. |
Глава 3. Использование компилятора в командной строке
ТАБЛИЦА 3-11. (ПРОД-Е) ОПЦИИ ПРЕПРОЦЕССОРА
Опция |
|
Описание |
|
|
|
-iprefix prefix |
|
Определить prefix как префикс для последующих опций |
|
|
-iwithprefix |
|
|
|
-isystem dir |
|
Добавить каталог в начало второго маршрута поиска |
|
|
включаемых файлов, пометив его как системный каталог, |
|
|
чтобы обеспечить ему тот же специальный режим обработки, |
|
|
который применяется к стандартным системным |
|
|
директориям. |
|
|
|
-iwithprefix dir |
|
. |
|
Добавить каталог ко второму маршруту поиска включаемых |
|
|
|
файлов. Имя каталога получается конкатенацией префикса и |
|
|
dir, где префикс определялся предварительно опцией |
|
|
-iprefix. Если префикс еще не определен, по умолчанию |
|
|
используется каталог,Aсодержащий установленные |
|
|
компоненты компилятора. |
-iwithprefixbefore dir |
|
Добавить каталог ко основному маршруту поиска |
|
|
включаемых файлов. Имя каталога получается |
|
|
конкатенацией префикса и dir, по аналогии с опцией |
|
|
-iwithprefix. |
|
|
|
-M |
|
Заставить препроцессор выводить пригодные для make |
|
|
правила, описывающие зависимости каждого объектного |
|
|
файла. Для каждого исходного файла препроцессор выводит |
|
|
одно make-правило, чья цель — имя объектного файла для |
|
|
этого исходного файла и чьими зависимостями являются все |
|
|
#includeWilsonзаголовочные файлы, которые он использует. Это |
|
by |
|
|
|
правило может быть одиночной строкой или может быть |
|
|
продолжено с помощью символа перехода на новую строку |
|
|
‘\’, если она длинная. Список правил выдается в |
|
|
стандартный вывод вместо результатов препроцессорной |
Translated |
|
обработки программы на Cи. |
|
-M подразумевает -E (см. п. 3.5.2. «Опции для управления |
|
|
|
|
|
|
типом результатов») |
|
|
|
-MD |
|
Опция аналогична -M, но информация о зависимостях |
|
|
выдается в файл и компиляция продолжается. Файлу с |
|
|
информацией о зависимостях дается имя входного файла и |
|
|
расширение .d |
|
|
|
-MF file |
|
Когда используется с -M или -MM, определяет файл для |
|
|
записи зависимостей. Если опция -MF не задана, |
|
|
препроцессор пишет правила туда же, куда он должен |
|
|
выдавать результаты препроцессорной обработки. |
|
|
Когда используется с драйверными опциями -MD или -MMD, |
|
|
-MF меняет принятый по умолчанию выходной файл |
|
|
зависимостей. |
|
|
|
-MG |
|
Обрабатывать пропущенные файлы заголовка как |
|
|
сгенерированные файлы и полагать, что они находятся в том |
|
|
же каталоге, что и исходный файл. Если задана опция -MG, то |
|
|
-M или -MM также должна быть задана. -MG не |
|
|
поддерживается с опциями -MD или -MMD. |
|
|
|
-MM |
|
Подобна -M, но рассматриваются только пользовательские |
|
|
файлы заголовков, включенные по #include “file”. |
|
|
Системные файлы заголовков, включенные по |
|
|
#include <file>, опускаются. |
|
|
|
-MMD |
|
Подобна -MD за исключением того, что рассматриваются |
|
|
только пользовательские файлы заголовков, а не системные. |
|
|
|
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 3-21 |
16-битовый компилятор Си. Руководство
ТАБЛИЦА 3-11. (ПРОД-Е) ОПЦИИ ПРЕПРОЦЕССОРА
Опция |
|
|
|
Описание |
|
|
|
||
-MP |
|
Добавлять ложную цель для каждой зависимости, кроме |
||
|
|
основного файла, чтобы каждый зависел не от чего. Это |
||
|
|
бесполезное правило позволяет устранять ошибки, которые |
||
|
|
дает make, если вы удаляете файлы заголовка не внося |
||
|
|
соответствующих изменений в make-файл. |
||
|
|
Вот типичный выход: |
|
|
|
|
test.o: test.c test.h |
||
|
|
test.h: |
|
|
|
|
|
|
|
-MQ |
|
Подобна -MT, но любые |
. |
|
|
символы для make заключаются в |
|||
|
|
одиночные кавычки. |
A |
|
|
|
|
|
|
|
|
-MQ ‘$(objpfx)foo.o’ дает $$(objpfx)foo.o: foo.c |
||
|
|
Цель по умолчанию берется в кавычки автоматически, так, |
||
|
|
Wilson |
|
|
|
|
как если бы она была задана с -MQ. |
||
-MT target |
|
Меняет цель правила, выданного при генерации зависимости. |
||
|
|
По умолчанию препроцессор берет имя основного входного |
||
|
|
файла, включая путь, удаляет суффикс имени файла, такой |
||
|
|
как .c и присоединяет обычный для платформы суффикс |
||
|
|
объектного файла. Результат и будет целью. |
||
|
|
Опция -MT устанавливает цель в точном соответствии с |
||
|
|
заданной вами строкой. Если нужно несколько целей, вы |
||
|
|
можете задать их одним аргументом -MT или использовать |
||
|
|
несколько опций -MT. Например: |
||
|
|
-MT ‘$(objpfx)foo.o’ может дать |
||
|
by |
|
|
|
|
|
$$(objpfx)foo.o: foo.c |
||
-nostdinc |
|
Не искать файлы заголовка в стандартных системных |
||
|
|
каталогах. Использовать для поиска только каталоги, |
||
|
|
заданные с помощью опции -I (и текущий каталог, если |
||
Translated |
|
подходит). Подробнее об опции -I см. п. 3.5.10. «Опции для |
||
|
поиска в каталогах» |
|
|
|
|
|
|
|
|
|
|
Используя -nostdinc и -I- можно ограничить маршрут |
||
|
|
поиска включаемых файлов только теми каталогами, которые |
||
|
|
заданы явно |
|
|
|
|
|
||
-P |
|
Запретить препроцессору генерацию директив #line. |
||
|
|
Используется с опцией -E (см. п. 3.5.2. «Опции для |
||
|
|
управления типом результатов») |
||
|
|
|
||
-trigraphs |
|
Включить поддержку триграфов ANSI Си. Опция -ansi дает |
||
|
|
тот же эффект. |
|
|
|
|
|
||
-Umacro |
|
Отменить определение макроса macro. Опция -U |
||
|
|
определяется после всех опций -D, но перед опциями |
||
|
|
-include и -imacros. |
|
|
|
|
|
||
-undef |
|
Не предопределять любые нестандартные макросы (включая |
||
|
|
флаги архитектуры) |
|
|
|
|
|
|
|
3.5.8. Опции для ассемблера
Следующие опции управляют работой ассемблера.
ТАБЛИЦА 3-12. ОПЦИИ ДЛЯ АССЕМБЛЕРА
Опция |
Описание |
|
|
-Wa,option |
Передать опцию option ассемблеру. Если option содержит |
|
запятые, она разбивается этими запятыми на несколько |
|
опций. |
|
|
DS51284H(ru) стр. 3-22 |
© 2008 Microchip Technology Inc. |