Lapunou 0 23 ноября, 2012 Опубликовано 23 ноября, 2012 · Жалоба Есть внешняя память хочу на ней выделить память для создания каких то классов, при этом чтобы была возможность динамичеки выделять память и во внутренней. По сути хочется выделять динамически память в разных сегментах памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beaRTS 0 23 ноября, 2012 Опубликовано 23 ноября, 2012 · Жалоба Есть внешняя память хочу на ней выделить память для создания каких то классов... по-моему, .esystem секция памяти отвечает за динамическое распределение( в нее все валится). Поэтому в *.cmd файле линковщика засылаете .esystem по адресу Вашей памяти Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lapunou 0 25 ноября, 2012 Опубликовано 25 ноября, 2012 · Жалоба Но должна быть возможность создаваты классы во внутренней и внешней памяти в зависимоски от класса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beaRTS 0 25 ноября, 2012 Опубликовано 25 ноября, 2012 (изменено) · Жалоба Но должна быть возможность создаваты классы во внутренней и внешней памяти в зависимоски от класса. Чтобы справиться с проблемой нужно пробовать способы, описанные в 7.5.4.6 Allocation Using Multiple Memory Ranges и 7.5.4.7 Automatic Splitting of Output Sections Among Non-Contiguous Memory Ranges (spru513 TMS320C28x Assembly Language Tools ). В параграфе 7.5.4.7 сказано, что линковщик может разделять на части выходную секцию ( например, такую, как ваша ”.esystem”) и помещать их в различные области памяти для эффективного размещения данной выходной секции. Для создания особого указания линковщику, что данная секция может быть разделена используют оператор >> . примерно так: .esystem: { *(.esystem) } >> RAML4 | RAML5 | RAML6 | RAML7, PAGE = 1 заменяете некоторые из RAML4 | RAML5 | RAML6 | RAML7 на адрес вашей внешней памяти, и должно быть Вам счастье, наверное... Пробуйте, и отпишитесь помогло или нет??? меня Ваша проблема тоже когда-нибудь коснется, а сотен других инженеров уже коснулась! =) Изменено 25 ноября, 2012 пользователем beaRTS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lapunou 0 26 ноября, 2012 Опубликовано 26 ноября, 2012 · Жалоба вроде для моей проблемы можно использовать: .sysmem и ф-и malloc тогда память выделяется в sysmem и .esysmem и ф-и far_malloc тогда память выделяется в esysmem. Но если у меня память выделяется для класса опрератором new, то формально можно использовать Placement new. Данный оператор не выделяет память, а получает своим аргументом адрес на уже выделенную каким-либо образом память (например, на стеке или через malloc). Происходит размещение (инициализация) объекта путем вызова конструктора, и объект создается в памяти по указанному адресу. 01:typedef class myOTL 02:{ 03: int x; 04: public: 05: myOTL(): x(5){}; 06: 07:}myOTL; 08: 09: void *qw; 10: myOTL *a; 11: qw=std::malloc( sizeof(myOTL)); 12: if(qw) 13: { 14: a = new (qw) myOTL(); 15: } 16: std::free(qw); Но компилятор выдает ошибку (у меня CGT v5.0.2). "main.cpp", line 14: error: no instance of overloaded "operator new" matches the argument list argument types are: (unsigned long, void *) Как я понимаю наш компилятор не поддерживает Placement new. Тогда как еще можно вызвать конструктор класса? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 26 ноября, 2012 Опубликовано 26 ноября, 2012 · Жалоба Неверно понимаете. В вашем класе вам надо перегрузить new: class myOTL { ... public: void * operator new(uint, myOTL *p) const { return p; } }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lapunou 0 26 ноября, 2012 Опубликовано 26 ноября, 2012 · Жалоба Да спасибо работает. class myOTL{ ... public: void * operator new(size_t , void *p) { return p; } }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться