Перейти к содержанию
    

Все получил.

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Итак, все заработало как я и ожидал. Программка и Система была простейшая - бегущий светодиод (т.е., 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

Изменено пользователем spectr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот отчет компилятора 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

 

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

Изменено пользователем Omen_13
Оформление кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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 не работал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 кроме всего вышесказанного предыдущими, при использовании прерываний подключайте файл sys/alt_irq.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день,

возникла проблема с средой 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 програматор и отладчик.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

Изменено пользователем Omen_13
Оформление цитаты. Omen_13

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...