Здравствуйте. Сформулируйте свой вопрос по-точнее пожалуйста. Вы работаете с процессором 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, там очень много и подробно описано про перечисленные функции, есть список доступных каналов контроллера прерываний и т.д.