Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как обработать прерывание - SOC cycloneV
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
TSURKOV
нашел статью с примером https://zhehaomao.com/blog/fpga/2014/05/24/sockit-10.html

не получается подключить библиотеки

module.h
nit.h
kernel.h
fs.h
ioport.h
sched.h

даже не могу найти заголовочные файлы на диске. Слышал что эти библиотеки входят в состав какой то другой обобщающей библиотеки.

Прошу помощи !!!
serjj
Здравствуйте. Сформулируйте свой вопрос по-точнее пожалуйста. Вы работаете с процессором 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"

За основу можно взять пример Нажмите для просмотра прикрепленного файла
Там же рядом есть 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
Спасибо за информацию. Уточняю данные по проекту.

Работаю с системой на кристале HPS - ARM, Cyclone-V, ОС linux - сборка ядра Angstrom v2013.12 - Kernel 3.10.31 - ltsi - 02861 - g801a40f
Прерывание хочу обрабатывать от собственного модуля, подключаемого к HPS по avalon шине (вроде того что в ссылке которую привел в начале)
serjj
По линуксу ничего сказать не могу sad.gif
Я изучал подходы к программированию HPS без ОС.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.