Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорная техника Сторожок / MPLAB_C30_Руководство пользователя.pdf
Скачиваний:
161
Добавлен:
20.02.2016
Размер:
1.26 Mб
Скачать

16-битовый компилятор Си. Руководство

Пример внешней памяти

6.4.1. Объявление нового пространства памяти

Это очень похоже на объявление нового пространства памяти для доступа через PMP.

16-битовый инструментарий требует информации о всякой внешней памяти. Для того, чтобы компоновщик 16-битового устройства мог правильно распределять память, требуются данные о размере доступной памяти и, необязательно, о ее начале.

В Главе 2. «Отличия

16-битового компилятора

от ANSI» было введено новое

пространство памяти

 

.

external. Этот атрибут служит двум целям: объявление

 

A

 

пространства расширенной памяти и деклараций переменных Си для внешней

памяти (этому посвящен следующий подраздел).

 

Объявляемая расширенная память требует данных о размере. Вы можете дополнительно определить началоWilsonэтой памяти, если ничего не определено, начальным адресом будет считаться 0x0000.

extern int external_memory __attribute__((space(external( ize(1024)))));

Выше определена внешняя память размера 1024 байта. Эта память может однозначно быть идентифицирована данным ей именем external_memory.

6.4.2. Определение переменных во внешнем пространстве

Атрибут пространства external также используется для создания конкретных переменные в пространстве.by Для этого требуется присутствие декларации пространства памяти. Для заданной в предыдущем подразделе декларации может быть сделано следующее объявление переменной:

__external__ int external_array[256] Translatedattribute__((space(external(external_memory))));

external array будет расположен в ранее объявленной памяти external memory.

Заметьте, что, подобно управляющим указателям PSV, мы квалифицировали переменную с новым квалификатором __external__. Будучи примененным к переменной или указателю, он указывает компилятору на необходимость генерировать правильную последовательность для доступа.

Теперь, когда переменная объявлена, она может быть доступна средствами обычного синтаксиса Cи. Компилятор будет генерировать код для доступа к переменной посредством специальных вспомогательных функций, которые должен определить программист. Этому посвящен следующий подраздел.

6.4.3. Определение способа доступа к пространству памяти

Ссылки на переменные, расположенные во внешней памяти, управляются с помощью ряда вспомогательных функций. Вплоть до пяти (5) функций может быть определено для чтения и пяти (5) — для записи. Каждая из них — это обычная функция, которая будет вызвана, если любая из других четырех не определена, но требуется. Если ни одна из функций не определена, компилятор выдает сообщение об ошибке. Короткий пример будет представлен в следующем подразделе. Обычно определение индивидуальных функций позволяет генерировать более эффективный код.

6.4.3.1. Функции чтения read_external

void __read_external(unsigned int address, unsigned int memory_space,

void *buffer, unsigned int len)

DS51284H(ru) стр. 6-6

© 2008 Microchip Technology Inc.

Глава 6. Дополнительные типы указателей Си

Это общая функция чтения, которая будет вызвана, если одна из следующих функций потребовалась, но не была определена. Эта функция должна выполнить необходимые действия для заполнения len байтов памяти в буфере buffer из внешней памяти, именуемой memory_space, начиная с адреса address.

read_external8

unsigned char __read_external8(unsigned int address, unsigned int memory_space)

Читает 8 битов из пространства внешней памяти memory_space, начиная с адреса address. Компилятор предпочел бы вызвать эту функцию при попытке доступа к

любому объекту размером 8 битов.

.

 

read_external16

 

unsigned int __read_external16(unsigned int address,

unsigned int memory_space)

A

unsigned long __read_externaWilson32(unsigned int address,

Читает 16 битов из пространства внешней памяти memory_space, начиная с адреса

address. Компилятор предпочел бы вызвать эту функцию при попытке доступа к любому объекту размером 16 битов.

read_external32

unsigned int memory_space)

Читает 32 бита из пространства внешней памяти memory_space, начиная с адреса address. Компилятор предпочел бы вызвать эту функцию при попытке доступа к любому объекту размером 32 бита, ну, типа long или float.

read_external64

unsigned long long __read_external64(unsigned int address,

unsigned int memorybyspace)

Читает 64 бита из пространства внешней памяти memory_space, начиная с адреса address. Компилятор предпочел бы вызвать эту функцию при попытке доступа к любому объекту размером 64 бита, такому как типа long long или long double.

6.4.3.2. Функции записи

write external

void

write external(unsigned int address,

unsigned

int memory_space,

void

*buffer,

unsigned

int len)

Это общая функция записи, которая будет вызвана, если одна из следующих функций потребовалась, но не была определена. Эта функция должна выполнить действия, необходимые для записи len байтов памяти из буфера buffer во внешнюю память, поименованную как memory_space, по адресу address.

write

external8

void

write external8(unsigned int address,

Translated

unsigned

int memory_space,

unsigned

char data)

Записывает 8

битов data во внешнее пространство памяти memory_space начиная

с адреса address. Компилятор предпочел бы вызвать эту функцию при попытке записи любого объекта размером 8 битов.

write_external16

void __write_external16(unsigned int address, unsigned int memory_space,

unsigned int data)

© 2008 Microchip Technology Inc.

DS51284H(ru) стр. 6-7

Соседние файлы в папке Микропроцессорная техника Сторожок