Как прерывания работают на многоядерном процессоре ARM
На этот вопрос уже был дан ответ для x86 однако, я не смог найти много о процессорах ARM MP, таких как Cortex-A9, Cortex-A15 и т. д...
Что еще более важно, я хочу знать, могут ли прерывания быть вызваны на неосновном процессоре без какой-либо конфигурации и т. д.
Я работаю над программным обеспечением, которое имеет дело только с основным процессором, поэтому я помещаю все остальное в состояние WFI, однако я не знаю, как прерывания работают на процессорах MP arm, возможно ли, что основной процессор продолжает выполнять код и один из вторичных процессоров берет его и переходит к инструкции в векторной таблице и выполняет этот код ?
Кстати, вот код, который я использую, чтобы перевести их в режим низкой мощности
uint32_t reg;
__asm__ volatile("mrc p15, 0, %0, c0, c0, 5" : "=r" (reg));
reg &= 0xF;
if(reg > 0)
goto spin;
<code snipped>
spin:
for(;;)
cpu_idle(); // cpu_idle -> wfi
1 ответ:
Короткий и практически правильный ответ состоит в том, что то, что вы просите, невозможно без некоторой конфигурации, выполняемой на вторичных ядрах...
Архитектура контроллера прерываний описана (довольно подробно) в http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0048b/index.html
Чтобы подготовить вторичные ядра к приему IPIs, необходимо:
- включите распределитель GIC (один раз, для всего система)
- включить интерфейс процессора GIC (для каждого ядра)
- включите IPI, которые вы хотите получить (для каждого ядра)
- установите приоритеты для каждого IPI, который вы хотите получить (для каждого ядра)
- Убедитесь, что Регистр маски приоритета прерывания интерфейса процессора (для каждого ядра) установлен на уровень приоритета ниже (большее число), чем приоритет прерывания, установленный выше.
- очистить CPSR I-бит (для каждого ядра)
Если вы не собираетесь реализовывать прерывание обработчик, пропустите очистку I-бита. Ядро выйдет из WFI и продолжит выполнение. Это обычно то, что вы хотите для операции загрузки системы.