Jump to content

    
Sign in to follow this  
AlexBel

NIOS для начинающих

Recommended Posts

Все получил.

 

Компиляция прошла без упоминаний о триальности опенкорки, так что делаю вывод что все заработает на железке (это проверю завтра).

 

Спасибо за помощь!

Share this post


Link to post
Share on other sites

Итак, все заработало как я и ожидал. Программка и Система была простейшая - бегущий светодиод (т.е., On-chip RAM, PIO-out, контроллер EPCS, System ID, CPU). Все работало и зашивалось в EPCS на ура.

 

Далее я решил поиграться с прерываниями. Всего-лишь в существующую систему добавил PIO-вход (кнопочки), настроил в нем прерывания и автоназначил их в SoPC-билдере. Компилю, зашиваю, делаю в Nios II IDE простейший проект для отработки прерывания, успешно его компилирую, а далее при попытке загрузить его в плату получаю следующее фи:

 

Using cable "USB-Blaster [USB-0]", device 1, instance 0x00
Pausing target processor: OK
Reading System ID at address 0x0000A020: verified
Initializing CPU cache (if present)
OK

Downloading 00004000 ( 0%)
Downloading 00009820 (96%)
Downloaded 13KB in 0.2s (65.0KB/s)

Verifying 00004000 ( 0%)
Verifying 00009820 (96%)
Verify failed between address 0x9820 and 0x99C7
Leaving target processor paused

 

Насколько я понял из альтеровских и ниосовских форумов, такая ошибка возникает как правило при неверном pinout, невыполнении таймингов для внешней памяти (но у меня-то вся память - OnChip...), наводках по линии ТCK у JTAG.

 

В чем может быть дело?

- Pinout (Assignments для всей платы одним файлом) взят с фирменного диска, работал с ним уже сто раз на не-ниосовских проектах - все разведено нормально.

- Никакой внешней памяти кроме EPCS я не использую. Более того, раньше с ней все работало (до того как я добавил в систему PIO-вход).

- Timing Analyzer, конечно, поругивается варнингами про отрицательные слэки, но раньше же все работало. Неужели из-за добавления простого порта все так уехало?

- Вроде как, судя по адресам - это как раз флэшка. Но какого хрена она тогда раньше нормально работала?

 

П.С.: на всякий прилагаю скриншот системы

П.П.С.: клок, если что, беру не с PLL, а напрямую с источника на плате (50 МГц).

post-1437-1271678331_thumb.png

Edited by spectr

Share this post


Link to post
Share on other sites

такое впечатление, что либо бинарник большой, либо адреса левые. как будто что-то не пересобралось (system library?) куда-то он не туда пишет, ну и проверить естественно не может. выхлоп компилятора покажите

Share this post


Link to post
Share on other sites

Вот отчет компилятора IDE:

**** Build of configuration Debug for project test_project ****

make -s all includes 
Compiling main.c...
../main.c: In function `init_button_pio':
../main.c:34: warning: implicit declaration of function `alt_irq_register'
../main.c: At top level:
../main.c:39: warning: return type of 'main' is not `int'
../main.c: In function `main':
../main.c:41: warning: unused variable `value'
Linking test_project.elf...
Info: (test_project.elf) 13 KBytes program size (code + initialized data).
Info:					3120 Bytes free for stack + heap.
Creating generated_app.sh...
Post-processing to create ram_memory.hex
Hardware simulation is not enabled for the target SOPC Builder system. 
Skipping creation of hardware simulation model contents and simulation 
symbol files. (Note: This does not affect the instruction set simulator.)
Post-processing to create epcs_flash_controller_boot_rom.flash
Build completed in 27.984 seconds

 

Вот простыня исходника:

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"


//--------------------------------------------------------------
void delay(value)
{
int i=0;
for(i=0;i<value;i++);
}

//--------------------------------------------------------------
static void handle_button_interrupts(void* context, alt_u32 id)
{
volatile int* edge_capture_ptr = (volatile int*) context;
*edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTONS_BASE);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTONS_BASE,0);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTONS_BASE,0xF);
}

//--------------------------------------------------------------
//--------------------------------------------------------------
//--------------------------------------------------------------
//--------------------------------------------------------------
//--------------------------------------------------------------
volatile int edge_capture;

static void init_button_pio()
{
void* edge_capture_ptr = (void*) &edge_capture;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTONS_BASE,0xF);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTONS_BASE,0);
alt_irq_register(BUTTONS_IRQ,edge_capture_ptr,handle_button_interrupts);
}

//--------------------------------------------------------------
void main(void)
{

  int value = 0x00000001;

  init_button_pio();

  while (1)
  {

  if(edge_capture!=0)
  {
	switch(edge_capture)
	{
		case 0x1:
			IOWR_ALTERA_AVALON_PIO_DATA(LEDS_BASE , 0x1);
			break;

		case 0x2:
			IOWR_ALTERA_AVALON_PIO_DATA(LEDS_BASE , 0x2);
			break;

		case 0x4:
			IOWR_ALTERA_AVALON_PIO_DATA(LEDS_BASE , 0x4);
			break;

		case 0x8:
			IOWR_ALTERA_AVALON_PIO_DATA(LEDS_BASE , 0x8);
			break;

		default:
			break;
	}
  }

}

 

Если это важно: в свойствах системной библиотеки параметры Program Memory и ReadOnly Memory установлены на On-Chip память.

 

Еще одно уточнение - процессор по сбросу и исключению уходит в память EPCS. Но в системной библиотеке, как я уже писал выше память программ и ROM-память указывают на OnChip-память. Может из-за этого косячить?

 

Во! Когда я изменил в свойствах системной библиотеки указание памяти программ и ROM с OnChip на EPCS, то компилятор выдал-таки ошибку, причем как раз с теми адресами, которые он выдавал при верификации:

**** Build of configuration Debug for project test_project ****

make -s all includes 
Compiling main.c...
../main.c: In function `init_button_pio':
../main.c:34: warning: implicit declaration of function `alt_irq_register'
../main.c: At top level:
../main.c:39: warning: return type of 'main' is not `int'
../main.c: In function `main':
../main.c:41: warning: unused variable `value'
Linking test_project.elf...
/cygdrive/c/altera/81/nios2eds/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2-elf/3.4.6/../../../../nios2-elf/bin/ld: region epcs_flash_controller is full (test_project.elf section .text). Region needs to be 8908 bytes larger.
/cygdrive/c/altera/81/nios2eds/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2-elf/3.4.6/../../../../nios2-elf/bin/ld: address 0xa2b4 of test_project.elf section .epcs_flash_controller is not within region epcs_flash_controller
/cygdrive/c/altera/81/nios2eds/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2-elf/3.4.6/../../../../nios2-elf/bin/ld: section .rodata [00009820 -> 0000984b] overlaps section .exceptions [00009820 -> 000099c7]
/cygdrive/c/altera/81/nios2eds/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2-elf/3.4.6/../../../../nios2-elf/bin/ld: section .rwdata [0000984c -> 0000a2b3] overlaps section .exceptions [00009820 -> 000099c7]
collect2: ld returned 1 exit status
make: *** [test_project.elf] Error 1
Build completed in 13.921 seconds

 

Похоже что ему мало памяти...

Edited by Omen_13
Оформление кода.

Share this post


Link to post
Share on other sites

Я немного не понял, что Вы делаете

 

Когда при запуске он пытается загрузить программу и пишет:

Downloading 00004000 ( 0%)

Downloading 00009820 (96%)

Downloaded 13KB in 0.2s (65.0KB/s),

он грузит ее как бы в ОЗУ и неудивительно, что при попытке верификации EPCS он выдает ошибки. Для программирования EPCS надо использовать Flash Programmer.

 

По сути, область памяти от 0x9800, выделенная на EPCS контроллер - это загрузчик, который перекачивает из EPCS в ОЗУ содержимое, зашитое Flash Programmer'ом в EPCS. Тогда при включении системы загрузчик сам перекачает код из EPCS в те секции памяти, которые надо инициализировать (т.е., секции, которые лежат во встроенном ОЗУ, внешнем ОЗУ и т.д.).

 

Поэтому и код, и exception вектор в настройках ядра процессора кладите в ram_memory, а reset - на EPCS контроллер. Тогда при reset код из EPCS будет загружаться загрузчиком, а при загрузке с кабеля при Run - загружаться в ram_memory через JTAG.

 

P.S. Это вроде как в теории, сам с системами на кристалле, использующими EPCS не работал.

Share this post


Link to post
Share on other sites
Если это важно: в свойствах системной библиотеки параметры Program Memory и ReadOnly Memory установлены на On-Chip память.

 

Еще одно уточнение - процессор по сбросу и исключению уходит в память EPCS. Но в системной библиотеке, как я уже писал выше память программ и ROM-память указывают на OnChip-память.

на EPCS должен указывать только вектор сброса. как уже писал Sergey'F, по этому адресу живет начальный загрузчик(там маленькое ОЗУ в компонент встроено+контроллер SPI), все остальное (и системная библиотека) должно располагаться в RAM. собственно запуск программы из ниос-иде не затрагивает загрузчик. а по памяти - вроде хватает, еще 3к свободно. хотя для того, что вы привели 13к как-то многовато.

Share this post


Link to post
Share on other sites

Добрый день,

возникла проблема с средой Eclipse:

Стал изучать NIOSII и начал с этих уроков (на которые ссылается сама альтера) http://www.nioswiki.com/Embedded_Systems_Lab благо плата CII starter kit была в наличии

выполнил согласно их даташиту все шаги но на последнем возникла проблема в том что непонял как залить програму в процессор и запустить, т.е. не смог выполнить:

 

In the previous module you already downloaded the .SOF, so the FPGA is primed and ready to run the software application. Keeping the USB cable still plugged in to the DE1 board, you will download the application via the USB-JTAG link. To run the software project on the Nios II processor:

Right click on the software project directory and choose Run As and Nios II Hardware.

If the Run Configurations window appears:

Under the Project Tab: Verify Project and elf file name.

Under the Target Connection Tab: Select Refresh Connections

Select Run

т.к. фактически нет в Run Configurations пунктов отвечающих за JTAG програматор и отладчик.

 

Как его включить так чтоб он в среде програмирования появился?

Share this post


Link to post
Share on other sites
Как его включить так чтоб он в среде програмирования появился?

зашейте из квартус-программера sof, потом в ниос-иде жмите Run. при включенном jtag`е и правильном sof эклипс увидит циклон и ниос в нем (все настройки в авто). чтобы создать конфигурацию, ткните в пункт Nios II Hardware

Share this post


Link to post
Share on other sites

спасибо, запустил, но почему во время отладки при попытке прохода по шагам текущая выполняемая строка по F6 или F5 скачет достаточно странно (то всё линейно исполняется то назад проскакивает и тд)?

Share this post


Link to post
Share on other sites
спасибо, запустил, но почему во время отладки при попытке прохода по шагам текущая выполняемая строка по F6 или F5 скачет достаточно странно (то всё линейно исполняется то назад проскакивает и тд)?

включена оптимизация кода по размеру (-Os)? для отладки лучше оставить debug (-Og)

Share this post


Link to post
Share on other sites

спасибо, ещё вопрос: как освободить усб бластер занятый в среде ниойса для квартуса не выгружая самой среды ниойс еклипс? пробовал нажимать на красный квадрат остановки отладки/запуска не помогает.

 

Т.е. заливаеш в начале по джитагу прошивку из квартуса через байт бластер, потом запускаеш ниойс эклипс, заливаеш через него программу, останавливаеш выполнение, возврощаешся в квартус и пробуеш перезалить иную версию а он выдаёт:

 

Info: Started Programmer operation at Thu May 06 10:27:01 2010

Error: Application Nios2 on 192.168.1.14 is using the target device

Error: Operation failed

Info: Ended Programmer operation at Thu May 06 10:27:01 2010

 

и пока среду разработки для ниойса вообще не закроеш квартус будет выдавать такую ошибку.

Edited by Omen_13
Оформление цитаты. Omen_13

Share this post


Link to post
Share on other sites
как освободить усб бластер занятый в среде ниойса для квартуса не выгружая самой среды ниойс еклипс?

должен освобождаться, если отладчиком не занят. похоже баг. а отладчик что пишет в окне, где процессы висят (там типа ""thread gdb running")? если нажать красную кнопку, там должно писаться "terminated". что за операционка?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this