- •Глава 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. Битовые поля
Приложение D Компиляторы Си PIC18 и PIC24/dsPIC
Примечание Компилятор для 16-битовых устройств не поддерживает непосредственный доступ к переменным в программной памяти. Доступ к размещенным таким образом переменным должен быть явно организован программистом, обычно с использованием inline ассемблерных команд работы с таблицами или с помощью окна видимости пространства программ. См. п. 4.14. «Использование видимости программного пространства (PSV)»»
ПРИМЕР D-7. РАЗМЕЩЕНИЕ ФУНКЦИИ PRINTSTRING ПО АДРЕСУ
|
|
0X8000 ПАМЯТИ ПРОГРАММ |
. |
|
|||
|
PIC18 |
#pragma code myText_section=0x8000; |
|
||||
|
|
int PrintString(consr char *s) |
A |
|
|
||
|
|
|
|
|
|||
|
|
{...}; |
|
|
|
|
|
|
|
|
|
||||
|
16 бит |
int __attribute__((address(0x8000))) PrintString (consr char *s) |
|
||||
|
|
{...}; |
|
Wilson |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
ПРИМЕР D-8. КОМПИЛЯТОР АВТОМАТИЧЕСКИ СОХРАНЯЕТ И |
|
||||||
|
|
ВОССТАНАВЛИВАЕТ ПЕРЕМЕННЫЕ VAR1 И VAR2 |
|
||||
|
|
|
|||||
|
PIC18 |
#pragma interrupt isr0 save=var1, var2 |
|
||||
|
|
void isr0(void) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
/* реализация функции обработки прерывания */ |
|
||||
|
|
} |
|
|
|
|
|
|
|
|
|
||||
|
16 бит |
void __attribute__((__interrupt__(__save__(var1,var2)))) |
|
||||
|
|
isr0(void) |
by |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
/* реализация функции обработки прерывания */ |
|
||||
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Translated |
|
|
|
|
|
|
D.14. Модели памяти |
|
|
|
|
|
Компилятор для PIC18 использует несовместимые с ANSI малую и большую модели памяти. В малой применяются указатели длиной 16 битов и размеры памяти программ ограничены 64К байт (32К слов).
Компилятор для 16-битовых устройств использует несовместимую с ANSI малую и большую модели кода. Малая модель кода ограничивает объем памяти программ 96К байтами (32К слов). В большой модели кода указатели могут работать через таблицу переходов.
D.15. Соглашения о вызове
Существует большое количество отличий в соглашения по вызову между двумя обсуждаемыми компиляторами, пожалуйста обратитесь к п. 4.11. «Соглашения по вызову функций» за информацией на эту тему.
D.16. Код запуска
Компилятор для PIC18 предоставляет три варианта стартовых программ — один без инициализации данных, второй с инициализацией только тех переменных, которые этого требуют, и последний с инициализацией всех переменных (переменные, в определении которых нет инициализации, инициализируются 0, как того требует стандарт ANSI).
Компилятор для 16-битовых устройств предоставляет два варианта старта — один без инициализации, а второй с инициализацией всех переменных (переменные, в определении которых нет инициализации, инициализируются 0, как того требует стандарт ANSI), за исключением секции «устойчивых» данных.
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. D-5 |
16-битовый компилятор Си. Руководство
D.17. Управляемые компилятором ресурсы
Компилятор для PIC18 управляет следующими ресурсами: PC, WREG, STATUS, PROD, секцию .tmpdata, секцию .MATH_DATA, FSR0, FSR1, FSR2, TBLPTR, TABLAT.
Компилятор для 16-битовых устройств управляет следующими ресурсами: W0-W15, RCOUNT, SR.
D.18. Оптимизация
Следующие способы оптимизации являются частью каждого из компиляторов
ТАБЛИЦА D-6. СПОСОБЫ ОПТИМИЗАЦИИ |
|
. |
|
|
|
|
|
|
|
Компилятор MPL B® |
Си для |
|||
|
|
A |
|
|
микроконтр. PIC18 |
|
|
16-битовых устройств |
|
|
|
|
||
Ветвление (–Ob+) |
Установки оптимизации (–On, где n это 1, 2, 3 или |
|||
Линеаризация кода (–Os+) |
)(1) |
|
|
|
Слияние окончаний (–Ot+) |
|
|
|
|
Удаление недостижимого кода (–Ou+) |
|
|
|
|
Распространение кода (–Op+) |
|
|
|
|
Изъятие избыточной памяти (–Or+) |
|
|
|
|
Удаление мертвого кода (–Od+) |
|
|
|
|
|
|
|
||
Слияние дубликатов строк (–Om+) |
–fwritable-strings |
|||
|
|
|
||
Управление банками (–On+) |
Отсутствует, т.к. нет разделения памяти на банки |
|||
|
|
|
||
Отслеживание содержимого WREG |
Содержимое всех регистров отслеживается |
|||
(–Ow+) |
Wilson |
|
|
|
автоматически |
||||
Процедурная абстракция (–Opa+) |
Процедурная абстракция (–mpa) |
Примечание 1. Данные установкиby оптимизации удовлетворяют многие потребности. Для «тонкой настройки» могут использоваться дополнительные флаги.
Подробности см. в п. 3.5.6. «Опции для управления оптимизацией»
D.19. ФорматTranslatedобъектных модулей
MPLAB Си компиляторы для PIC18 и для 16-битовых устройств используют разные форматы COFF файла, которые несовместимы между собой.
D.20. Определяемое реализацией поведение
При сдвиге вправо отрицательных целых:
• компилятор для PIC18 не расширяет знаковый бит
• компилятор для 16-битовых устройств расширяет знаковый бит
D.21. Битовые поля
Битовые поля в компиляторе для PIC18 не должны пересекать границу байта, и, таким образом, не могут быть больше 8 битов размером.
Компилятор для 16-битовых устройств поддерживает битовые поля произвольного размера вплоть до размера лежащего в основе типа. В битовом поле может быть использован любой интегральный тип. Размещение не может пересекать естественную границе лежащего в основе типа.
Например:
struct foo {
long long i:40;
int j:16;
char k:8;
} x;
DS51284H(ru) стр. D-6 |
© 2008 Microchip Technology Inc. |
Приложение D Компиляторы Си PIC18 и PIC24/dsPIC
struct bar {
long long I:40;
char J:8;
int K:16;
} y;
Структура foo будет иметь размер 10 байтов при использовании компилятора для 16-битовых устройств. i будет располагаться начиная с бита со смещением 0 и до 39. Далее будет пропущено 8 бит перед j, которое будет располагаться начиная с
расположено после j с битовым смещением 64. Структура будет содержать 8
бита номер 48. Если бы j располагалось сразу в следующем доступном бите со смещением 40, оно бы пересекало границу памяти. для 16-битового целого. k будет
битовый пропуск в конце, чтобы удовлетворять требованиям выравнивания в случае |
|
массива. Выравнивание составляет 2 байта,A |
поскольку максимальное |
Wilson |
|
выравнивание в структуре именно 2 байта. |
|
Структура bar будет иметь размер 8 байтов при использовании компилятора для 16битовых устройств. I будет располагаться начиная с бита со смещением 0 и до 39. Пропуск перед J в данном случае не нужен, поскольку char J, расположенное со смещения 40 битов, не будет пересекать границу памяти. K может располагаться начиная с битового смещения 48, завершая структуру без каких-либо пропусков.
by Translated
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. D-7 |
16-битовый компилятор Си. Руководство
Для заметок.
A . Wilson by Translated
DS51284H(ru) стр. D-8 |
© 2008 Microchip Technology Inc. |