Реле Tianbo - ресурс 10 млн переключений

Подключение внешней SRAM 512 Кбайт к Arduino Mega. Часть 3 - ПО, базовые решения

Arduino Arduino Mega

Часть 1 – Теория
Часть 2 – Схема и подключение

Примечание. Выборки исходного кода, размещенные в тексте описания, использовать в своих проектах не рекомендуется. В конце описания имеется ссылка на архив с исходными кодами.

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

В заключительной части статьи мы рассмотрим основные моменты в программном обеспечении микроконтроллера при работе с внешней памятью объемом 512 КБайт применительно к среде Arduino. Все материалы доступны для скачивания в разделе загрузок в конце статьи.

Для работы с внешней памятью в интегрированной среде разработки была составлена библиотека функций XMEM (xmem library), которые реализуют основные функции при работе с памятью. При разработке данной библиотеки ставилась цель позволить с помощью существующих функций для работы с памятью (malloc, free, new и delete) организовать работу с внешней памятью.

Следует отметить, что функции содержатся в диапазоне имен с именем xmem, поэтому следует использовать префикс при вызове функций, например, xmem::begin(…). Все функции определены в файле xmem.h, поэтому необходимо включить его в свой проект.

Инсталляция библиотеки в среде Arduino

  1. Загрузить zip-файл из раздела загрузок.
  2. Загруженный файл распаковать в установочную директорию Arduino, поддиректория Libraries, с созданием в ней новой папки с именем xmem. Например, C:Program Files ->(x86)arduino-0021-> libraries.
  3. Запустить среду Arduino и в настройках Tools -> Import Library -> xmem добавьте библиотеку в свой проект.

Функции библиотеки XMEM

Функция void begin(bool heapInXmem_);

Эта функция должна быть вызвана перед тем, как использовать внешнюю память. Она настраивает регистры микроконтроллера AVR для доступа к внешней памяти и выбирает 0 банк памяти как текущий. Если выбрать значение параметра heapInXmem как истина (true) – рекомендованное значение – то область памяти Heap (динамическая память), используемая функциями malloc, free, new и delete, будет размещена во внешней памяти.

xmem::begin(true);

Функция void setMemoryBank(uint8_t bank_, bool switchHeap_=true);

Эта функция используется для переключения банков памяти. Значение переменной bank_ должно лежать в диапазоне 0 – 7. Если значение параметра switchHeap_ истинна (по умолчанию), то текущее состояние динамической памяти сохраняется до переключения банка памяти, пока не станет активным новый банк памяти. Управление динамической памятью (Heap) подразумевает, что вы можете свободно переключаться между банками, таким образом достигается оптимальное использование внешней памяти.

xmem::begin(true);
// используем память банка 0
xmem::setMemoryBank(1,true);
// используем память банка 1


Функция SelfTestResults selfTest():

Это диагностическая функция, которая может использоваться для проверки корректного функционирования аппаратной части. Она записывает битовый шаблон в каждый байт каждого банка памяти и затем считывает их, это говорит о том, что данную функцию не следует использовать при работе основной программы приложения.

Функция возвращает структуру, которая содержит результат теста. Структура определена следующим образом:

struct SelfTestResults {
bool succeeded;
volatile uint8_t *failedAddress;
uint8_t failedBank;
};

Если тест завершился успешно, без ошибок, значение переменной succeeded будет истина. Если были обнаружены ошибки, то адрес ошибки будет храниться в переменной failedAddress, номер банка - в переменной failedBank.

xmem::SelfTestResults results;
xmem::begin(true);
results=xmem::selfTest();
if(!results.succeeded)
fail();

Базовые решения

Далее мы рассмотрим базовые решения с применением библиотеки xmem, а также методы конфигурирования внешней памяти.

Область Heap по умолчанию, область глобальных данных по умолчанию, непосредственное управление внешней памятью

В этом случае динамическая область памяти и область глобальных данных размещаются во внутренней памяти микроконтроллера, и пользователь непосредственно использует всю внешнюю память, определяя указатели на нее.

#include < xmem.h > 
void setup() {
// инициализация памяти
xmem::begin(false);
}
void loop() {
// определяем некоторые указатели в памяти
int *intptr=reinterpret_cast(0x2200);
char *charptr=reinterpret_cast(0x2200);

// храним целочисленные переменные в банке памяти 0
xmem::setMemoryBank(0,false);
intptr[0]=1;
intptr[10000]=2;
intptr[20000]=3;

// храним символьные переменные в банке памяти 1
xmem::setMemoryBank(1,false);
charptr[0]='a';
charptr[10000]='b';
charptr[20000]='c';

delay(1000);
}

Область глобальных данных по умолчанию, Heap во внешней памяти

В этом решении мы перенесли область динамической памяти во внешнюю память. Кроме того, обслуживаются несколько состояний динамической памяти при переключении банков внешней памяти, таким образом, мы имеем 8 независимых областей динамической памяти по 56 КБайт, которые можно эффективно использовать в приложении. Это позволит использовать требовательные к оперативной памяти библиотеки и подпрограммы.

#include < xmem.h > 
byte *buffers[8];
void setup() {
uint8_t i;
xmem::begin(true);
// устанавливаем 8 буферов по 50K, один на каждый банк памяти
for(i=0;i<8;i++) {
xmem::setMemoryBank(i,true);
buffers[i]=(byte *)malloc(50000);
}
}

void loop() {
uint16_t i,j;
// заполняем каждый предопределенный банк некоторыми данными
for(i=0;i<8;i++) {
xmem::setMemoryBank(i,true);
for(j=0;j<50000;j++)
buffers[i][j]=0xaa+i;
}
delay(1000);
}

Загрузки:

Библиотека xmem для Arduino, исходные коды базовых решений – скачать 

Перевод: Vadim по заказу РадиоЛоцман

На английском языке: Add 512K of external SRAM to Arduino Mega. Part 3 - Software

Элитан
Россия
Arduino-Mega-2560-R3
Arduino
10 467 ₽
T-electron
Россия и страны СНГ
ARDUINOMEGA2560
190 932 ₽
Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя