Я пытаюсь закодировать обработчик прерываний в 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 прерываний …
Задача ещё не решена.
Других решений пока нет …