- •Глава 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-битовый компилятор Си. Руководство
Записывает 16 битов data во внешнее пространство памяти memory_space начиная с адреса address. Компилятор предпочел бы вызвать эту функцию при попытке записи любого объекта размером 16 битов.
write_external32
void __write_external32(unsigned int address, unsigned int memory_space,
unsigned long data)
Записывает 32 бита data во внешнее пространство памяти memory_space начиная с адреса address. Компилятор предпочел бы вызвать эту функцию при попытке записи любого объекта размером 32 бита, такого как типа long или float.
write_external64 |
. |
|
|
void __write_external64(unsigned int address, |
|
unsigned int memory_space, |
A |
unsigned long long data) |
|
Wilson |
|
Записывает 64 бита data во внешнее пространство памяти memory_space начиная
с адреса address. Компилятор предпочел бы вызвать эту функцию при попытке
записи любого объекта размером 64 бита, такого как типа long long или long double.
6.4.4. Пример внешней памяти
Следующие фрагменты примера взяты из рабочего примера (в папке Examples.)
Этот пример реализует адресуемую битовую память с использованием внешней
карту доступа с использованием соответствующих функций чтения и записи для одного из 64 байтов локальной памяти данных.
памяти. В этом случае каждый бит хранится в реальной памяти данных, а не за пределами кристалла. Кодbyбудет определять «внешнюю» память из 512 ячеек и
Сначала определяется внешняя память:
__attribute ((space(external(size(512)))));
Затем определяются соответствующие функции чтения и записи. Эти функции используют массив памяти, который зарезервирован обычным способом.
static unsigned char real_bit_memory[64];
unsigned char read_external8(unsigned int address, unsigned int memory_space) {
Translatedextern unsigned int bit_memory
if (memory space == bit_memory) {
/* адрес внутри нашей битовой памяти */ u signed int byte_offset, bit_offset; byte offset = address / 8;
bit offset = address % 8;
eturn (real_bit_memory[byte_offset] >> bit_offset) & 0x1; } else {
fprintf(stderr,"Не знаю, как работать с памятью: %d\n", memory_space);
}
return 0;
}
void __write_external8(unsigned int address, unsigned int memory_space, unsigned char data) {
if (memory_space == bit_memory) {
/* адрес внутри нашей битовой памяти */ unsigned int byte_offset, bit_offset; byte_offset = address / 8;
bit_offset = address % 8;
DS51284H(ru) стр. 6-8 |
© 2008 Microchip Technology Inc. |
Глава 6. Дополнительные типы указателей Си
real_bit_memory[byte_offset] &= (~(1 << bit_offset)); if (data & 0x1) real_bit_memory[byte_offset] |=
(1 << bit_offset); } else {
fprintf(stderr,"Не знаю, как работать с памятью: %d\n",
memory_space); |
|
|
} |
|
|
} |
|
|
Эти функции работают одинаково: |
. |
|
• если доступ к bit_memory, тогда |
||
|
||
A |
|
|
- определить правильные смещения байта и бита |
|
|
- прочитать или записать в соответствующее место в real_bit_memory |
||
Wilson |
|
• иначе это доступ в другую память (куда неизвестно как производить доступ)
Поскольку две основные части пазла на месте, создадим переменные и доступ к ним:
__external__ unsigned char bit [NUMBER_OF_BITS] __attribute__((space(external(bit_memory))));
// внутри main
__external__ unsigned char *bit; bit = bits;
for (i = 0; i < 512; i++) {
|
by |
|
printf("%d ",*bit++); |
} |
|
За исключением CV квалификаторов __external__, для определения и доступа к переменным во внешнем пространстве памяти могут быть использованы обычные
операторы Си. Translated
© 2008 Microchip Technology Inc. |
DS51284H(ru) стр. 6-9 |
16-битовый компилятор Си. Руководство
Для заметок.
A . Wilson by Translated
DS51284H(ru) стр. 6-10 |
© 2008 Microchip Technology Inc. |