TSURKOV 0 20 марта, 2015 Опубликовано 20 марта, 2015 · Жалоба нашел статью с примером https://zhehaomao.com/blog/fpga/2014/05/24/sockit-10.html не получается подключить библиотеки module.h nit.h kernel.h fs.h ioport.h sched.h даже не могу найти заголовочные файлы на диске. Слышал что эти библиотеки входят в состав какой то другой обобщающей библиотеки. Прошу помощи !!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 20 марта, 2015 Опубликовано 20 марта, 2015 · Жалоба Здравствуйте. Сформулируйте свой вопрос по-точнее пожалуйста. Вы работаете с процессором HPS или с Nios? Версию софта в студию, можно также указать на какой отладке работаете. Как я смутно понял, вы хотите в bare metal приложении добавить обработку прерывания от некоторого модуля. Неплохо бы указать от какого. Есть свои ньюансы в зависимости от, например, самописный ли это модуль в FPGA части или это хардовый модуль в HPS части. В целом рецепт такой (возьмем например general purpose timer): 1. Все необходимые файлы лежат в $ALTERA_PATH\embedded\ip\altera\hps\altera_hps\hwlib. Это собственно hwlib от Altera для разработки bare metal приложений. Для работы с таймером и его прерываниями потребуются, если мне не изменяет память: #include "alt_interrupt.h" #include "alt_timers.h" За основу можно взять пример Altera_SoCFPGA_HardwareLib_Timers_CV_GNU.tar.gz Там же рядом есть src файлы. Их нужно прописать в списке makefile'a (для arm-gcc), таким вот образом: HWLIBS_SRC := alt_interrupt.c (...) C_SRC := (...) $(HWLIBS_SRC) Всё это уже сделано в примере, поэтому рекомендую посмотреть его внимательно. 2. Для добавления прерывания требуется вызвать в программе следующие функции: int cpu_target = 0x1; ALT_STATUS_CODE status = ALT_E_SUCCESS; status = alt_int_global_init(); status = alt_int_cpu_init(); // назначить какому ядру адресуется прерывание status = alt_int_dist_target_set(ALT_INT_INTERRUPT_TIMER_OSC1_0_IRQ, cpu_target); // выбрать тип триггера status = alt_int_dist_trigger_set(ALT_INT_INTERRUPT_TIMER_OSC1_0_IRQ, ALT_INT_TRIGGER_AUTODETECT); // разрешить данное прерывание локально status = alt_int_dist_enable(ALT_INT_INTERRUPT_TIMER_OSC1_0_IRQ); // зарегестировать обработчик status = alt_int_isr_register(ALT_INT_INTERRUPT_TIMER_OSC1_0_IRQ, timer_isr, NULL); // разрешить прерывание в модуле status = alt_gpt_int_enable(ALT_GPT_OSC1_TMR0); status = alt_int_cpu_enable(); status = alt_int_global_enable(); Простейший обработчик: volatile bool timer_flag = false; static void timer_isr() { alt_gpt_int_clear_pending(ALT_GPT_OSC1_TMR0); timer_flag = true; } Если вы подключаете прерывание от самодельного модуля на FPGA, то ключевым отличием будет способ детектирования прерывания. Обратите внимание: status = alt_int_dist_trigger_set(ALT_INT_INTERRUPT_TIMER_OSC1_0_IRQ, ALT_INT_TRIGGER_AUTODETECT); По-умолчанию стоит ALT_INT_TRIGGER_AUTODETECT, но для обработки прерываний от FPGA необходимо задавать тип триггера явно: status = alt_int_dist_trigger_set(ALT_INT_INTERRUPT_F2S_FPGA_IRQ31, ALT_INT_TRIGGER_LEVEL); Рекомендую посмотреть файл alt_interrupt.h, там очень много и подробно описано про перечисленные функции, есть список доступных каналов контроллера прерываний и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TSURKOV 0 20 марта, 2015 Опубликовано 20 марта, 2015 (изменено) · Жалоба Спасибо за информацию. Уточняю данные по проекту. Работаю с системой на кристале HPS - ARM, Cyclone-V, ОС linux - сборка ядра Angstrom v2013.12 - Kernel 3.10.31 - ltsi - 02861 - g801a40f Прерывание хочу обрабатывать от собственного модуля, подключаемого к HPS по avalon шине (вроде того что в ссылке которую привел в начале) Изменено 20 марта, 2015 пользователем TSURKOV Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 20 марта, 2015 Опубликовано 20 марта, 2015 · Жалоба По линуксу ничего сказать не могу :( Я изучал подходы к программированию HPS без ОС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться