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

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.

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