- •Глава 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®
Приложение D. Компиляторы Си PIC18 и PIC24/dsPIC
D.1.
D.2.
Введение
Цель этой главы в том, чтобы подчеркнуть различия между компилятором MPLAB Cи |
||
для PIC18 (бывший MPLAB C18) и компилятором MPLAB Cи для PIC24 и dsPIC® |
||
|
|
. |
(бывший MPLAB C30). За дополнительной информацией о компиляторе для PIC18 |
||
обращайтесь к «MPLAB® C18 C Compiler User’s Guide» (DS51288). |
||
Основные вопросы |
Wilson |
A |
В данной главе обсуждаются следующие области различий между двумя |
||
компиляторами: |
|
|
• Форматы данных |
|
|
• Указатели |
|
|
• Классы памяти |
|
|
• Использование стека |
|
|
• Квалификаторы памяти |
|
|
• Предопределенные имена макро |
|
|
• Приведение целых |
by |
|
|
|
|
• Строковые константы |
|
|
• Банк доступа |
|
|
• Inline ассемблер |
|
|
Translated |
|
|
• Прагмы
• Модели памяти
• Соглашения о вызове
• Код запуска
• Управляемые компилятором ресурсы
• Оптимизация
• Формат объектных модулей
• Определяемое реализацией поведение
• Битовые поля
|
|
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. D-1 |
16-битовый компилятор Си. Руководство
D.3.
D.4.
D.5.
Форматы данных
ТАБЛИЦА D-1. КОЛИЧЕСТВО БИТОВ В ФОРМАТАХ ДАННЫХ
Формат данных |
Компилятор MPLAB® Си для |
||
|
микроконтр. PIC18(1) |
16-битовых устройств(2) |
|
|
|
|
|
char |
8 |
|
8 |
int |
16 |
|
16 |
|
|
|
|
short long |
24 |
|
— |
|
|
|
|
long |
32 |
. |
32 |
|
|||
|
|
|
|
long long |
— |
A |
32 |
|
|||
|
|
|
|
float |
32 |
|
32 |
|
|
|
|
double |
32 |
|
32 или 64(3) |
Примечания 1: Компилятор для PIC18 использует собственный формат данных, подобный формату IEEE-754, но с циклическим сдвигом старших 9 битов (см. таблицу D-2)
2: Компилятор для 16-битовых устройств использует формат IEEE-754 3: См. п. 5.5. «С плавающей точкой»
ТАБЛИЦА D-2. СРАВНЕНИЕ ФОРМАТОВ С ПЛАВАЮЩЕЙ ТОЧКОЙ И IEEE-754
|
|
Стандарт |
|
|
Байт 3 |
Байт 2 |
|
Байт 1 |
|
Байт 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Компилятор для PIC18 |
|
|
eeee eeee0 |
sddd dddd16 |
|
dddd dddd8 |
|
dddd dddd0 |
|
|
|
|
|
Wilson |
|
|
|
|
|
|
|
Компилятор для 16-бит. устройств |
|
seee eeee1 |
e0ddd dddd16 |
|
dddd dddd8 |
|
dddd dddd0 |
|
|
|
Условные обозначения: s = знаковый бит, d = мантисса, e = порядок |
|
|||||||
Указатели |
by |
|
|
|
|
|
|
|
||
ТАБЛИЦА D-3. КОЛИЧЕСТВО БИТОВ В УКАЗАТЕЛЯХ |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
||
|
|
Тип памяти |
|
|
|
Компилятор MPLAB® Си для |
|
|||
|
|
|
|
|
микроконтр. PIC18 |
|
16-битовых устройств |
|||
|
|
|
|
|
|
|
|
|
||
|
Память программ, ближний |
|
|
|
16 |
|
16 |
|
||
|
Память программ, дальний |
|
|
|
24 |
|
16 |
|
||
|
|
|
|
|
|
|
|
|
||
|
Память данных |
|
|
|
16 |
|
16 |
|
||
|
|
Translated |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Классы памяти
Компилятор для PIC18 позволяет использовать не совместимые с ANSI спецификаторы классов памяти overlay для переменных и auto или static для аргументов функций.
Компилятор для 16-битовых устройств не допускает эти спецификаторы.
DS51284H(ru) стр. D-2 |
© 2008 Microchip Technology Inc. |
Приложение D Компиляторы Си PIC18 и PIC24/dsPIC
D.6. Использование стека
D.7.
D.8.
D.9.
D.10.
ТАБЛИЦА D-4. ИСПОЛЬЗУЕМЫЙ ТИП СТЕКА
Содержание стека |
Компилятор MPLAB® Си для |
|
|
микроконтр. PIC18 |
16-битовых устройств |
|
|
|
Адреса возврата |
аппаратный |
программный |
Локальные переменные |
программный |
программный |
|
|
|
Квалификаторы памяти
Компилятор для PIC18 использует несовместимые с ANSI квалификаторы far, |
|||
near, rom и ram. |
A |
. |
|
|
|||
|
|
|
|
Компилятор для 16-битовых устройств использует несовместимые с ANSI атрибуты |
|||
far, near и space. |
|
|
|
ПРИМЕР D-1. ОПРЕДЕЛЕНИЕ БЛИЖНЕЙ ПЕРЕМЕННОЙ |
|||
|
|
|
|
PIC18 |
near int gVariable; |
|
|
|
|
||
16 бит |
__attribute__((near)) int gVariable; |
||
|
|
||
ПРИМЕР D-2. ОПРЕДЕЛЕНИЕ ДАЛЬНЕЙ ПЕРЕМЕННОЙ |
|||
|
|
|
|
PIC18 |
far int gVariable; |
|
|
|
|
|
|
16 бит |
__attribute__((far)) int gVariable; |
|
|
|
|
Wilson |
|
ПРИМЕР D-3. СОЗДАНИЕ ПЕРЕМЕННОЙ В ПАМЯТИ ПРОГРАММ |
|||
|
|
|
|
PIC18 |
rom int gArray[6] = {0,1,2,3,4,5}; |
|
|
|
|
||
16 бит |
__attribute__((space(psv))) cons int gArray[6] = {0,1,2,3,4,5}; |
||
|
by |
|
|
ПредопределенныеTranslatedимена макро
В компиляторе для PIC18 определены __18CXX, __18F242, ... (все остальные процессоры с префиксом __ ), а также __SMALL__ и __LARGE__, зависящие от выбранной модели памяти.
В компиляторе для 16-битовых устройств определено __dsPIC30.
Приведение целых
Компилятор для PIC18 реализует приведение целых к размеру наибольшего целого операнда, даже если оба операнда меньше, чем int. Для обеспечения действий в соответствии со стандартом используется опция –Oi+.
Компилятор для 16-битовых устройств реализует приведение целых к точности int или большей в соответствии с требованиями ISO.
Строковые константы
Компилятор для PIC18 сохраняет строковые константы в памяти программ в секции
.stringtable. Этот компилятор поддерживает отдельные варианты строковых функций. Например, функция strcpy имеет 4 варианта, позволяющих копировать строки в или из памяти данных и программ.
Компилятор для 16-битовых устройств организует доступ к строковым константам в памяти данных или в памяти программ через окно PSV, делая их доступными наряду с другими данными.
D.11. Банк доступа
16-битовые устройства не имеют банка доступа к памяти.
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. D-3 |
16-битовый компилятор Си. Руководство
D.12. Inline ассемблер
Компилятор для PIC18 использует несовместимый с ANSI операторы _asm и _endasm для идентификации блока inline ассемблера.
Компилятор для 16-битовых устройств использует несовместимый с ANSI оператор asm, который больше похож на вызов функции. Подробнее об использовании оператора asm см. п. 9.4. «Использование ассемблера inline»
D.13. Прагмы
Компилятор для PIC18 использует прагмы для секций (code, romdata, udata,
idata), прерываний (высокого или низкого приоритета) и размещения переменных |
|||
(банк и секция). |
|
. |
|
Компилятор для 16-битовых устройств использует несовместимые с ANSI атрибуты |
|||
вместо прагм. |
|
A |
|
|
|
|
|
ТАБЛИЦА D-5. ПРАГМЫ И АТРИБУТЫ |
|
|
|
|
|
|
|
Прагмы (компилятор для PIC18) |
Атрибуты (компилятор для 16-битовых |
||
|
устройств) |
||
|
|
|
|
|
|
|
|
#pragma udata [name] |
|
attribute__ |
((section (“name”))) |
|
|
|
|
#pragma idata [name] |
|
attribute__ |
((section (“name”))) |
|
|
|
|
#pragma romdata [name] |
|
attribute__ |
((space (prog))) |
|
|
|
|
#pragma code [name] |
|
attribute__ |
((section (“name”))), |
|
Wilsonattribute__ |
((space (prog))) |
|
#pragma interruptlow |
|
__attribute__ |
((intrrupt)) |
|
|
|
|
#pragma interrupt |
|
__attribute__ |
((interrupt, shadow)) |
|
|
|
|
#pragma varlocate bank |
|
нет(1) |
|
by |
|
|
|
#pragma varlocate name |
|
нет(1) |
|
Примечание 1: 16-битовые устройства не имеют разделения памяти по банкам.
ПРИМЕР D-4. ОПРЕДЕЛЕНИЕ НЕИНИЦИАЛИЗИРУЕМОЙ ПЕРЕМЕННОЙ В СЕКЦИИ ПОЛЬЗОВАТЕЛЯ ПАМЯТИ ДАННЫХ
PIC18 |
#pr gma udata mybss |
|
int gi; |
|
|
16 бит |
int attribute__((__section__(“.mybss”))) gi; |
|
|
ПРИМЕР D-5. РАЗМЕЩЕНИЕ ПЕРЕМЕННОЙ MABONGA ПО АДРЕСУ 0X100 ПАМЯТИ ДАННЫХ
PIC18 |
#pragma idata myDataSection=0x100; |
|
|
int |
Mabonga = 1; |
|
|
|
16 бит |
int |
attribute__((address(0x100))) Mabonga = 1; |
Translated |
||
ПРИМЕР D-6. ОПРЕДЕЛЕНИЕ ПЕРЕМЕННОЙ В ПАМЯТИ ПРОГРАММ |
||
|
|
|
PIC18 |
#pragma romdata const_table |
|
|
const |
rom char my_const_array[10] = |
|
{0,1,2,3,4,5,6,7,8,9}; |
|
|
|
|
16 бит |
const |
__attribute__((space(auto_psv))) |
|
char my_const_array[10] = {0,1,2,3,4,5,6,7,8,9}; |
|
|
|
|
DS51284H(ru) стр. D-4 |
© 2008 Microchip Technology Inc. |