- •Глава 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. Битовые поля
16-битовый компилятор Си. Руководство
• Пример внешней памяти
6.4.1. Объявление нового пространства памяти
Это очень похоже на объявление нового пространства памяти для доступа через PMP.
16-битовый инструментарий требует информации о всякой внешней памяти. Для того, чтобы компоновщик 16-битового устройства мог правильно распределять память, требуются данные о размере доступной памяти и, необязательно, о ее начале.
В Главе 2. «Отличия |
16-битового компилятора |
от ANSI» было введено новое |
пространство памяти |
|
. |
external. Этот атрибут служит двум целям: объявление |
||
|
A |
|
пространства расширенной памяти и деклараций переменных Си для внешней |
||
памяти (этому посвящен следующий подраздел). |
|
Объявляемая расширенная память требует данных о размере. Вы можете дополнительно определить началоWilsonэтой памяти, если ничего не определено, начальным адресом будет считаться 0x0000.
extern int external_memory __attribute__((space(external( ize(1024)))));
Выше определена внешняя память размера 1024 байта. Эта память может однозначно быть идентифицирована данным ей именем external_memory.
6.4.2. Определение переменных во внешнем пространстве
Атрибут пространства external также используется для создания конкретных переменные в пространстве.by Для этого требуется присутствие декларации пространства памяти. Для заданной в предыдущем подразделе декларации может быть сделано следующее объявление переменной:
__external__ int external_array[256] Translatedattribute__((space(external(external_memory))));
external array будет расположен в ранее объявленной памяти external memory.
Заметьте, что, подобно управляющим указателям PSV, мы квалифицировали переменную с новым квалификатором __external__. Будучи примененным к переменной или указателю, он указывает компилятору на необходимость генерировать правильную последовательность для доступа.
Теперь, когда переменная объявлена, она может быть доступна средствами обычного синтаксиса Cи. Компилятор будет генерировать код для доступа к переменной посредством специальных вспомогательных функций, которые должен определить программист. Этому посвящен следующий подраздел.
6.4.3. Определение способа доступа к пространству памяти
Ссылки на переменные, расположенные во внешней памяти, управляются с помощью ряда вспомогательных функций. Вплоть до пяти (5) функций может быть определено для чтения и пяти (5) — для записи. Каждая из них — это обычная функция, которая будет вызвана, если любая из других четырех не определена, но требуется. Если ни одна из функций не определена, компилятор выдает сообщение об ошибке. Короткий пример будет представлен в следующем подразделе. Обычно определение индивидуальных функций позволяет генерировать более эффективный код.
6.4.3.1. Функции чтения read_external
void __read_external(unsigned int address, unsigned int memory_space,
void *buffer, unsigned int len)
DS51284H(ru) стр. 6-6 |
© 2008 Microchip Technology Inc. |
Глава 6. Дополнительные типы указателей Си
Это общая функция чтения, которая будет вызвана, если одна из следующих функций потребовалась, но не была определена. Эта функция должна выполнить необходимые действия для заполнения len байтов памяти в буфере buffer из внешней памяти, именуемой memory_space, начиная с адреса address.
read_external8
unsigned char __read_external8(unsigned int address, unsigned int memory_space)
Читает 8 битов из пространства внешней памяти memory_space, начиная с адреса address. Компилятор предпочел бы вызвать эту функцию при попытке доступа к
любому объекту размером 8 битов. |
. |
|
read_external16 |
|
unsigned int __read_external16(unsigned int address, |
|
unsigned int memory_space) |
A |
unsigned long __read_externaWilson32(unsigned int address,
Читает 16 битов из пространства внешней памяти memory_space, начиная с адреса
address. Компилятор предпочел бы вызвать эту функцию при попытке доступа к любому объекту размером 16 битов.
read_external32
unsigned int memory_space)
Читает 32 бита из пространства внешней памяти memory_space, начиная с адреса address. Компилятор предпочел бы вызвать эту функцию при попытке доступа к любому объекту размером 32 бита, ну, типа long или float.
read_external64
unsigned long long __read_external64(unsigned int address,
unsigned int memorybyspace)
Читает 64 бита из пространства внешней памяти memory_space, начиная с адреса address. Компилятор предпочел бы вызвать эту функцию при попытке доступа к любому объекту размером 64 бита, такому как типа long long или long double.
6.4.3.2. Функции записи
write external |
||
void |
write external(unsigned int address, |
|
unsigned |
int memory_space, |
|
void |
*buffer, |
|
unsigned |
int len) |
Это общая функция записи, которая будет вызвана, если одна из следующих функций потребовалась, но не была определена. Эта функция должна выполнить действия, необходимые для записи len байтов памяти из буфера buffer во внешнюю память, поименованную как memory_space, по адресу address.
write |
external8 |
|
void |
write external8(unsigned int address, |
|
Translated |
||
unsigned |
int memory_space, |
|
unsigned |
char data) |
|
Записывает 8 |
битов data во внешнее пространство памяти memory_space начиная |
с адреса address. Компилятор предпочел бы вызвать эту функцию при попытке записи любого объекта размером 8 битов.
write_external16
void __write_external16(unsigned int address, unsigned int memory_space,
unsigned int data)
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 6-7 |