- •Глава 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. Битовые поля
Руководство пользователя по MPLAB® компилятору Си для PIC24 и dsPIC®
Глава 6. Дополнительные типы указателей Си
6.1.Введение
Компилятор MPLAB Си для PIC24 и dsPIC® (бывший C30), предлагает несколько
расширений режимов указателей, чтобы облегчить доступ |
к уникальным |
|
|
. |
Данная глава |
возможностям архитектуры 16-битовых устройств Microchip. |
||
|
A |
|
посвящена расширенным указателям и их использованию. |
|
|
• Управляющие PSV указатели — для чтения большего количества данных через |
||
PSV |
Wilson |
|
|
|
• PMP указатели — для доступа к данным через периферию PMP (где возможно)
•Внешние указатели — для доступа к внешней памяти средствами, определенными пользователем
Хотя основное внимание будет сосредоточено на доступе к указателю, но также охвачено определение переменных и обеспечение расположения данных в правильной области памяти 16-битовых архитектур.
Эта глава использует понятия, введенные в Главе 2. «Отличия 16-битового компилятора от ANSI».
6.2.Управляющие PSV указатели
Семейства процессоров dsPIC30F/33F и PIC24F/H содержат аппаратные средства |
|
поддержки доступа к даннымby |
в программной Flash памяти, использующие |
Translated |
|
аппаратную особенность, которую обычно называют «видимость программного пространства» (PSV). Более подробно о работе PSV можно узнать из документации на устройство или руководства по семейству. Также, см. п. 4.14. «Использование видимости программного пространства (PSV)» и п. 8.10. «Использование PSV в ISR».
Не вдаваясь в подробности, архитектура позволяет отображать одну 32К страницу Flash памяти в верхние адреса пространства данных используя специальный регистр (SFR) PSVPAG. По умолчанию компилятор поддерживает прямой доступ только к одной единственной PSV странице, известной как пространство auto_psv. В этой модели можно использовать 16-битовые указатели. Однако, на устройствах с памятью большего размера, это может затруднить управление большими объемами постоянных данных, хранящихся во Flash.
Описываемые здесь расширения разрешают определение переменной как «управляющей» переменной PSV. Это означает, что компилятор будет манипулировать и смещением (в пределах страницы PSV), и самой страницей. Как следствие, указатели данных должны быть 32-битовыми. Компилятор, вероятно, будет генерировать больше команд, чем для одностраничной модели PSV, но это цена большей гибкости и меньшего времени кодирования при получении доступа к большим объемам данных во Flash.
6.2.1. Определение данных для управления доступом PSV
Глава 2. «Отличия 16-битового компилятора от ANSI» вводит расширения Cи, которые допускают идентификацию дополнительной информации для переменной или функции. Компилятор предоставляет атрибут space для помещения переменных в разные области (пространства) памяти.
|
|
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 6-1 |
16-битовый компилятор Си. Руководство
Например, чтобы поместить переменную в пространство auto_psv, т.е. выделить во Flash участок памяти, легкодоступный через единственную установку регистра PSVPAG, достаточно определить:
unsigned int FLASH_variable __attribute__((space(auto_psv)));
Доступны и другие пользовательские пространства, которые имеют отношение к Flash:
• space(psv) — пространство PSV, к которому компилятор не имеет автоматического доступа
• space(prog) — некоторая область во Flash, к которой компилятор не имеет авто-
матического доступа |
|
A |
|
Заметьте, что и psv, и |
|
соответствующим образом |
|
auto_psv пространства. |
|||
сблокированы или выровнены так, чтобы единственная установка PSVPAG была |
|||
пригодная для доступа ко всей переменной. |
|
|
|
|
Wilson |
|
|
6.2.2. Управляемый доступ PSV |
|
|
Простое размещение чего-то во Flash с использованием атрибута space еще не означает, что компилятор будет способен управлять доступом. Компилятор требует, чтобы Вы идентифицировали переменные особым способом. Так сделано, поскольку управление PSV может быть менее эффективным, чем управление PSVPAG вручную (хотя и значительно менее сложным).
Компилятор предлагает несколько новых квалификаторов (CV-квалификаторы для языковых законников). Подобно квалификатору const-volatile, новые квалификаторы применимы к указателям или объектам. Это:
•__psv__ для доступа к объектам, которые не пересекают границу PSV, как например те, что размещены в space(auto_psv) или space(psv)
•__prog__ для доступа к объектам, которые могут пересекать границу PSV,
особенно тем, что размещены в space(prog), но он может быть применен и к любому объекту во Flashby
ОбычноTranslatedнет необходимости определять __psv__ или __prog__ для объекта,
расположенного в space(auto_psv), хотя и нет причины, запрещающей это делать.
Перемещение FLASH_variable, описанной в предыдущем подразделе, в обычное пространство F ash и поручение компилятору управлять пространством делается просто:
psv unsigned int FLASH_variable __attribute__((space(psv)));
Чтение переменной теперь заставит компилятор генерировать код, который настраивает SFR PSVPAG так, чтобы иметь правильный доступ к переменной. Эти же квалификаторы могут аналогично оформлять указатели:
psv unsigned int *pFLASH;
создает указатель на что-то в PSV, который может быть обычным способом использован для управления объектом PSV. Например:
pFLASH = &FLASH_variable;
6.2.3. Рассмотрение ISR
Доступ к данным с использованием управляющих PSV указателей по определению не «атомарный», т.е. требует некоторого количества команд для завершения операции. Следует уделить внимание тому, чтобы процесс доступа не прерывался.
Кроме того, программа обслуживания прерывания (ISR) реально никогда не знает, какую текущую настройку будет иметь регистр PSVPAG. К несчастью, компилятор действительно не в состоянии определить, важно это или нет во всех случаях.
Компилятор сделает упрощающее предположение, что автор программы обслуживания прерывания будет знать, требуется или нет автоматическое
DS51284H(ru) стр. 6-2 |
© 2008 Microchip Technology Inc. |