Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: spi_slave в Nios
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
_Anatoliy
Подскажите,плз,как его нужно делать?Если с мастером более-менее понятно,то со слейвом у меня основная проблема - прерывания.Хочу написать свой обработчик,нужно чтобы по каждому принятому байту происходило прерывание основной программы.Как подключить обработчик?Нужен ли для этого VIC или можно обойтись без него?Литературу,конечно,читаю но как-то тяжело идёт процесс...С Nios раньше практически не работал.Может есть у кого похожий пример?
Stewart Little
Цитата(_Anatoliy @ Dec 4 2013, 17:34) *
Подскажите,плз,как его нужно делать?Если с мастером более-менее понятно,то со слейвом у меня основная проблема - прерывания.Хочу написать свой обработчик,нужно чтобы по каждому принятому байту происходило прерывание основной программы.Как подключить обработчик?Нужен ли для этого VIC или можно обойтись без него?Литературу,конечно,читаю но как-то тяжело идёт процесс...С Nios раньше практически не работал.Может есть у кого похожий пример?

Можно и без VIC, если не нужно быстрого отклика на прерывание. Используйте Internal контроллер (т.е. софтовый).
Обработчик подключается специальной сишной функцией. Вот пример ниосовского кода с использованием пркрываний:
Код
#include "sys/alt_irq.h"
#include "system.h"

#include "altera_avalon_pio_regs.h"
#include "altera_avalon_timer_regs.h"

#include "pwm_avalon_interface_regs.h"
#include "pwm_avalon_interface.h"
#include "pwm_avalon_interface.c"

//********************** Global Variables ***********************************************
volatile unsigned short int led_dir;
volatile int return_code;
volatile unsigned char i = 0;
volatile unsigned int duty_cycle[8] = {499999, 150000, 60000, 10000, 5000, 2500, 800, 1};

//********************** ISR functions **************************************************
static void timer_isr (void * context)
{ volatile unsigned char* led_ptr;
  volatile unsigned char* dir_ptr;

  IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE, 0);

  dir_ptr = (volatile unsigned char*)context;
  led_ptr = dir_ptr + 1;

  return_code = altera_avalon_pwm_change_duty_cycle(LED_PWM_BASE, duty_cycle[i]);
  IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, *led_ptr);

  if(*dir_ptr)
    { *led_ptr >>= 1;
      i--;
    }
  else
    { *led_ptr <<= 1;
      i++;
    }
  if(*led_ptr & 0x81)
    *dir_ptr ^= 0x1;

}

//********************** Auxiliary functions ********************************************
void check_return_code(unsigned int address, int return_code)
{ if(return_code != ALTERA_AVALON_PWM_OK)
;
//          print_error(address, return_code);
}

//********************* Main function ***************************************************
int main (void)
{ void* led_dir_ptr = (void*)&led_dir;

  led_dir = 0x0100;

  //Timer Initialization
  IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE, 0x0003);
  IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE, 0);

  IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_BASE, 0x9f00);
  IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_BASE, 0x0055);//0x0014);

  //Register ISR for timer event
  alt_ic_isr_register(TIMER_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_IRQ, timer_isr, led_dir_ptr, 0);

  //Initialize PWM and Check Return Code
  return_code = altera_avalon_pwm_init(LED_PWM_BASE, 500000, 1);
  check_return_code(LED_PWM_BASE, return_code);

  //Enable PWM and Check Return Code
  return_code = altera_avalon_pwm_enable(LED_PWM_BASE);
  check_return_code(LED_PWM_BASE, return_code);

  //Start timer and begin the work
  IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE, 0x0007);

//  IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);

  while (1)
   check_return_code(LED_PWM_BASE, return_code);

}

_Anatoliy
Цитата(Stewart Little @ Dec 4 2013, 18:24) *

Большое спасибо,буду пробовать.
По ходу вопрос:какой смысл несёт передаваемый параметр context?Кто его формирует?
Код
static void timer_isr (void * context)


А нет ли у Вас такого же примера для VIC?Или там всё аналогично,только функции другие?
alexPec
Цитата(_Anatoliy @ Dec 5 2013, 11:11) *
По ходу вопрос:какой смысл несёт передаваемый параметр context?Кто его формирует?


Сами ставим вроде. Можно поставить указатель на статическую переменную, структуру, внешний порт, или еще чего, чтобы в обработчике брать/писать данные в контекст.
_Anatoliy
Цитата(alexPec @ Dec 5 2013, 10:31) *
Сами ставим вроде. Можно поставить указатель на статическую переменную, структуру, внешний порт, или еще чего, чтобы в обработчике брать/писать данные в контекст.

Да,спасибо,я уже понял что указатель задаётся здесь как led_dir_ptr.

Код
alt_ic_isr_register(TIMER_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_IRQ, timer_isr, led_dir_ptr, 0);
_Anatoliy
Что-то никак не получается подружиться с эклипсом.
Вот как узнать что означает эта ошибка?
Код
gun.c:6: first defined here
Копейкин
М.б. компилятор не видит декларации прототипа функции?
Konst_777
Цитата(_Anatoliy @ Dec 4 2013, 17:34) *
...Хочу написать свой обработчик,нужно чтобы по каждому принятому байту происходило прерывание основной программы...

Полезно поставить FIFO, хотя бы на несколько байт, чтобы обеспечить переход между клоковыми доменами и разгрузить процессор Nios II.
Stewart Little
Цитата(_Anatoliy @ Dec 5 2013, 11:11) *
А нет ли у Вас такого же примера для VIC?Или там всё аналогично,только функции другие?

VIC или не VIC - для софта без разницы. Все абсолютно аналогично.
_Anatoliy
Цитата(Копейкин @ Dec 5 2013, 17:01) *
М.б. компилятор не видит декларации прототипа функции?

Нет,для этого случая у него есть варнинг:
Код
top.c:31: warning: implicit declaration of function 'Irq_init'


Цитата(Konst_777 @ Dec 5 2013, 17:05) *
Полезно поставить FIFO, хотя бы на несколько байт, чтобы обеспечить переход между клоковыми доменами и разгрузить процессор Nios II.

Согласен,в общем случае полезно разгружать,но у меня здесь нет фоновых задач,только выполнение команд.Не для чего разгружать.

Цитата(Stewart Little @ Dec 5 2013, 17:33) *
VIC или не VIC - для софта без разницы. Все абсолютно аналогично.

Спасибо.

А как правильно в эклипсе подключать глобальные переменные?Пробовал объявлять в Main.c а в другие файлы подсовывал их как extern, идут ошибки multiple definition.Пробовал объявлять в одном файле global.h и включал его во все файлы - тоже самое.
gosu-art
Цитата(_Anatoliy @ Dec 5 2013, 18:58) *
А как правильно в эклипсе подключать глобальные переменные?Пробовал объявлять в Main.c а в другие файлы подсовывал их как extern, идут ошибки multiple definition.Пробовал объявлять в одном файле global.h и включал его во все файлы - тоже самое.

Я делаю так:

xxx.c
Код
unsigned char start=0;

xxx.h
Код
extern unsigned char start;

main.c
Код
#include "xxx.h"
if(start)
{
}
_Anatoliy
Цитата(gosu-art @ Dec 6 2013, 07:22) *

Если делаю объявления переменных в теле файлов *.с то компилится без ошибок,как только выношу их в файлы *.h - сразу выскакивают ошибки multiple definition.Делаю два файла : global.h и extern.h. Файл global.h подключаю к файлу с main(),файл extern.h подключаю в остальные файлы. Причём ошибки возникают только на простых переменных,структуры объявлять можно и так и эдак, всегда без ошибок.Ну не должно такого быть.
Копейкин
В *.h обычно ставят "предохранители" от повторного подлючения:

CODE

#ifndef __HEADER_H__
#define __HEADER_H__ 1
.
.
. /* всякие декларации */
.
#endif


_Anatoliy
Цитата(Копейкин @ Dec 6 2013, 10:59) *

На С я уже давно пишу...
Код
#ifndef GLOBAL_H_
#define GLOBAL_H_
......
#endif /* GLOBAL_H_ */
Konst_777
Цитата(_Anatoliy @ Dec 6 2013, 11:30) *
Если делаю объявления переменных в теле файлов *.с то компилится без ошибок,как только выношу их в файлы *.h - сразу выскакивают ошибки multiple definition...

А в xxx.h присутствуют волшебные строки ?
Код
#ifndef XXX_H_
#define XXX_H_
...
...
...
#endif /*XXX_H_*/


Эх, пока набирал, уже и спросили и ответили laughing.gif
_Anatoliy
Коллеги,подскажите синтаксис вызова в WinXP Nios II Command Shell.bat из другого файла name.bat так, чтобы сразу указать на исполнение файл сценария name.sh.
Делаю как в примере,а почему-то не работает.
Kuzmi4
2 _Anatoliy
пробелы ему не нравятся я так понял, обычно запускал как то так
Код
%QUARTUS_ROOTDIR%\bin\cygwin\bin\bash.exe

или так
Код
"%QUARTUS_ROOTDIR%\bin\cygwin\bin\bash.exe" --rcfile "%SOPC_KIT_NIOS2%\nios2_sdk_shell_bashrc"


Сейчас переполз в линух на виртуалке и забыл про пробелы в именах rolleyes.gif
_Anatoliy
Цитата(Kuzmi4 @ Dec 9 2013, 19:23) *
2 _Anatoliy
пробелы ему не нравятся я так понял, обычно запускал как то так
Код
%QUARTUS_ROOTDIR%\bin\cygwin\bin\bash.exe

или так
Код
"%QUARTUS_ROOTDIR%\bin\cygwin\bin\bash.exe" --rcfile "%SOPC_KIT_NIOS2%\nios2_sdk_shell_bashrc"


Сейчас переполз в линух на виртуалке и забыл про пробелы в именах rolleyes.gif


Спасибо.
Если запускаю чисто bash командой
Код
%QUARTUS_ROOTDIR12%\bin\cygwin\bin\bash.exe

то он запускается как-то криво,например не понимает команду dir и т.п.
А если запускать так
Код
"%QUARTUS_ROOTDIR12%\bin\cygwin\bin\bash.exe" --rcfile "/cygdrive/c/altera/12.1/nios2eds/qpsk"

где qpsk.sh мой скрипт - то запускается так же криво и скрипт не выполняется.

Есть батник Nios II Command Shell.bat который запускает bash.exe и системный скрипт nios2_command_shell.sh. В открывшемся досовском окне я руками вбиваю название своего скрипта и именно эту операцию я хотел бы исключить.Как указать bash.exe что мне нужно выполнить скрипт qpsk.sh?Может в конец nios2_command_shell.sh как то дописать вызов моего скрипта?
Kuzmi4
Прицепил батник и скрипт
Нажмите для просмотра прикрепленного файла
У меня он рабоатет без проблем (DIR)

P.S.
Там есть ещё моменты в новых версиях квартуса - набранное в винде оно не совсем правильно понимает, "\r", "^M" и всякое такое ему мерещится.. Не знаю как это в винде обойти, потому набиваю скрипты в вируалке линуха сразу.
_Anatoliy
Цитата(Kuzmi4 @ Dec 10 2013, 10:21) *
Прицепил батник и скрипт
Нажмите для просмотра прикрепленного файла
У меня он рабоатет без проблем (DIR)

P.S.
Там есть ещё моменты в новых версиях квартуса - набранное в винде оно не совсем правильно понимает, "\r" и всякое такое ему мерещится..

Да,так мой скрипт начинает выполняться,но проблемы с путями,не видит sof2flash,elf2flash и т.д.
Вот мой скрипт:
Код
#!/bin/sh

cd e:\out
# Creating .flash file for the FPGA configuration
sof2flash --epcs --input=qpsk.sof --output=qpsk_hw.flash  --verbose

#Creating .flash file for the NIOS project
elf2flash --input=qpsk_v4.elf --output=qpsk_sw.flash --epcs --after=qpsk_hw.flash --verbose

#Creating .hex file for the project
nios2-elf-objcopy -I srec -O ihex qpsk_sw.flash  qpsk_sw.hex --verbose


И точно - \r мерещится.Как с этим быть?
Kuzmi4
2 _Anatoliy
теперь ясно - путей нет к sof2flash/elf2flash/.., их надо или прописывать в скрипте.
По поводу борьбы с \r - я в виртуалке линуха набиваю в расшареной папке для винды.
_Anatoliy
Цитата(Kuzmi4 @ Dec 10 2013, 10:53) *
2 _Anatoliy
теперь ясно - путей нет к sof2flash/elf2flash/.., их надо или прописывать в скрипте.
По поводу борьбы с \r - я в виртуалке линуха набиваю в расшареной папке для винды.

Так и ваш скрипт тоже не работает.А пути я сейчас попробую указать явно.

По поводу \r - это такая реакция на пустые строки в скрипте,после удаления их эта ошибка ушла.
Но пути не срабатывают.
Kuzmi4
2 _Anatoliy
попробуйте везьде явно все пути указать - и сорцов тоже.

Хотя я кажется понял из "sh_jar.sh" что там происходит - судя по всему он хочет запускаться из своего рут-фолдера.
У меня была похожая ситуация пару недель назад, я гляну сегодня - отпишусь. Это индусские "мега-фиксы" в новых версиях.
_Anatoliy
Цитата(Kuzmi4 @ Dec 10 2013, 11:14) *
2 _Anatoliy
попробуйте везьде явно все пути указать - и сорцов тоже.

Хотя я кажется понял из "sh_jar.sh" что там происходит - судя по всему он хочет запускаться из своего рут-фолдера.
У меня была похожая ситуация пару недель назад, я гляну сегодня - отпишусь. Это индусские "мега-фиксы" в новых версиях.

С явными путями тоже не проходит.Ага,спасибо,подожду.
Так а ваш скрипт тоже не работает(не видит mkdir и т.д.)
_Anatoliy
Всё получилось,благодарю за внимание.
gosu-art
Цитата(_Anatoliy @ Dec 10 2013, 14:58) *
Всё получилось,благодарю за внимание.

Может поделитесь рабочим примерчиком?rolleyes.gif Для меня тоже актуально
_Anatoliy
Цитата(gosu-art @ Dec 10 2013, 14:50) *
Может поделитесь рабочим примерчиком?rolleyes.gif Для меня тоже актуально

Та я не линуксоид,откуда ж мне знать что для запуска скрипта нужно использовать не ./name.sh а bash ./name.sh laughing.gif Почитал доки,нашёл заветное слово.Итог : в конец файла nios2_command_shell.sh я дописал вызов нужного скрипта.
Код
if [ -n "$*" ]; then
    exec $@
else
    echo "------------------------------------------------"
    echo "Altera Nios2 Command Shell [GCC 4]"
    echo
    echo "Version 12.1, Build 177"
    echo "------------------------------------------------"

    # Use bash --norc to get a clean shell
    # Use bash --rcfile <bashrc> to for a user rcfile
    # Default to using ~/.bashrc
    bash ./qpsk.sh
fi
_Anatoliy
А как понять вот этот перл от эклипса?Файл alt_types.h ведь подключен...
Kuzmi4
2 _Anatoliy
у меня такая же ситуация случается на 13.0sp1 - помогает только "пересборка" проекта заново в IDE. Почему случается не знаю, но само по себе не пропадает.
_Anatoliy
Цитата(Kuzmi4 @ Jan 31 2014, 11:21) *
2 _Anatoliy
у меня такая же ситуация случается на 13.0sp1 - помогает только "пересборка" проекта заново в IDE. Почему случается не знаю, но само по себе не пропадает.

В смысле - пересборка в Квартусе?
Kuzmi4
2 _Anatoliy
нет, заново в IDE компоную проект с нуля. В принципе это занимает не сильно много времени, потому что у меня проект собирается BASH скриптами, а потом я только импортирую это дело (+ добавлениея папок с сорцами, чтобы по коду во время отладки лазить), но и это всё равно напрягает, бывает раз 5 в день так "отваливается" в самых интересных местах отладки (там ещё невозможно потом загрузить на отладку после перекомпиляции что то часто после появления ЭТОГО чЮда).
В 9.0sp2 такого беспредела не было..
Stewart Little
Цитата(_Anatoliy @ Jan 31 2014, 13:09) *
А как понять вот этот перл от эклипса?Файл alt_types.h ведь подключен...

А попробуйте в инклюде указать полный путь к этому h-файлу.
_Anatoliy
Цитата(Stewart Little @ Jan 31 2014, 11:59) *
А попробуйте в инклюде указать полный путь к этому h-файлу.

Kuzmi4 прав,после пересборки "жучки" пропали. Грустно.
gridinp
Цитата(_Anatoliy @ Jan 31 2014, 14:11) *
Kuzmi4 прав,после пересборки "жучки" пропали. Грустно.

Если это то что я думаю, то избавится можно в Window/Preference/"C/C++"/Code Analysis убрать
все галки. Затем для проекта сделать Index/Rebuild
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.