Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Nios II 7.2 IDE
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Волощенко
Добрый день!
При работе с Nios II 7.2 IDE столкнулся с непонятным ограничением по размеру кода в памяти программ. Через SOPC задал on_chip_memory в 100 кбайт. Компиляция С/С++ сообщает, что задействовано 20 кбайт и еще свободно 80 кбайт.
После загрузки все работает нормально, но когда добавляю еще пару команд, то наблюдаю, нарушение в работе, а убираю эти команды: все нормально. Причем, команды могут быть самые разные, с добавлением в разных местах программы – эффект один. После вырезания из программы произвольного куска кода, т.е. после сокращения в целом ее размера, все ОК и эти дополнительные команды проходят.
Как бы наблюдаются ограничения по размеру кода. Применял лицензии от Альтеры и «наши» - все без отличий.

Кто-то уже сталкивался с подобным? Как это побороть?
Kuzmi4
2 Волощенко - странно конечно... Сам не наблюдал такого, но давненько уже код в on_chip_memory не располагал - разве что бутлодырь..
А пробовали перенести код в RAM ?

Кстати - как наблюдаете нарушение в работе ?
Волощенко
Цитата(Kuzmi4 @ Sep 16 2008, 10:43) *
А пробовали перенести код в RAM ?
Код в RAM, как я понимаю, это код в той же on_chip_memory, т.е. в самой FPGA. Попадает туда после стартовой загрузки из Flash или напрямую через USB-JTAG. Почему on_chip_memory в FPGA: потому как NiosII работает на 100 MIPS - достаточно высокая частота.

Цитата(Kuzmi4 @ Sep 16 2008, 10:43) *
Кстати - как наблюдаете нарушение в работе ?
Просто есть тестовые точки для своего UART-а, проверяю их в режиме интерактива через комп. Когда ответа от точек нет, то код явно не рабочий.
Kuzmi4
2 Волощенко - на счёт памяти - я имел ввиду SDRAM, DDR SDRAM ну и так далее. 100 МГц SDRAM-ка выдерживает, а DDR подавно..
Кстати о листинге - он сответствует тому что написано ?

Просто есть подозрение что оно считает что 100кб для on_chip_memory это многовато и начинает выЙОжЫваться..

На счёт
Цитата
тестовых точек
- у вас есть интерупт на уарте, на который повешено откликаться, но при обращении отклика нет ? Так ?
На счёт интерактива - руками или прога тестит ?

И есчё - пробовали написать что-то простое но большое - типа использовать полноценный printf(у меня он вроде бы 60 кб занимает без оптимизации на NIOSII IDE 7.2) и что нибудь страшное по нему отправить, что проверить его - так быстро можно будет увидеть работоспособность в обсчем.

Впрочем может оптимизация в GCC всему виной...
Syberian
Цитата(Волощенко @ Sep 16 2008, 09:37) *
После загрузки все работает нормально, но когда добавляю еще пару команд, то наблюдаю, нарушение в работе, а убираю эти команды: все нормально.Кто-то уже сталкивался с подобным? Как это побороть?


Возможно, я сообщу банальность, Но при размещении кода в Он-чип компилер не всегда корректно отслеживает оверлапы с кэш-памятью. Особенно если играться с разрядностью кэша.
Кэш отключать как бы нельзя (т.к. тогда придется приделывать tightly coupled memory, а запускать из нее код - задача для проктолога). Но попробуй хотя бы уменьшить его разрядность, размер и отключить бурсты.... 4 кило 32-разр кэша - это 16 килобайт ончипа. Разрядность самой памяти тоже лучше свести к 16 бит.
Словом, предполагаю, программа у тебя просто не влазит в он-чип. Ниос ИДЕ делает довольно громоздкий код даже с оптимизацией. Также попробуй входить не в main() а alt_main() и инициализировать все сам.
Волощенко
to Kuzmi4
1. И SDRAM, и DDR SDRAM есть, попробую, думаю должно пройти. На них и проверю.
2. 100кбайт это немного, там на FPGA около 2500 кбайт встроенной памяти, как бы должно хватать.
3. printf(у) использую, но это для работы с IDE. Просто надо и без IDE. А чтобы без IDE - то через UART-rs232 под свою программу обслуживания (монитор), в которой куча окошек и режимов, так проще и быстрее. Есть режим команда-ответ, есть трасса, ну и другие. А не проходит у меня команда-ответ, на ней спотыкаемся.

to Syberian
1. Что-то о кэше не подумал, даже не знаю, использую или нет.... А tightly coupled memory точно нет.
2. Почеиу "Разрядность самой памяти тоже лучше свести к 16 бит.", ведь команды по 32 разряда?
3. В части "попробуй входить не в main() а alt_main() и инициализировать все сам" для меня полный туман. Где можно почерпнуть информацию?

Убедили.. попробую для памяти программ перейти на out-chip.
Syberian
Цитата
3. В части "попробуй входить не в main() а alt_main() и инициализировать все сам" для меня полный туман. Где можно почерпнуть информацию?


Когда в Ниос ИДЕ создаешь проект, есть шаблоны - в них лежит проект с альтом. Минимальный размер проги.

Цитата
2. Почеиу "Разрядность самой памяти тоже лучше свести к 16 бит.", ведь команды по 32 разряда?

Я и к восьми сводил, на быстродействие это не влияло. Зато программу можно было впихнуть большего размера. Кэш 512(минималка) 32-разрядный.

Как ни странно, но если прогмем, датамем, хеап и стек сунуть в ext_ram, все работает в 2 раза быстрее, чем если все упихать в ончип о_О
Тестировал на StratixII отладочной плате проектом Dhrystone (есть в шаблонах IDE)
Волощенко
Попытки перевести память программ на out-chip в моем ките DK-NIOS-2S60N не удались.

Перенес программу из onchip-memory в ssram. Компиляция прошла, но в процессе загрузки какие-то проблемы с верификацией при загрузке, а процессор в приторможенном состоянии. Прошлось вернуться назад.
Проблема остается...

В приложении скрин свойств системной библиотеки, а за ним сообщения при загрузке.
Kuzmi4
2 Волощенко :

На счёт ssram - частоту он выдерживает нормально ? Может сбоить уже начинает ?

Касательно скринки - такое и у меня было по непонятным причинам - вылечивалось полной пересборкой прожекта. Попробуйте, может и вам поможет.

А есчё попробуйте убрать onchip-memory вообсче с проекта - засуньте всё в SDRAM например.

Есчё галочки на Reduce device drivers и Small C Library - может лучше попробовать без них со стандартными настройками ?

Вчера на моём девките на 2-м циклоне и в onchip-memory запихивал всё и в SDRAM - всё нормально было (правда пришлось самому ручками настраивать много чего, а то не влезло бы - у моего сцЫклона мало внутренней для работы стандартными ф-циями). Ошибок в работе не обнаружил.

На счёт alt_main() - можно на сате альтеры почитать про это - в 2-х словах он пропускает всю инициализацию. Но мне больше нравится в alt_sysinit.c самому копаться smile.gif Не люблю я alt_main()...

И есчё - я так понял у вас автомат проверяет - типа вопрос-ответ - может тут лучше посмотреть Terminal`ом - тобто ручками ?

А вообсче мутно оно как то..
Stewart Little
Цитата(Волощенко @ Sep 16 2008, 10:37) *
Как бы наблюдаются ограничения по размеру кода. Применял лицензии от Альтеры и «наши» - все без отличий.

Нет, никаких ограничений по размеру кода быть не должно. Скорее всего у Вас произошел выход за пределы памяти. Проверьте, есть ли в том ПЛИСе, с которым Вы работаете, столько памяти, сколько Вы в SOPC Builder'е задали. При этом надо помнить, что встроенные блоки памяти требуются и для процессорного ядра, и для JTAG-Debug-модуля.
Ну и, наверное, надо написать обработчик исключения по обращению к несуществующей области памяти. Это поможет точнее диагностировать причину такого поведения.
Kuzmi4
2 Stewart Little - обычно IDE сама пишет что вылазим за пределы..
Да и квартус не даст выделить больше чем есть - напишет что нету и вывалится по ошибке..
На счёт
Цитата
обработчика исключения

Идея кстати хорошая, вот только я не нашёл в n2sw_nii52006.pdf описания как это сделать.
Так подозреваю что это типа интерупта что-то, вот только как именно ?
Может примеры есть у кого?
Волощенко
Цитата(Kuzmi4 @ Sep 17 2008, 11:40) *
Есчё галочки на Reduce device drivers и Small C Library - может лучше попробовать без них со стандартными настройками ?
Kuzmi4, спасибо!
Похоже, что причина в этом, уже легче... smile.gif
Я снял галочку с Small C Library и все прошло! Видимо, эта опция как-то ограничивает код.


Вот что о ней пишется в Help:
Small C library - When on, the system library uses a reduced implementation of the Newlib ANSI C standard library. Notably, the printf() family of routines (printf(), fprintf(), sprintf(), etc.) will not support floating-point values. The reduced library is optimized for smaller memory footprint, although the implementation might be less time efficient.
Kuzmi4
2 Волощенко - пожалуста wink.gif
Как обычно дебри компилятора не довели до добра.. smile.gif
На счёт Small C Library - я с самого начала как про неё прочитал в доках, шняга эта мне не понтравилась - ахтунгов много было по тексту..
Может в принципе и полезно, но сам с тех пор стараюсь не юзать.



А вообсче на счёт обработчика исключений есть у кого какие идеи - как его наваять?
В принципе ведь нужная и полезная штука smile.gif
EvgenyNik
Цитата
Как ни странно, но если прогмем, датамем, хеап и стек сунуть в ext_ram, все работает в 2 раза быстрее, чем если все упихать в ончип

Хммм... Интересно, а если он-чип прицепить неявно, а симмитировать ею ext_ram? :-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.