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

Глава 7. Файлы поддержки устройства

#define _XBSS(N) __attribute__((space(xmemory), aligned(N))) #define _XDATA(N) __attribute__((space(xmemory), aligned(N))) #define _YBSS(N) __attribute__((space(ymemory), aligned(N))) #define _YDATA(N) __attribute__((space(ymemory), aligned(N))) #define _EEDATA(N) __attribute__((space(eedata), aligned(N)))

Например, чтобы объявить неинициализируемый массив в память X с выравниванием на 32-байтовый адрес:

 

 

int _XBSS(32) xbuf[16];

 

.

 

 

 

 

 

 

 

 

 

Чтобы объявить инициализируемый массив в EEPROM данных без специального

 

 

выравнивания:

 

 

 

 

 

int _EEDATA(2) table1[] = {0, 1, 1, 2, 3, 5, 8, 13, 21};

 

 

Следующие макросы не требуют аргументов. ОниA

могут быть использованы, чтобы

 

 

 

 

Wilson

 

 

 

 

располагать переменную в «устойчивой» или в ближней памяти данных.

 

 

#define _PERSISTENT __attribute ((persistent))

 

 

#define _NEAR __attribute ((near))

 

 

 

 

Например, чтобы объявить две переменные, которые сохраняют свои величины при

 

 

сбросе устройства:

 

 

 

 

 

int _PERSISTENT var1,var2;

 

 

 

 

7.6.4. Макросы объявления ISR

 

 

 

 

Следующие макросы могут быть использованы для декларации ISR:

 

 

 

by

 

 

 

 

 

#define _ISR __attribute__((interrupt))

 

 

 

 

#define _ISRFAST __attribute__((interrupt, shadow))

 

 

Например, чтобы объявить ISR для прерываний от timer1:

 

 

void _ISR _T1Interrupt(void);

 

 

 

 

Translated

 

 

 

 

 

Чтобы объявить ISR для прерывания от SPI1 с быстрым сохранением контекста:

 

 

void

ISRFAST SPI1Interrupt(void);

 

 

 

 

Примечание ISR будет установлена в таблицы векторов прерываний

 

 

 

автоматически, если используются зарезервированные имена,

 

 

 

приведенные в п. 8.4 «Запись векторов прерываний».

7.7.

Адресация EEDATA из Си - только для dsPIC30F

 

 

Компилятор предлагает несколько удобных макроопределений для размещение

 

 

данных в области EEPROM данных. Это можно делать довольно просто:

 

 

int

EEDATA(2) user_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

 

 

user data будет размещен в пространстве данных EEPROM резервированием 10

 

 

слов с заданными начальными величинами.

 

 

Устройство dsPIC предоставляет программисту два способа доступа к этой области памяти. Первый — через окно видимости программного пространства. Второй — с использованием специальных команд (TBLRDx).

7.7.1. Доступ к EEDATA через PSV

Компилятор обычно управляет окном PSV так, чтобы иметь доступ к константам, хранящимся в программной памяти. Если это не тот случай, окно PSV может быть использовано для доступа к памяти EEPROM данных.

Чтобы использовать окно PSV:

регистр PSVPAG должен быть установлен на соответствующий адрес для доступа

кпрограммной памяти. Для EEPROM данных это будет 0xFF, но лучше всего использовать функцию __builtin_psvpage().

© 2008 Microchip Technology Inc.

DS51284H(ru) стр. 7-5

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

окно PSV должно также быть открыто установкой бита PSV в регистре CORCON. Если этот бит не установлен, из окна PSV всегда читается 0x0000.

ПРИМЕР 7-2. ДОСТУП К EEDATA ЧЕРЕЗ PSV

#include <p30fxxxx.h> int main(void) {

PSVPAG = __builtin_psvpage(&user_data);

CORCONbits.PSV = 1;

/* ... */

.

 

if (user_data[2]) ;/* какие-то действия */

}

 

Эти действия требуется проделать только одинA

раз. Если PSVPAG не изменится,

Wilson

 

переменные в пространстве EEdata можно читать ссылаясь на них как на обычные переменные Cи, как показано в примере.

Примечание Эта модель доступа несовместима с моделью, когда компилятор сам управляет PSV (-mcon t-in-code). Следует быть осторожными, чтобы избежать конфликта.

7.7.2. Доступ к EEDATA посредством команд TBLRDx

Команды TBLRDx непосредственно не поддерживаются компилятором, но они могут быть использованы через inline ассемблер. Подобно доступу через PSV,

часть команды. Чтобы получить доступ в ту же память, что и в предшествующем примере, можно использовать следующий код:

23-битовый адрес формируетсяby из величины SFR и адреса закодированного как

Чтобы использовать инструкции TBLRDx:

РегистрTranslatedTBLPAG должен быть установлен в необходимый адрес для доступа к программной памяти. Для EEdata это будет 0x7F, но лучше всего использовать

Команда TBLRDx может использоваться из оператора __asm__ или с помощью

одной из функций builtin_tblrd; см. «dsPIC30F/33F Programmer’s Reference Manual» (DS70157) для информации об этой команде.

asm ("tblrdl [%1], %0" : "=r"(eedata_val) : "r"(eedata_addr)); \

dest = eedata_val;

\

}

 

int main(void) {

 

int value;

 

TBLPAG = __builtin_tblpage(&user_data);

eedata_read(user_data,2*sizeof(user_data[0]), value); if (value) ; /* do something */

}

DS51284H(ru) стр. 7-6

© 2008 Microchip Technology Inc.

Глава 7. Файлы поддержки устройства

7.7.3. Дополнительные источники информации

В разделе 5 «dsPIC30F Family Reference Manual» (DS70046), есть отличное обсуждение использования программной Flash памяти и памяти EEdata, предоставляемых устройствами dsPIC. Там также есть информация о записи в программную память и память EEdata на этапе исполнения.

A . Wilson by Translated

© 2008 Microchip Technology Inc.

DS51284H(ru) стр. 7-7

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

Для заметок.

A . Wilson by Translated

DS51284H(ru) стр. 7-8

© 2008 Microchip Technology Inc.

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