|
Iar и внешняя память, любая память с любым интерфейсом |
|
|
|
Mar 21 2008, 11:10
|
Участник

Группа: Участник
Сообщений: 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?
|
|
|
|
|
 |
Ответов
|
Mar 22 2008, 18:37
|
Участник

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

|
Статья от DASMa, в догонку.
Flash_Cpp.rar ( 15.72 килобайт )
Кол-во скачиваний: 314
Сообщение отредактировал IgorKossak - Mar 23 2008, 10:04
|
|
|
|
|
Mar 24 2008, 04:20
|
Участник

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

|
всем спасибо. особенно статья понравилась - хорошо разжевано. буду пробовать
|
|
|
|
|
May 12 2008, 14:32
|
Частый гость
 
Группа: Участник
Сообщений: 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++?
Спасибо!
|
|
|
|
|
May 12 2008, 15:43
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
May 12 2008, 16:14
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 24-08-06
Из: Москва
Пользователь №: 19 809

|
Цитата(Сергей Борщ @ May 12 2008, 19:43)  Если оставить за скобками, что FlashWrite() при работе с флешем оперирует сегментами, то можно: Код struct myStruct_t { CFlash<uint8_t> h; CFlash<uint32_T> g; };
myStruct_t F0;
void Test() { F0.h = 12; F0.g = 0x1234; } Спасибо, попробывал, получилось!)) Еще вопрос, мне надо организовать во флеше хранение массива структуры вида Код #pragma dataseg = "FLASH_NODES_SEG"
struct Node_t{ CFlash <char> f[512]; };
__no_init CFlash <Node_t> Cash; __no_init CFlash <Node_t> Node[3];
#pragma dataseg = default Cash я хотел бы использовать для промежуточного хранения сегмента для записи одного или нескольких байтов, как лучше организовать запись с кэшированием? Перед записями, я так понимаю что надо старый сегмент сохранить в сегмент Cash (поскольку оперативки кот наплакал), затем стираем новый сегмент, а затем из Cash вместе с новыми байтами записываем в записываемый сегмент, как это корректно организовать на C++?
|
|
|
|
|
May 12 2008, 18:38
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Цитата(asket @ May 12 2008, 20:14)  Cash я хотел бы использовать для промежуточного хранения сегмента для записи одного или нескольких байтов, как лучше организовать запись с кэшированием? Перед записями, я так понимаю что надо старый сегмент сохранить в сегмент Cash (поскольку оперативки кот наплакал), затем стираем новый сегмент, а затем из Cash вместе с новыми байтами записываем в записываемый сегмент, как это корректно организовать на C++? Может, лучше взять FRAM? Там, правда, будут такие вещи как разделяемый SPI или I2C (если туда подсоединена не только FRAM) и все прелести борьбы за ресурсы, зато никаких проблем с перезаписью одного байта
|
|
|
|
Сообщений в этой теме
Alfa Iar и внешняя память Mar 21 2008, 11:10 zltigo Цитата(Alfa @ Mar 21 2008, 14:10) Хочу ле... Mar 21 2008, 11:18 Alfa Цитата(zltigo @ Mar 21 2008, 16:18) Облом... Mar 21 2008, 11:33  zltigo Цитата(Alfa @ Mar 21 2008, 14:33) примерч... Mar 21 2008, 11:44   Alfa Цитата(zltigo @ Mar 21 2008, 16:44) А как... Mar 21 2008, 11:59    meister Кодstruct fram_via_ssp
{
static void prepare... Mar 21 2008, 17:59      asket Цитата(meister @ May 12 2008, 22:38) Може... May 13 2008, 06:56       asket Ладно, хорошо, допустим понадобится запись во внеш... May 14 2008, 07:18        meister Цитата(asket @ May 14 2008, 11:18) Напрме... May 14 2008, 07:27
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|