
- •Глава 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-15. (ПРОД-Е) ОПЦИИ СОГЛАШЕНИЙ О ГЕНЕРАЦИИ КОДА
Опция |
|
Описание |
|
|
|
-fverbose-asm |
Выводить дополнительные комментарии в создаваемый |
|
-fno-verbose-asm |
ассемблерный код для улучшения его читабельности. |
|
|
Принятая по умолчанию опция -fno-verbose-asm убирает |
|
|
всю дополнительную информацию из ассемблерного файла, |
|
|
что полезно при сравнении двух файлов на ассемблере. |
|
|
|
|
-fvolatile |
Рассматривать всю память, доступную посредством |
|
|
указателей, как непостоянную. |
|
|
|
|
-fvolatile-global |
Рассматривать всю память, доступную для внешних и |
|
|
глобальных данных, как непостоянную. Использование этой |
|
|
опции не воздействует на static данные. |
|
|
|
. |
-fvolatile-static |
Рассматривать всю память, доступную для static данных, |
|
|
как непостоянную. |
A |
3.6.Переменные окружения
Переменные в этой секции — необязательные, но, будучи определены, они используются компилятором. Драйвер компилятора или другая программа могут сами задать подходящие величины для некоторых из следующих переменных окружения, если они не установлены. Драйвер или другая программа пользуются преимуществом внутренних сведений об установке компилятора. До тех пор, пока структура установки остается нетронутой, со всеми подкаталогами и исполняемыми
модулями, остающимися в той же относительной позиции, драйвер или программа |
||
|
Wilson |
|
будут способны определить подходящую величину. |
||
ТАБЛИЦА 3-16. ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ ДЛЯ КОМПИЛЯТОРА |
||
|
|
|
Переменная |
by |
Описание |
|
|
|
PIC30 C INCLUDE PATH |
Значение этой переменной представляет собой список |
|
|
каталогов, разделенных точками с запятой, очень похожий на |
|
|
PATH. Когда компилятор ищет файлы заголовков, он |
|
|
проверяет каталоги, представленные в переменной, после |
|
|
проверки тех, что заданы опцией -I, но перед проверкой |
|
|
стандартных директорий для файлов заголовков. |
|
|
Если переменная окружения не задана, препроцессор |
|
|
выбирает подходящее значение на основе стандартной |
|
|
установки. По умолчанию, для поиска включаемых файлов |
|
|
будут проверены следующие каталоги: |
|
|
<install-path>\include и <install-path>\support\h |
|
|
|
|
PIC30 COMPILER PATH |
Значение переменной PIC30_COMPILER_PATH представляет |
|
Translated |
собой список каталогов, разделенных точками с запятой, |
|
очень похожий на PATH. Компилятор проверяет заданные |
||
таким образом каталоги при поиске программ. Если там |
||
программа не найдена, используется переменная |
||
PIC30_EXEC_PREFIX. |
|
|
|
|
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 3-27 |

16-битовый компилятор Си. Руководство
ТАБЛИЦА 3-16. (ПРОД-Е) ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ ДЛЯ КОМПИЛЯТОРА
|
|
Переменная |
|
|
|
|
Описание |
|
|
|
|
|
|
|
|
|
|
|
|
PIC30_EXEC_PREFIX |
|
|
Когда переменная PIC30_EXEC_PREFIX установлена, она |
|||
|
|
|
|
|
|
определяет префикс, используемый в именах программ, |
||
|
|
|
|
|
|
запускаемых компилятором. При использовании префикса с |
||
|
|
|
|
|
|
именем программы разделитель каталогов автоматически не |
||
|
|
|
|
|
|
добавляется, поэтому вы сами должны добавлять символ |
||
|
|
|
|
|
|
обратной косой черты в конце строки префикса, если нужно. |
||
|
|
|
|
|
|
Если компилятор не найдет нужную программу по |
||
|
|
|
|
|
|
местоположению, заданному префиксом, он попытается |
||
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
искать ее, используя переменную окружения PATH. |
||
|
|
|
|
|
|
|
|
A |
|
|
|
|
|
|
Если переменная PIC30_EXEC_PREFIX не установлена или |
||
|
|
|
|
|
|
установлена на пустое значение, драйвер компилятора |
||
|
|
|
|
|
|
выбирает значение, соответствующее стандартной |
||
|
|
|
|
|
|
инсталляции. Если установка не изменялась, в результате |
||
|
|
|
|
|
|
Wilson |
|
|
|
|
|
|
|
|
этого драйвер способен найти необходимые программы. |
||
|
|
|
|
|
|
Другие префиксы, заданные с помощью опции командной |
||
|
|
|
|
|
|
строки -B, имеют приоритет перед определенными |
||
|
|
|
|
|
|
пользователем или драйвером компилятора значениями |
||
|
|
|
|
|
|
переменной PIC30_EXEC_PREFIX. |
||
|
|
|
|
|
|
В обычных условиях лучше всего оставлять эту переменную |
||
|
|
|
|
|
|
неопределенной и предоставлять драйверу находить |
||
|
|
|
|
|
|
программы самому. |
|
|
|
|
|
|
|
|
|
||
|
|
PIC30_LIBRARY_PATH |
|
Значение этой переменной представляет собой список |
||||
|
|
|
|
|
|
каталогов, разделенных точками с запятой, очень похожий на |
||
|
|
|
|
|
|
PATH. Эта переменная определяет список каталогов, |
||
|
|
|
|
|
|
передаваемый компоновщику. Драйвер по умолчанию |
||
|
|
|
|
|
|
задает ей значение: |
|
|
|
|
|
|
|
|
<install-path>\lib;<install-path>\support\gld |
||
|
|
|
|
|
by |
|||
|
|
PIC30_OMF |
|
Определяет формат объектного модуля (Object Module For- |
||||
|
|
компилятором.Translated |
|
mat, OMF) используемого компилятором. По умолчанию |
||||
|
|
|
|
|
|
|||
|
|
|
|
|
|
создается объектный файл COFF. Если переменная |
||
|
|
|
|
|
|
окружения PIC30_OMF имеет значение elf, будет |
||
|
|
|
|
|
|
создаваться объектный файл ELF. |
||
|
|
|
|
|
|
|
|
|
|
|
TMPDIR |
|
|
Если переменная TMPDIR задана, она определяет каталог |
|||
|
|
|
|
|
|
для временных файлов. Компилятор использует временные |
||
|
|
|
|
|
|
файлы для хранения результатов отдельной стадии |
||
|
|
|
|
|
|
компиляции, которые будут нужны для следующей стадии: |
||
|
|
|
|
|
|
например выходные результаты препроцессора, которые |
||
|
|
|
|
|
|
будут входными для собственно компилятора. |
||
|
|
|
|
|
|
|
|
|
3.7. |
Предопределенные имена макро |
|
||||||
|
Компилятор предопределяет отдельные макросы, которые могут проверяться |
|||||||
|
условными директивами в исходном коде. |
|
||||||
|
Используются следующие символы для препроцессоной обработки, определенные |
|||||||
|
|
|
|
|
|
|
|
|
|
|
Компилятор |
|
|
Символ |
|
Определяется ли опцией -ansi ? |
|
|
|
|
|
|
|
|
|
|
|
|
16-битовый |
|
С30 |
|
|
|
нет |
|
|
компилятор |
|
|
|
|
||
|
|
|
__С30 |
|
да |
|||
|
|
|
|
|
|
|
||
|
|
|
|
__C30__ |
|
да |
||
|
|
|
|
|
|
|
||
|
|
ELF специфика |
|
C30ELF |
|
нет |
||
|
|
|
|
|
|
|
||
|
|
|
|
__C30ELF |
|
да |
||
|
|
|
|
|
|
|
||
|
|
|
|
__C30ELF__ |
|
да |
||
|
|
|
|
|
|
|
||
|
|
COFF специфика |
|
C30COFF |
|
нет |
||
|
|
|
|
|
|
|
||
|
|
|
|
__C30COFF |
|
да |
||
|
|
|
|
|
|
|
||
|
|
|
|
__C30COFF__ |
|
да |
||
|
|
|
|
|
|
|
|
|
DS51284H(ru) стр. 3-28 |
© 2008 Microchip Technology Inc. |

Глава 3. Использование компилятора в командной строке
Следующие символы задают целевое семейство
Символ |
Определяется ли опцией -ansi ? |
|
|
__dsPIC30F__ |
да |
__dsPIC33F__ |
да |
|
|
__PIC24F__ |
да |
|
|
__PIC24H__ |
да |
|
|
Кроме того, компилятор на основе целевого устройства определяет символ, |
|
устанавливаемый с помощью -mcpu=. Например, -mcpu=30F6014, что определяет |
|
символ __dsPIC30F6014__. |
A |
|
|
Компилятор определит константу __C30_VERSION. __, давая ей числовую величину |
|
идентификатора версии. Это может быть использовано для получения преимуществ |
|
от новых возможностей компилятора, при том сохраняя обратную совместимость с |
|
более старыми версиями. |
|
Величина получается из старших и младших чисел версии текущей реализации. |
|
Например, реализация версии 2.00 будет иметь __C30_VERSION__ определенную |
|
как 200. Это макро может быть использовано вместе со стандартными операторами |
|
сравнения препроцессора, чтобы условно включать или исключать различные |
|
конструкции кода. |
|
Текущее значение __C30_VERSION может быть обнаружено с помощью опции |
|
командной строки --version, или из содержания файла README.html, что |
|
поставляется вместе с реализацией.Wilson |
|
3.8. Компиляция единственногоby |
Приложении |
E. «Осуждаемые |
файла в командной |
|
|
строке |
|
|
|
компоновать |
единственный файл. |
|
установлен |
на вашем диске c: |
|
следующее: |
|
• c:\ProgrTranslatedm Files\Microchip\MPLAB C30\include — каталог для включаемых файлов заголовков ANSI Cи. В этом каталоге компилятор хранит
файлы заголовков стандартных системных библиотек Си. Переменная среды PIC30 C INCLUDE_PATH может указать на этот каталог. (Чтобы проверить это достаточно напечатать set из командного приглашения DOS.)
• c:\Program Files\Microchip\MPLAB C30\support\dsPIC30F\h — каталог для включаемых файлов заголовков, специфических для dsPIC® устройств. Это каталог, где компилятор хранит зависящие от типа dsPIC устройства файлы заголовков.
• c:\Program Files\Microchip\MPLAB C30\lib — библиотечный каталог: в этом каталоге находятся библиотеки и заранее откомпилированные объектные файлы.
• c:\Program Files\Microchip\MPLAB C30\support\dsPIC30F\gld —
каталог сценариев компоновщика: в этом каталоге можно найти файлы зависящих от устройств сценариев компоновки.
• c:\Program Files\Microchip\MPLAB C30\bin — каталог приложений: в этом каталоге расположены программы компилятора. Переменная среды PATH должна включать этот каталог.
Далее приведена простая Си программа для сложения двух чисел.
Создайте ее с помощью любого текстового редактора и сохраните как файл ex1.c.
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 3-29 |

int a, unsigned int b);
|
unsigned int x, y, z; |
|
|
|
int |
|
|
|
main(void) |
|
|
|
{ |
|
|
|
x = 2; |
|
. |
|
y = 5; |
|
|
|
z = Add(x,y); |
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
A |
|
unsigned int |
|
|
|
|
|
|
|
Add(unsigned int a, unsigned int b) |
|
|
|
{ |
|
|
|
return(a+b); |
|
|
|
} |
|
|
|
Первая строка программы включает файл заголовка p30f2010.h, который |
||
|
обеспечивает определение для всех SFR данного устройства. Более подробно о |
||
|
файлах заголовка, см. главу 7 «Файлы поддержки устройства». |
||
|
Компилируйте программу введя следующую команду в ответ на приглашение DOS: |
||
|
|
Wilson |
|
|
C:\> pic30-gcc -o ex1.o ex1.c |
|
|
|
Опция командной строки -o ex1.o присваивает имя исполняемому выходному |
||
|
файлу формата COFF (если бы опция -o не была определена, то выходной файл был |
||
|
бы назван a.exe). Выполняемый файл COFF может быть загружен в MPLAB IDE. |
||
|
by |
|
файл, используйте |
|
|
|
|
3.9. |
Компиляция нескольких файлов в командной строке |
||
|
|
|
продемонстрировать |
unsignedTranslatedint x, y, z; будут:
int |
main(void) |
|
{ |
|
|
x |
= 2; |
|
y |
= |
5; |
z |
= |
Add(x,y); |
return 0;
}
DS51284H(ru) стр. 3-30 |
© 2008 Microchip Technology Inc. |