Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: С++. Обмен с внешней памятью.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
AlexOr
Возможности компилятора IAR:
uint8 __eeprom * p; //указатель на EEPROM
__eeprom uint8 a=1; //переменная в EEPROM
uint8 b=2; //переменная в RAM
Далее можно свободно творить такое:
*p = a + b;
Т.е. синтаксис как для обычных переменных без домыслов об их расположении.
Притом вместо uint8 может быть даже любой определенный typedef тип, например огромная структура.

ВОПРОС
Есть вот такие функции для взаимодействия с энергонезависимой памятью (FRAM):
void f24write(uint16 adr, void* p, uint8 num)
void f24read(void* p, uint16 adr, uint8 num)
где
adr – адрес в FRAM
p - указатель на RAM самого МК
num – количество байт.
Возможно ли реализовать с помощью C++ взаимодействие аналогичное по синтаксису с __eeprom?
Т.е. чтоб в итоге можно было писать, что типа того:
uint8 __fram * p; //указатель на FRAM
__fram uint8 a=1; //переменная в FRAM
uint8 b=2; //переменная в RAM
*p = a + b;
AndyBig
Можно сделать класс работы с FRAM и переопределить для него операторы =, +, -, * и т.д.
ReAl
Цитата(AndyBig @ Jun 25 2005, 15:43)
Можно сделать класс работы с FRAM и переопределить для него операторы =, +, -, * и т.д.

и ещё оператор(ы) приведения к int (char, ... по необходимости).
Это нужно как раз для

uint8_t a, b;
uint8_fram c;
b = a + c; // вот тут нужен uint8_fram::operator int()

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

Там с другим придётся повозиться - с распределением памяти (адресов) в самой fram. Чтобы и писать свободно и чтобы при этом при линковке из разных файлов оно собиралось как надо.
ReAl
Цитата(ReAl @ Jun 25 2005, 17:27)
Цитата(AndyBig @ Jun 25 2005, 15:43)
Можно сделать класс работы с FRAM и переопределить для него операторы =, +, -, * и т.д.

и ещё оператор(ы) приведения к int (char, ... по необходимости).

Тьху, не "а ещё", а просто нужны
operator=(const T&) или operator =(T)
operator T()
где T - это int8/uint8/int16/... для fram_int8/fram_uint8/fram_int/...
(и вообще - template fram<T> :-) )
а вот +-/* - это пусть уже в "нормальных" типах делается.
AndyBig
Ну да, приведение типов я тоже имел в виду, просто включил их в "т.д." smile.gif
Правда, я пока не пробовал в IAR переопределять операторы для классов, даже не знаю - сработает ли...
Да и вопрос о распределениии памяти линковщиком - тоже еще та задачка smile.gif.
Скорее всего, придется делать самостоятельный менеджер памяти. Фактически ведь все получающиеся объекты будут экземплярами класса, и храниться они будут в виде указателей. А уж какой адрес для FRAM будет использован в каждом экземпляре - это ни компилятор ни линкер сами не смогут решить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.