|
NiosII, C/C++., Локализация данных в пространстве адресов. |
|
|
|
Jun 19 2008, 10:00
|
Местный
  
Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377

|
Всем привет! В NiosII используется Avalon Memory-Mapped (Avalon-MM) interfaces, как я понимаю, основанный на архитектуре с общим пространством адресов. В это пространство может включаться SRAM, DRAM, Flash, Onchip_Memory и периферия, начальные адреса, которых определены в system.h. Вопрос такой: Как средствами NiosII C/C++ отображается локализация данных в разных областях памяти? Например, один массив переменных нужно разместить в SRAM, другой массив констант во Flash и т.п., а обращаться к этим данным через указатели. Работая с компиляторами для микроконтроллеров архитектур 51, 196 и AVR, заметил, что для каждого описаны свои способы локализации, а для NiosII С/С++ подобного описания что-то не нахожу… Может кто подскажет, где это описано или приведет примеры.
|
|
|
|
|
Jun 19 2008, 10:43
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Попробуйте поискать в направлении сегменотв памяти: сегмент кода (.text) сегмент инициализируемых данных (.rodata) сегмент неинициализируемых данных (.rwdata) сегмент стека (.stack) - до кучи  В принципе, это общепринятая концепция для 32-разрядных процессоров.
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Jun 19 2008, 12:39
|
Местный
  
Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377

|
Вот, например, в Keil C51 есть такие виды памяти: data, xdata, bdata, sbit, pdata. И есть возможность разместить данные по своему желанию (ниже отрывки кода): data byte RiT, RoT; xdata byte Ri[32],Ro[260]; // --- Block for RS-232 communication --- bdata Flags; sbit MainLoop = Flags^0; //Flag for Main loop *((char pdata *)Rx)=*(pEthPcm++);
аналогичная ситуация в IAR для AVR word wa, wb, wc, wd, w0; byte FlagTIMER0; __eeprom byte IEEE_addresse[6]; __flash byte CLC1 []={0x01, 0x64, 0x89, 0x00};
Понятно, что это другой дивизион... Но хотелось бы видеть что-то аналогичное и в NiosII C/C++. Поэтому вопрос остается прежним: кто и как в таких ситуациях поступает (см. первый пост). Ведь данные, иногда, надо размещать по разным адресам.
to Kuzmi4. К асму в крайнем случае перейти можно, но хотелось бы разобраться с C/С++...
|
|
|
|
|
Jun 19 2008, 16:55
|
carpe manana
  
Группа: Свой
Сообщений: 321
Регистрация: 2-06-05
Пользователь №: 5 659

|
Почему бы не сделать просто: Код #include <system.h>
char *foo_CONST = DDR_BASE; unsigned int *foo_data = ONCHIP_BASE;
foo_CONST[0] = 0x0; foo_CONST[3] = 0x3;
foo_data [0] = 0x1234; foo_data [123] = 0xABCD;
|
|
|
|
|
Jun 19 2008, 17:47
|
Частый гость
 
Группа: Свой
Сообщений: 168
Регистрация: 6-07-04
Пользователь №: 266

|
Цитата(id_gene @ Jun 19 2008, 20:55)  Почему бы не сделать просто: Код #include <system.h>
char *foo_CONST = DDR_BASE; unsigned int *foo_data = ONCHIP_BASE;
foo_CONST[0] = 0x0; foo_CONST[3] = 0x3;
foo_data [0] = 0x1234; foo_data [123] = 0xABCD; A а если bsp builder по ONCHIP_BASE разместил код или стек?
|
|
|
|
|
Jun 20 2008, 00:15
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
все компоненты системы на базе ниоса memory-mapped, т.е. достаточно знать нужный адрес. а потом IOWR(address,data) или IORD(address) если это устройство(любое), то смотрим в файл system.h + файл описания регистров устройства. если это память, то еще проще: IOWR(address,data) или IORD(address). насчет разделения памяти на сегменты-это удобно, если есть RO-данные (их во флеш), остальные в RAM. если флеш - CFI, то вообще сказка, работа с RAM и ROM осуществляется одними и теми же макросами IORD,IOWR. если EPCS-то посложнее, но ненамного. если мне не изменяет склероз, то квалификатор типа const в языке C как раз и указывает компилятору, что переменную надо кинуть в секцию rodata.
|
|
|
|
|
Jun 20 2008, 07:46
|
carpe manana
  
Группа: Свой
Сообщений: 321
Регистрация: 2-06-05
Пользователь №: 5 659

|
Цитата(cms @ Jun 19 2008, 21:47)  A а если bsp builder по ONCHIP_BASE разместил код или стек? Ну я, естественно, имел ввиду, что разработчик знает, где у него что лежит и хочет положить свой массив данных в конкретную пустую область конкретной памяти. Как располагать функции в нужных секциях написано в Sw developer book в главе Memory Usage/Memory Sections. Можно ли управлять таким же образом массивами данных?
|
|
|
|
|
Jun 20 2008, 11:51
|
Участник

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

|
Да, уточните...
Сообщение отредактировал 608 - Jun 20 2008, 11:52
|
|
|
|
|
Jun 20 2008, 12:13
|
Местный
  
Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377

|
Цитата(Kuzmi4 @ Jun 20 2008, 12:51)  2 Волощенко - не забудьте поделится результами - самому интересно  //Это описание переменных в ssramalt_u8 mm[16] __attribute__ ((section (".ssram.rwdata"))); // Это часть кода для вывода на консоль for (y=0;y<10;y++) mm[y]=y; for (y=0;y<10;y++) {printf(", mm=%04x\n", mm[y]);}; //а программа и все остальное onchip_memory
|
|
|
|
|
Jun 20 2008, 15:22
|
Местный
  
Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377

|
Цитата(Kuzmi4 @ Jun 20 2008, 15:23)  Вы этот сегмент как то описывали где то, или просто добавили в систему SSRAM и заюзали атрибут ? Я работаю с платформой DK-NIOS-2S60N, в ней SSRAM, Flash, DDRAM, а также память в FPGA. С помощью SOPC подключил SSRAM и Flash, надо же как-то их задействовать. Как назначить там переменные, см.предыдущий пост. В свойствах syslib по умолчанию для всех переменных задана onchip_memory что в FPGA, а атрибутами можно в нужном месте переназначать их локализацию. Подсказка дана id_gene, за что ему большое спасибо, а главная ссылка на Nios II Software Developer's Handbook, глава Memory Usage/Memory Sections.
|
|
|
|
|
Jul 22 2008, 09:32
|
Местный
  
Группа: Свой
Сообщений: 305
Регистрация: 22-06-07
Из: Санкт-Петербург
Пользователь №: 28 617

|
Цитата(Волощенко @ Jun 19 2008, 14:00)  Как средствами NiosII C/C++ отображается локализация данных в разных областях памяти есть пример на сайле альтеры tcm_vs_cache.cи Using Nios II Tightly Coupled Memory.pdf к ниму; там можно посмотреть инициализацию Tightly coupled memory / On-chip / SDRAM (и вообще интересный примерчик, о производительности)
|
|
|
|
|
Jul 23 2008, 16:37
|
Местный
  
Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377

|
Цитата(yura-w @ Jul 22 2008, 12:32)  есть пример на сайле альтеры и Using Nios II Tightly Coupled Memory.pdf Спасибо за новую информацию! По поводу главного вопроса топика, как уже писал, обошелся для размещения в ssram так: alt_u8 RsInp [32] __attribute__ ((section (".ssram.rwdata"))); alt_u8 RsOut [256] __attribute__ ((section (".ssram.rwdata"))); alt_u8 RsT, RsN, RsC, RsK __attribute__ ((section (".ssram.rwdata"))); alt_u8 *RsI, *RsO __attribute__ ((section (".ssram.rwdata"))); Если не добавить атрибутику типа __attribute__ ((section (".ssram.rwdata"))), то компилятор автоматически размещает переменные в onchip_memory..., т.к. в свойствах System Library для всех типов памяти у меня прописано onchip_memory. Вот еще вопрос: На моей платформе DK-NIOS-2S60N есть и DDRAM, там емкости немеряно... Пока не понял, как к ней подступиться. Похоже надо корку где-то искать, или самому синтезировать, видать, без нее не обойтись. Кто и как разрешил эту проблему? Поделитесь опытом!!!
|
|
|
|
|
Jul 24 2008, 07:35
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
Цитата(Волощенко @ Jul 23 2008, 23:37)  Вот еще вопрос: На моей платформе DK-NIOS-2S60N есть и DDRAM, там емкости немеряно... Пока не понял, как к ней подступиться. Похоже надо корку где-то искать, или самому синтезировать, видать, без нее не обойтись. Кто и как разрешил эту проблему? Поделитесь опытом!!! с месяц назад пробовал на циклон3-стартер-кит. основная проблема была-скомпилировать проект, для DDR нужно правильные констрейны на I/O навесить, иначе тупо не соберется. лучше всего взять пример с фтп альтеры или на ниосфоруме пошарить. корку я брал альтеровскую, но видел и примеры с опенкорками. время будет, вкорячу на эту плату линукс
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|