Как прерывания работают на многоядерном процессоре 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 5

1 ответ:

Короткий и практически правильный ответ состоит в том, что то, что вы просите, невозможно без некоторой конфигурации, выполняемой на вторичных ядрах...

Архитектура контроллера прерываний описана (довольно подробно) в http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0048b/index.html

Чтобы подготовить вторичные ядра к приему IPIs, необходимо:

  • включите распределитель GIC (один раз, для всего система)
  • включить интерфейс процессора GIC (для каждого ядра)
  • включите IPI, которые вы хотите получить (для каждого ядра)
  • установите приоритеты для каждого IPI, который вы хотите получить (для каждого ядра)
  • Убедитесь, что Регистр маски приоритета прерывания интерфейса процессора (для каждого ядра) установлен на уровень приоритета ниже (большее число), чем приоритет прерывания, установленный выше.
  • очистить CPSR I-бит (для каждого ядра)

Если вы не собираетесь реализовывать прерывание обработчик, пропустите очистку I-бита. Ядро выйдет из WFI и продолжит выполнение. Это обычно то, что вы хотите для операции загрузки системы.