|
|
  |
NIOS для начинающих |
|
|
|
Apr 13 2010, 18:17
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Только начал осваивать Nios, поэтому сразу начали возникать вопросы. По мере их возникновения стараюсь по максимуму курить маны, но не всегда получается докопаться до истины. Вот и споткнулся на очередной, наверняка, простейшей фигне, но нигде не смог найти описание или какое-то указание о ней. Итак, имею девбоард Altera DE2-70, QII 8.1 и Nios IDE такой же версии. Собираю простейшую систему: Самый мощный вариант процессора, он-чип память, PIO-вход (подключенный к свичам на плате), PIO-выход (подключенный к светодиодам на плате). Компилю систему, заливаю ее программером (.sof-файл) - он прекрасно подцепляется (появляется сообщение о том, что система имеет такие-то временные ограничения и чере столько-то будет отключена - типа, все окей. Далее в IDE создаю Nios II C/C++ проект (с библиотекой), содержащий в исходнике простейший сишный код (слизан из альтеровского же pdf-ника), адреса, естественно, выставляю те, которые получились у меня: Код #define Switches (volatile char *) 0x0001800 #define LEDs (char *) 0x0001810
void main() { while (1) *LEDs = *Switches; } После этого компилю проект, а далее начинается вопрос (конфигурация хардвары создана). Если я запускаю программу в режиме отладки (Debug as -> ....., бряк стоит на цикле), то при пошаговом выполнении (постоянно жму F5) я вижу что программа прекрасно работает, то есть светодиоды зажигаются/гаснут в зависимости от положения свичей. Однако, если я запускаю проект не в режиме отладки, а просто как (Run as -> ......, бряк при этом снимаю), то программа, такое ощущение, не стартует... Так и не смог найти информацию - почему такое происходит.... То есть, что получается при запуске программы - я в консоли IDE вижу что он программу туда заливает (пишет ОК), верифицирует (пишет ОК), а потом пишет "Leaving target processor paused ". Я так понимаю что после загрузки программы процессор не запущен. В хелпе все вроде бы четко написано (цитата из хелпа по Nios IDE): Цитата When targeting Nios II hardware, the Run As command does the following:
1. Creates a default run/debug configuration for the target board. Note: This step usually completes automatically without user intervention. If it cannot (the most common cause is that you have multiple JTAG download cables installed), the IDE displays an error message, and you must manually set up a run configuration.
2. Builds the project. If the project is not up-to-date, then the IDE builds it first to generate an up-to-date executable file.
3. Establishes communication with the target board, and verifies that the expected SOPC Builder system is configured in the FPGA. If the FPGA is not configured properly, you should repeat the steps to configure the hardware.
4. Downloads the executable file (.elf) to memory on the target board.
5. Instructs the Nios II processor to begin executing the code. Собственно, как выполнить пункт 5 (я так понимаю, именно в этом и затык) нигде не нашел упоминания.......
Причина редактирования: Оформление цитаты. Omen_13
|
|
|
|
|
Apr 14 2010, 00:37
|

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

|
Цитата То есть, что получается при запуске программы - я в консоли IDE вижу что он программу туда заливает (пишет ОК), верифицирует (пишет ОК), а потом пишет "Leaving target processor paused ". Я так понимаю что после загрузки программы процессор не запущен. это нормальное сообщение, а вот ваша программа вполне может и не работать так, как вы того ожидаете, особенно на NIOS-fast. точно сказать можно только для конкретной системы, но чаще всего это "фокусы" кэша данных. конструкции вида Код *LEDs = *Switches; вообще говоря не предназначены для операций ввода/вывода, хотя можно использовать и их (тогда читайте про операции с кэшем, главным образом про cache bypass). более надежный вариант писать так: Код //эти define`s есть в system.h //#define Switches (volatile char *) 0x0001800 //#define LEDs (char *) 0x0001810 #include "system.h" #include "altera_avalon_pio_regs.h" void main() { while (1) //*LEDs = *Switches; IOWR_ALTERA_AVALON_PIO_DATA(LEDs_base , IOWR_ALTERA_AVALON_PIO_DATA(Switches_base));//вместо LEDs_base и Switches_base подставить то, что в system.h } это будет работать независимо от наличия кэша
|
|
|
|
|
Apr 15 2010, 06:33
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Цитата попробуйте в строке "Additional nios2-download arguments" в диалоговом окне Run, вкладка Main написать --go Не помогло. Пишет следующее: Код Using cable "USB-Blaster [USB-0]", device 1, instance 0x00 Processor is already paused Initializing CPU cache (if present) OK
Downloading 00002000 ( 0%) Downloaded 8KB in 0.1s
Verifying 00002000 ( 0%) Verified OK Starting processor at address 0x00002020 и дальше тишина - никакой реакции на положения свичей. Цитата более надежный вариант писать так: ... это будет работать независимо от наличия кэша На этот код компилятор вообще выдает ошибки: Код #include "system.h" #include "altera_avalon_pio_regs.h" void main() { while (1) IOWR_ALTERA_AVALON_PIO_DATA(0x00011010 , IOWR_ALTERA_AVALON_PIO_DATA(0x00011000)); }
Выхлоп компилятора: - error: `IOWR_ALTERA_AVALON_PIO_DATA' undeclared (first use in this function) test_project main.c line 6; - macro "IOWR_ALTERA_AVALON_PIO_DATA" requires 2 arguments, but only 1 given test_project main.c line 6; Кроме того, еще ряд непонятных моментов образовался. Вчера все работало (пускай и только в режиме отладки, но все же работало). Сегодня - не работает вообще ни в одном из режимов (ни выполнение, ни отладка). Почему? Ведь я не трогал абсолютно ничего... П.С.: Может проще будет выложить сюда проект? П.П.С.: В настройках компилятора отключено использование уменьшенных С-библиотек и всяческих оптимизаций, включена поддержка С++. И еще вопрос: в настройках PIO в SOPC-билдере указываю разрядность 18 бит (именно столько свичей и светодиодов на плате). Однако, при отладке функционируют только 8 свичей и светодиодов. Что не так? Все адреса в SOPC-системе выровнены автоматически, если что.
|
|
|
|
|
Apr 15 2010, 06:49
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
По второй ошибке. Вообще-то тут у уважаемого vadimuzzz опечатка. Нужно в скобках не WR а RD: Код IOWR_ALTERA_AVALON_PIO_DATA(0x00011010 , IORD_ALTERA_AVALON_PIO_DATA(0x00011000)); Еще, лучше явно не писать адреса, а брать имена, данные sopc bilder из system.h, типа Код IOWR_ALTERA_AVALON_PIO_DATA(SWITCH_BASE , IORD_ALTERA_AVALON_PIO_DATA(LEDS_BASE)); Однако, почему у Вас появилась ошибка, что якобы IOWR_... не определена, я затрудняюсь ответить.
|
|
|
|
|
Apr 15 2010, 07:07
|

Частый гость
 
Группа: Участник
Сообщений: 95
Регистрация: 3-01-10
Из: Рождественно
Пользователь №: 54 616

|
Цитата(barabek @ Apr 15 2010, 11:04)  По второй ошибке. Вообще-то тут у уважаемого vadimuzzz опечатка. Нужно в скобках не WR а RD: Код IOWR_ALTERA_AVALON_PIO_DATA(0x00011010 , IORD_ALTERA_AVALON_PIO_DATA(0x00011000)); Еще, лучше явно не писать адреса, а брать имена, данные sopc bilder из system.h, типа Код IOWR_ALTERA_AVALON_PIO_DATA(SWITCH_BASE , IORD_ALTERA_AVALON_PIO_DATA(LEDS_BASE)); Однако, почему у Вас появилась ошибка, что якобы IOWR_... не определена, я затрудняюсь ответить. У меня используются заголовки Код #include <stdio.h> #include <stdlib.h> #include "sys/alt_irq.h" #include "system.h" #include "altera_avalon_pio_regs.h" #include "alt_types.h" #include "sys/alt_sys_init.h" и все макросы находятся С портами общаюсь так Код IOWR_ALTERA_AVALON_PIO_DATA(FLASH_RD_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(FLASH_RD_BASE, 0); d_I0 = IORD_ALTERA_AVALON_PIO_DATA(FLASH_DATA_BASE);
Сообщение отредактировал Omen_13 - May 13 2010, 15:45
Причина редактирования: Оформление кода. Omen_13
|
|
|
|
|
Apr 15 2010, 08:21
|

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

|
да, это я неудачно скопипастил, правильный код такой: Код IOWR_ALTERA_AVALON_PIO_DATA(SWITCH_BASE , IORD_ALTERA_AVALON_PIO_DATA(LEDS_BASE)); отсюда же и растут ноги ошибки "error: `IOWR_ALTERA_AVALON_PIO_DATA' undeclared (first use in this function) test_project main.c line 6; - macro "IOWR_ALTERA_AVALON_PIO_DATA" requires 2 arguments, but only 1 given test_project main.c line 6;" т.к. IOWR_ALTERA_AVALON_PIO_DATA, который объявлен в altera_avalon_pio_regs.h требует 2 аргумента (адрес, данные), а IORD_ALTERA_AVALON_PIO_DATA, который и должен там был стоять изначально - только адрес покажите ваш system.h и картинку из SOPC-билдера. пины в квартусе правильно разведены, варнингов при компиляции не кидал про ноги? лог компиляции в квартусе тоже давайте на всякий случай.
|
|
|
|
|
Apr 15 2010, 09:09
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Все заработало! Ошибка была в том, что я использовал неправильные адреса Сейчас, как и посоветовали, взял алиасы на них их из system.h (он, как я понимаю, генерится SOPC-билдером, да?) и все заработало. Ключик "--go" тоже заработал (похоже что он и раньше работал, но т.к. я использовал некорректные адреса - то и не видел ничего). Разрядность PIO также оказалась рабочей. В общем, почти все косяки были из-за обращений к некорректным адресам ))) Спасибо за помощь! Пока что полет нормальный - все работает четко. Начинаю втыкать как использовать загрузку с флэшки.
|
|
|
|
|
Apr 15 2010, 13:25
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Что-то аццкий Flash programmer (из IDE) орет на меня (делаю все по доке "Nios II Flash Programmer User Guide"): Код #!/bin/sh # # This file was automatically generated by the Nios II IDE Flash Programmer. # # It will be overwritten when the flash programmer options change. #
cd E:/FPGA/NIOSII_Projects/test_project/Debug
# Creating .flash file for the FPGA configuration "$SOPC_KIT_NIOS2/bin/sof2flash" --epcs --input="E:/FPGA/DE2/NIOSII/NIOSII_time_l imited.sof" --output="NIOSII_time_limited.flash" Info: ******************************************************************* Info: Running Quartus II Convert_programming_file Info: Command: quartus_cpf --no_banner --convert --device=EPCS128 --option=NIOSI I_time_limited.opt E:/FPGA/DE2/NIOSII/NIOSII_time_limited.sof NIOSII_time_limite d.pof File E:/FPGA/DE2/NIOSII/NIOSII_time_limited.sof contains one or more time-limite d megafunctions that support the OpenCore Plus feature that will not work after the hardware evaluation time expires. Refer to the Messages window for evaluatio n time details. Info: SRAM Object File E:/FPGA/DE2/NIOSII/NIOSII_time_limited.sof contains time- limited megafunction that supports OpenCore Plus feature -- Vendor: 0x6AF7, Prod uct: 0x00A2 Internal Error: Sub-system: PGMIO, File: /quartus/pgm/pgmio/pgmio_flash_mapping. cpp, Line: 3714 ranks->size() > 0 Stack Trace: 0x1C496 : PGMIO_PCF_FILE_INFO::operator= + 0x76E6 (pgm_pgmio)
End-trace
Info: ******************************************************************* Info: Running Quartus II Convert_programming_file Info: Command: quartus_cpf --no_banner --convert NIOSII_time_limited.pof NIOSII_ time_limited.rpd Error: File name "NIOSII_time_limited.pof" does not exist Error: Quartus II Convert_programming_file was unsuccessful. 1 error, 0 warnings Error: Peak virtual memory: 66 megabytes Error: Processing ended: Thu Apr 15 17:35:42 2010 Error: Elapsed time: 00:00:00 Error: Total CPU time (on all processors): 00:00:00 15.04.2010 17:35:42 - (SEVERE) sof2flash: Read error: File: NIOSII_time_limited. rpd not found, exiting 15.04.2010 17:35:42 - (SEVERE) sof2flash: Error retrieving data from NIOSII_time _limited.rpd
# Programming flash with the FPGA configuration "$SOPC_KIT_NIOS2/bin/nios2-flash-programmer" --epcs --base=0x00009800 --sidp=0x0 000a010 --id=135841862 --timestamp=1271336990 --accept-bad-sysid "NIOSII_time_l imited.flash" NIOSII_time_limited.flash: Unable to open input file Empty flash content cannot be programmed or verified
# Creating .flash file for the project "$SOPC_KIT_NIOS2/bin/elf2flash" --epcs --after="NIOSII_time_limited.flash" --inp ut="test_project.elf" --output="epcs_flash_controller.flash" 15.04.2010 17:35:43 - (SEVERE) elf2flash: Data error: File not found: NIOSII_tim e_limited.flash 15.04.2010 17:35:44 - (SEVERE) elf2flash: Error retrieving data from test_projec t.elf
# Programming flash with the project "$SOPC_KIT_NIOS2/bin/nios2-flash-programmer" --epcs --base=0x00009800 --sidp=0x0 000a010 --id=135841862 --timestamp=1271336990 --accept-bad-sysid "epcs_flash_co ntroller.flash" epcs_flash_controller.flash: Unable to open input file Empty flash content cannot be programmed or verified Это связано с тем, что ядро time-limited? Хотя после загрузки в плату SOF он мне выдает сообщение что "time remaining: unlimited".........
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|