- •Глава 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. Битовые поля
Глава 8. Прерывания
ТАБЛИЦА 8-4. (ПРОД-Е) ВЕКТОРА ПРЕРЫВАНИЙ dsPIC33F/PIC24F
|
|
Номер |
Основной |
Альтернативный |
|
|
Описание |
|
|
|
|
|
|
|
|
|
|
|
|
109 |
_Interrupt109 |
_AltInterrupt109 |
|
|
Зарезервирован |
|
|
|
110 |
_Interrupt110 |
_AltInterrupt110 |
|
|
Зарезервирован |
|
|
|
|
|
|
|
|
|
|
|
|
111 |
_Interrupt111 |
_AltInterrupt111 |
|
|
Зарезервирован |
|
|
|
|
|
|
|
|
|
|
|
|
112 |
_Interrupt112 |
_AltInterrupt112 |
|
|
Зарезервирован |
|
|
|
|
|
|
|
|
|
|
|
|
113 |
_Interrupt113 |
_AltInterrupt113 |
|
|
Зарезервирован |
|
|
|
|
|
|
|
|
|
|
|
|
114 |
_Interrupt114 |
_AltInterrupt114 |
|
|
Зарезервирован |
|
|
|
|
|
|
|
|
|
|
|
|
115 |
_Interrupt115 |
_AltInterrupt115 |
|
|
Зарезервирован |
|
|
|
|
|
|
|
|
|
|
|
|
116 |
_Interrupt116 |
_AltInterrupt116 |
|
. |
Зарезервирован |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
117 |
_Interrupt117 |
_AltInterrupt117 |
A |
|
Зарезервирован |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
8.5. |
Сохранение контекста в ISR |
|
|
|
|
|||
|
Прерывания, в силу своей природы, могут произойти в непредсказуемый момент. |
|||||||
|
Поэтому прерванный код должен иметь возможность продолжиться с того же |
|||||||
|
самого состояния машины, которое было, когда произошло прерывание. |
|||||||
|
Чтобы правильно обработать возврат из прерывания, код подготовки (пролога) ISR |
|||||||
|
автоматически сохраняет управляемые компилятором |
рабочие и специальные |
||||||
|
регистры в стеке, для последующего восстановления по окончанию ISR. Вы можете |
|||||||
|
использовать необязательный параметр save атрибута interrupt, чтобы |
|||||||
|
определить дополнительные переменные и SFR для сохранения и восстановления. |
|||||||
|
В отдельных приложениях |
можетWilsonбыть необходимо |
включение операторов |
|||||
|
|
|
by |
|
|
|
|
|
ассемблера в программу обслуживания прерывания непосредственно перед прологом функции, генерируемым компилятором. Например, может потребоваться, чтобы семафор увеличивался немедленно при входе в ISR. Это можно сделать следующим образом:
•ОбслуживаниеTranslatedпрерывания процессором — Время, необходимое процессору, чтобы распознать прерывание и перейти на первый адрес вектора прерывания. Чтобы определить эту величину, см. в документации на процессор сведения по используемому процессору и источнику прерывания.
•Код ISR — Компилятор сохраняет регистры, которые он используется в ISR. Сюда включаются рабочие регистры и специальный регистр RCOUNT. Больше того, если ISR вызывает обычную функцию, то компилятор сохранит все рабочие регистры и RCOUNT, даже если они все не используются явно самой ISR. Это должно быть сделано, поскольку компилятор в общем случае не может знать, какие ресурсы используются вызываемой функцией.
8.7.Вложенные прерывания вашейвременем
16-битовые устройства поддерживают вложенные прерывания. Поскольку ресурсы процессора ISR сохраняет в стеке, вложенные ISR кодируются точно таким же способом, как невложенные. Вложенные прерывания разрешаются очисткой бита NSTDIS (nested interrupt disable) в регистре INTCON1. Заметьте, что это условие по умолчанию, т.е. 16-битовое устройство выходит из сброса с разрешением
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 8-13 |
16-битовый компилятор Си. Руководство
вложенных прерываний. Каждому источнику прерываний назначается приоритет в регистре управления приоритетом прерываний (IPCn). Если есть необслуженный запрос прерывания (IRQ) с уровнем приоритета равным или большим, чем текущий уровень приоритета процессора (поле IPL в регистре ST и бит IPL3 в регистре CORCON), прерывание будет передано в процессор.
8.8.Разрешение/запрещение прерываний
Каждый источник прерывания может быть индивидуально разрешен или запрещен. По одному биту разрешения прерывания для каждого IRQ располагаются в регистрах управления разрешением прерываний (IECn). Установка бита
разрешения прерывания в единицу (1) разрешает соответствующее прерывание, |
|
A |
.(0) запрещает соответствующее |
очистка бита разрешения прерывания в нуль |
прерывание. После сброса все биты разрешения прерываний сбрасываются в нуль. Вдобавок, процессор имеет команду запрета прерываний (DISI), которая может запретить все прерывания на заданное количество командных циклов.
Примечание Исключения, как например, ошибка адресации, не могут быть запрещены. Запрещать можно только аппаратные прерывания.
Команда DISI может быть использована в программе на Cи с помощью inline ассемблера. Например, оператор:
__asm__ volatile ("disi #16"); |
|
вставит указанную инструкцию DISI в место своего появления в исходной |
|
Wilson |
в том, что программист не |
программе. Недостаток такого использования DISI |
всегда может знать, как компиляторby Cи переведет исходный код Cи в машинные команды, что затрудняет определение величины счетчика циклов для команды DISI. Возможно обойти эту проблему, заключая код, который должен быть защищен от прерываний, между двумя командами DISI, первая из которых устанавливает счетчик циклов на максимальную величину, а вторая сбрасывает счетчик циклов в нуль. Например:
DISICNTTranslated= 0x0000; /* разрешение прерываний */
__asm |
volatil ("disi |
#0x3FFF"); /* запрет прерываний */ |
/*... защищенный код Cи... */ |
||
__asm |
vol tile("disi |
#0x0000"); /* разрешение прерываний */ |
Альтернативный метод представляет собой непосредственную запись в регистр DISICNT для разрешения прерываний. Регистр DISICNT может модифицироваться только после того, как была выполнена команда DISI и его содержимое не является нулем.
__asm |
volatile("disi #0x3FFF"); /* запрет прерываний */ |
/*... |
защищенный код Cи... */ |
В некоторых приложениях может потребоваться запрет прерываний также и с приоритетом 7-го уровня. Они могут быть запрещены только через модификацию бита IPL3 регистра CORCON. Предоставляемые файлы поддержки содержат несколько полезных макросов препроцессора, облегчающих модификацию величины IPL (только в регистре ST). Это:
SET_CPU_IPL(ipl)
SET_AND_SAVE_CPU_IPL(save_to, ipl)
RESTORE_CPU_IPL(saved_to)
Например, вы хотите защитить часть кода от прерывания. Следующий код изменит текущие установки IPL и затем восстановит в IPL его первоначальную величину.
DS51284H(ru) стр. 8-14 |
© 2008 Microchip Technology Inc. |