Программа обработки прерываний не может быть вызвана напрямую

Я пытаюсь закодировать обработчик прерываний в C ++ без использования ассемблера через __attribute__((interrupt)),

Следующий код:
INIT / idt.cpp:

void set(IDTDescr *descriptor, void(*handler)(void), uint8_t flags)
{
descriptor->selector = 0x08;

uintptr_t handler_addr = (uintptr_t)handler;
descriptor->offset_1 = handler_addr & 0xFFFF;
descriptor->offset_2 = (handler_addr >> 16) & 0xFFFF;
descriptor->offset_3 = (handler_addr >> 32) & 0xFFFFFFFF;

descriptor->flags = flags;
}
void init(void)
{
memset(descriptors, 0, sizeof(descriptors));

//Faults:
set(&descriptors[0x00], &DivideByZero,              IDT_PRESENT | IDT_INTERRUPT);
set(&descriptors[0x01], &Debug,                     IDT_PRESENT | IDT_INTERRUPT);

и так далее.

прерывание / обработчик / stubs.h:

//Faults:
void DivideByZero(struct cpu_state *state);
void Debug(struct cpu_state *state);

и так далее.

прерывание / обработчик / fault_irs.cpp:

__attribute__((interrupt)) void DivideByZero(struct cpu_state *state)
{
Text::Clear();
Text::Simple::Write("FAULT!");
abort();
}

__attribute__((interrupt)) void Debug(struct cpu_state *state)
{
Text::Clear();
Text::Simple::Write("FAULT!");
abort();
}

и так далее.

Проблема в том, что GCC говорит мне, что я не могу позвонить ISR напрямую. Но я не называю это напрямую, не так ли? Должен ли я определить __attribute__((interrupt)) в void set тоже?

Может ли это помочь, если я установлю аргументы в stubs.h как void?

Самое смешное, что первая ошибка принята gcc …

Похоже, что gcc хочет, чтобы я поместил все isr в отдельный файл … Если я делаю то же самое в interrupt / handler / irq_irs.cpp, это работает ….

Может быть, дополнительное объяснение, почему я не хочу просто использовать один обработчик прерываний: если я использую один IH, мне придется использовать switch-case для вызова правильной функции для обработки прерывания (потому что я не могу положить весь код обработки в обработчик, я буду использовать отдельные функции). Это очень накладные расходы и не делает вещи проще … Даже если мне действительно нужно создать файл для 256 прерываний …

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]