- •Глава 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. Битовые поля
Глава 6. Дополнительные типы указателей Си
управление компилятора регистром PSVPAG для ISR. Это необходимо для доступа к любым постоянным данным в пространстве auto_psv или любым строковым литералам или константам, когда выбрана опция по умолчанию -mconst-in-code. Создавая программу обслуживания прерывания, лучше всего определить, необходимо ли обеспечение установки по умолчанию для регистра PSVPAG.
Это достигается использованием следующего атрибута в определении функции обслуживания прерывания:
• auto_psv — компилятор установит регистр PSVPAG в нужное состояние для доступа к пространству auto_psv, гарантируя, что он будет восстановлен при
выходе из ISR |
. |
|
A |
• no_auto_psv — компилятор не будет устанавливать регистр PSVPAG |
|
Например: |
Wilson |
|
void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void) { IFS0bits.T1IF = 0;
}
Данный код (который не обеспечен атрибутом auto_psv), может не выполниться правильно, если не будет перекомпилирован. При перекомпиляции, если никаких указаний не сделано, компилятор выдаст предупреждение и выберет модель auto_psv.
Выбор предусмотрен с тем, чтобы, если вы хорошо представляете себе время задержки прерывания, вы могли бы выбрать наилучший вариант. Сохранение и установка PSVPAG потребует приблизительно 3 циклов на входе в функцию и одного дополнительного цикла, чтобыby восстановить его состояние на выходе из функции.
Заметьте, что boot или secure ISR будут использовать разные установки регистра PSVPAG для своих постоянных данных.
6.3.PMP указатели
НекоторыеTranslatedустройства содержат периферийное оборудование параллельного
мастер порта (PMP), который допускает непосредственное соединение с различными запоминающими и не только устройствами. Доступ к периферии управлялся через выбор периферийных устройств. Подробную информацию об этом периферийном устройстве можно найти в руководстве по семейству микроконтроллеров либо в справочных данных конкретного устройства.
Управление указателями PMP подобно управлению указателями PSV, описанному в предшествующем разделе. Эти указатели облегчают чтение и запись данных с использованием PMP.
Периферия, в зависимости от типа и марки подключенного устройства памяти, может потребовать существенного объема конфигурирования. Это конфигурирование не производится автоматически компилятором.
Представленные здесь расширения позволяют определить PMP переменную. Это означает, что компилятор свяжется с периферийным устройством PMP для того, чтобы иметь доступ к переменной.
Чтобы использовать эту возможность, необходимы:
•Инициализация PMP — определение функции инициализации: void __init_PMP(void)
•Объявление нового пространства памяти
•Определение переменных в пространстве PMP
6.3.1. Инициализация PMP
Периферийное устройство PMP должно быть инициализировано прежде, чем может быть правильно обработан любой доступ. Обратитесь к соответствующей
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 6-3 |
16-битовый компилятор Си. Руководство
документации на устройство, которое вы подключаете, и к инструкции по используемому вами 16-битовому микроконтроллеру.
При использовании PMP инструментальная среда будет вызывать функцию void __init_PMP(void) во время инициализации периода исполнения Cи. Если используется модифицированный пользователем процесс инициализации, убедитесь, что эта функция в нем вызвана.
Эта функция должна сделать необходимые установки в регистрах PMMODE и PMCON.
В частности: |
. |
|
|
• Периферийное устройство не должно быть конфигурировано для генерации |
|
прерываний: |
A |
|
|
PMMODEbits.IRQM = 0 |
Wilson |
|
• Периферийное устройство не должно быть конфигурировано, чтобы генерировать приращения:
PMMODEbits.INCM = 0
Компилятор изменит эту установку в течение периода исполнения как потребуется.
• Периферийное устройство должно быть инициализировано в 16-битовом режиме:
PMMODEbits.MODE16 = 1
Компилятор изменит эту установку в течение периода исполнения как потребуется.
• Периферийное устройство должно быть сконфигурировано для работы в одном из режимов МАСТЕРА:
PMMODEbits.MODE = 2 или PMMODEbits.MODE = 3
•Установите биты ожидания PMMODEbits.WAITB, PMMODEbits.WAITM, и
PMMODEbits.WAITE как требуется для подключенного устройства.
•Регистр PMCON должен быть сконфигурирован подходящим образом, чтобы
функциональные биты выбора кристалла PMCONbits.CSF соответствовали информации, переданной компилятору при определении пространства памяти.by
Например,Translatedмогло бы быть: void init PMP(void) {
PMMODEbits.IRQM = 0;
PMMODEbits.INCM = 0;
PMMODEbits.MODE16 = 1;
PMMODEbits.MODE = 3;
/* далее следует специфическое для устройства конфигурирование PMMODE и PMCCON */
}
6.3.2. Объявление нового пространства памяти
Инструментарий компилятора требует информации о каждой дополнительной памяти, подключаемой через PMP. Для того, чтобы компоновщик 16-битового устройства был способен правильно назначать память, должна быть предусмотрена информация о размере доступной памяти и количестве битов выбора кристалла.
В Главе 2. «Отличия 16-битового компилятора от ANSI» было введено новое пространство памяти pmp. Этот атрибут служит двум целям: объявлению расширенного пространства памяти и назначению внешней памяти для декларации переменной Си (этому посвящен следующий подраздел).
При объявлении расширенной памяти требуется задать ее размер. Вы можете дополнительно назначить памяти отдельный вывод выборки кристалла; если ничего не будет назначено, предполагается, что выбор кристалла не используется. Эти декларации памяти выглядят похожим на обычные внешние декларации Cи:
extern int external_PMP_memory __attribute__((space(pmp(size(1024),cs(0)))));
DS51284H(ru) стр. 6-4 |
© 2008 Microchip Technology Inc. |