
- •Глава 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®
|
|
Глава 7. Файлы поддержки устройства |
||
|
|
|
|
|
7.1. |
Введение |
|
||
|
|
В этой главе обсуждаются файлы поддержки устройства, применяемые при |
||
|
|
компиляции с использованием компилятора MPLAB Си для PIC24 и dsPIC® (бывший |
||
|
|
C30) |
. |
|
7.2. |
Основные вопросы |
|||
A |
||||
|
|
Вопросы, обсуждаемые в этой главе: |
||
|
|
|
||
|
|
• Файлы заголовков процессора |
|
|
|
|
• Файлы определения регистров |
|
|
|
|
• Использование SFR |
|
|
|
|
• Использование макросов |
|
|
|
|
• Адресация EEDATA из Си - только для dsPIC30F |
||
7.3. |
Файлы заголовков процессораWilson |
|
||
|
|
Файлы заголовков процессора — распространенные языковые инструментальные |
||
|
|
средства. Эти файлы определяют доступные регистры специального назначения |
||
|
|
(SFR) для каждого устройства dsPIC DSC. Для того, чтобы использовать файл |
||
|
|
заголовка в Cи достаточно:by |
|
|
|
|
#include <p30fxxxx.h> |
|
|
|
|
Translated |
|
где xxxx соответствует обозначению микросхемы устройства. Файлы заголовков Cи находятся в каталоге support\h.
Включение файла заголовка необходимо для того, чтобы использовать имена SFR (например, CORCONbits).
Например, следующий модуль, скомпилированный для микросхемы dsPIC30F2010, включает две функции: одну для включения окна PSV и другую для выключения окна PSV.
#include <p30f2010.h> void
EnablePSV(void)
{
CORCONbits.PSV = 1;
}
void DisablePSV(void)
{
CORCONbits.PSV = 0;
}
Соглашение о файлах заголовка процессора таково, что каждый SFR имеет то же имя, которое используется в документации на микросхему, например, CORCON для регистра управления ядром. Если регистр имеет отдельные биты, представляющие интерес, тогда там также будет структура, определенная для этого SFR, и ее имя будет аналогично имени SFR, с добавлением «bits». Например, CORCONbits для регистра управления ядром. Отдельные биты (или битовые поля), названы в
|
|
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 7-1 |

16-битовый компилятор Си. Руководство
структуре теми же именами, что и биты в документации, например PSV для бита PSV регистра CORCON. Вот полное определение CORCON (возможны изменения):
/* CORCON: CPU Mode control Register */
|
|
extern volatile unsigned int CORCON __attribute__((__near__)); |
||||
|
|
typedef struct tagCORCONBITS { |
|
|
||
|
|
unsigned IF |
:1; /* целый/дробный режим */ |
|||
|
|
unsigned RND |
:1; /* режим округления */ |
|||
|
|
unsigned PSV |
:1; /* разрешение PSV */ |
|||
|
|
unsigned IPL3 |
:1; |
|
A |
. |
|
|
|
|
|||
|
|
unsigned ACCSAT |
|
|
|
|
|
|
:1; /* режим насыщения аккумулятора */ |
||||
|
|
unsigned SATDW |
:1; /* разреш.насыщ.записи в простр-ве данных */ |
|||
|
|
unsigned SATB |
:1; /* разрешить насыщен. аккум. B */ |
|||
|
|
unsigned SATA |
|
Wilson |
|
|
|
|
:1; /* разрешить насыщен. аккум. A */ |
||||
|
|
unsigned DL |
:3; /* статус уровня вложенности цикла DO */ |
|||
|
|
unsigned |
:4; |
|
|
|
|
|
} CORCONBITS; |
|
|
|
|
|
|
extern volatile CORCONBITS CORCONbits __attribute__((__near__)); |
||||
|
|
|
||||
|
|
Примечание Символы CORCON и CORCONbits ссылаются на один и тот же |
||||
|
|
регистр и преобразуются в тот же адрес во время компоновки. |
||||
|
|
|
|
|
|
|
7.4. |
|
|
by |
|
|
|
Файлы определения регистров |
|
|
Файлы заголовков процессора описанные в п. 7.3. «Файлы заголовков процессора» именуют все SFR для каждой микросхемы, но не определяют адреса SFR.
адреса SFR. Для того, чтобы использовать один из этих файлов, служит опция командной строки компоновщика:
ОтдельныйTranslatedнабор файлов сценария компоновки, по одному на микросхему, расположен в каталоге support\gld. Эти файлы сценария компоновки определяют
-T p30fxxxx.gld
где xxxx соответствует обозначению микросхемы устройства.
Например, предположим, что существует файл называемый app2010.c, который содержит приложение для dsPIC30F2010, тогда оно может быть компилировано и скомпоновано следующей командной строкой:
pic30-gcc -o app2010.o -T p30f2010.gld app2010.c
Опция командной строки -o присваивает имя выходному исполняемому COFF файлу, а опция -T конкретизирует имя микросхемы dsPIC30F2010. Если p30f2010.gld не будет обнаружен в текущем каталоге, компоновщик ищет его в известных ему библиотечных путях. Для установки по умолчанию сценарии компоновки включены в путь PIC30_LIBRARAY_PATH. Подробнее см. п. 3.6. «Переменные окружения».
7.5.Использование SFR
При использовании SFR в приложении следует выполнить три шага.
1.Включите файл заголовка процессора для используемого устройства. Это обеспечит исходный код данными о регистрах специального назначения, которые доступны в этом устройстве. Например, следующий оператор включает файл заголовка для микросхемы dsPIC30F6014:
#include <p30f6014.h>
DS51284H(ru) стр. 7-2 |
© 2008 Microchip Technology Inc. |

Глава 7. Файлы поддержки устройства
2.Работайте с SFR как с любыми другими переменными в Cи. SFR можно читать и писать в исходном код.
Например, следующий оператор сбрасывает в 0 все биты SFR первого таймера.
TMR1 = 0;
Следующий оператор представляет 15-й бит регистра T1CON, который является битом включения таймера. Он устанавливает бит с именем TON в 1, этим запуская таймер.
T1CONbits.TON = 1;
|
|
. |
3. Компонуйте с файлом определений регистров или сценарием компоновщика |
||
|
для используемого устройства. Компоновщик обеспечит адреса для SFR. |
|
|
|
A |
|
(Помните, что битовая структура будет иметь тот же адрес, что и SFR во время |
|
|
компоновки.) Допустим, пример 7-1. мог бы использовать: |
|
|
p30f6014.gld |
Wilson |
/* |
|
См. «MPLAB® Assembler, Linker and Utilities for PIC24 MCUs and dsPIC® DSCs User’s Guide» (DS51317) для подробностей об использовании сценариев компоновщика.
Следующий пример является часами реального времени. Он использует несколько SFR. Описания для них находятся в файле p30f6014.h. Этот файл должен быть скомпонован с использованием специфического сценария компоновки, находящегося в файле p30f6014.g d.
ПРИМЕР 7-1. ЧАСЫ РЕАЛЬНОГО ВРЕМЕНИ
** |
by |
Пример часов реального времени для dsPIC |
|
** |
|
** используется 1-й таймер тактируемый от TCY ** и прерывание по истечению периода
*/Translated
#include <p30f6014.h>
/* Период Tim r1 для 1 ms при FOSC = 20 MHz */ #define TMR1 PERIOD 0x1388
struct clockType |
|
|
{ |
|
|
unsigned int timer; |
/* обратный счетчик, миллисекунды */ |
|
unsigned int ticks; |
/* абсолютное время, миллисекунды */ |
|
unsigned int seconds; /* абсолютное время, секунды */ |
||
} volatile RTclock; |
|
|
void reset clock(void) |
|
|
{ |
|
|
RTclock.timer = |
0; |
/* очистка программных регистров */ |
RTclock.ticks = |
0; |
|
RTclock.seconds |
= 0; |
|
TMR1 = 0; |
|
/* очистка 1-го таймера */ |
PR1 = TMR1_PERIOD; |
/* установка 1-го регистра периода */ |
|
T1CONbits.TCS = |
0; |
/* установка внутреннего тактирования */ |
IPC0bits.T1IP = |
4; |
/* установка приоритета */ |
IFS0bits.T1IF = |
0; |
/* очистка флага прерывания */ |
IEC0bits.T1IE = |
1; |
/* разрешение прерывания */ |
SRbits.IPL = 3; |
|
/* разрешение прерываний с уровнем 4-7*/ |
T1CONbits.TON = |
1; |
/* пуск таймера */ |
} |
|
|
void __attribute__((__interrupt__)) _T1Interrupt(void) { static int sticks=0;
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 7-3 |