реклама на сайте
подробности

 
 
> Iar и внешняя память, любая память с любым интерфейсом
Alfa
сообщение Mar 21 2008, 11:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 9-02-06
Из: Челябинск
Пользователь №: 14 160



Хочу легко и просто работать с внешней памятью :
- определять переменные, массивы, структуры int a, char abc[10];
- читать из этой памяти примерно так temp=a; temp=abc[4];
- писать в память a=8; abc[2]=10;

При этом тип внешней памяти может быть любой (SRAM, EEPROM, Dataflash...)
и интерфейс доступа тоже (spi, i2c, ногодрыжество)

Посмотрел в сторону встроенного eeprom для avr (способ общения с ней) - то что надо, но похоже все жестко описано на уровне компилятора.

Попробовал определить свой сегмент в xcl файле
//*************************************************************************
// Read/write segments mapped to 128K External RAM.
//*************************************************************************
-DextRAMSTART=000000
-DextRAMEND=01FFFF
//************************************************
// Data segments.
//************************************************
-Z(XDATA)extDATA=extRAMSTART-extRAMEND

Определил переменную
__no_init int alpha @ "extDATA";

Обратился к ней
alpha=10;

А вот как теперь объяснить компилятору что нужно сделать чтоб записать во внешнюю память число 10?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
by-pass
сообщение Mar 22 2008, 18:37
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 13-09-05
Пользователь №: 8 518



Статья от DASMa, в догонку.
Прикрепленный файл  Flash_Cpp.rar ( 15.72 килобайт ) Кол-во скачиваний: 314


Сообщение отредактировал IgorKossak - Mar 23 2008, 10:04
Go to the top of the page
 
+Quote Post
Alfa
сообщение Mar 24 2008, 04:20
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 9-02-06
Из: Челябинск
Пользователь №: 14 160



всем спасибо. особенно статья понравилась - хорошо разжевано. буду пробовать
Go to the top of the page
 
+Quote Post
asket
сообщение May 12 2008, 14:32
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 24-08-06
Из: Москва
Пользователь №: 19 809



У меня вот такой вопрос новичка по Си++, почитав статью, понял что можно перегрузить операторы присваивания для получения и записи во флеш данных определенного типа, если в качестве данных выстпуает структура большого объема, и смысла нет в копировании такого объема из флеш в оперативку, которая по рамеру кот наплакал.. Используется встроенный Флеш в микроконтроллере MSP430.
Приведу в качсетве примера код взятый из статьи DASM.

extern void FlashWrite (void * what, unsigned addr, unsigned objSize);
extern void FlashRead (void * where, unsigned addr, unsigned objSize);

template <class T> class CFlash
{
public:
// перегрузка оператор присваивания
void operator = (T val)
{
int addr = (unsigned) this; // получаем адрес переменной
int objSize = sizeof (T); //получаем размер переменной
FlashWrite (&val, addr, objSize); // пишем переменную во флеш
};

// перегрузка оператора приведения типа
operator T()
{
T t; // создаем временный объект парметризованного класса
int addr = (unsigned) this;
return *((T *)addr); // возвращаем прочтенный объект
}

private:

T _dummy;
};

теперь во флеш мне надо записать структуру размером в сегмент флеша 512 байт

struct F{
unsigned char h;
unsigned int g;
.....
};

для записи во флеш использую готовый оператор

CFlash <F> F_0;

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

tmp = F_0;
tmp.h = 9;
F_0 = tmp;

А если структура размера сегмента 512 Мб, то можно ли с помошью операторов получить доступ к одтельным членам структуры? Например хочется чтобы такая запись позволила записать только один байт F_0.h = 9, как это сделать с помошью операторов C++?

Спасибо!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 12 2008, 15:43
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(asket @ May 12 2008, 17:32) *
А если структура размера сегмента 512 Мб, то можно ли с помошью операторов получить доступ к одтельным членам структуры? Например хочется чтобы такая запись позволила записать только один байт F_0.h = 9, как это сделать с помошью операторов C++?
Если оставить за скобками, что FlashWrite() при работе с флешем оперирует сегментами, то можно:
Код
struct myStruct_t
{
    CFlash<uint8_t> h;
    CFlash<uint32_T> g;
};

myStruct_t F0;

void Test()
{
    F0.h = 12;
    F0.g = 0x1234;
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.0421 секунд с 7
ELECTRONIX ©2004-2016