Возникают ли исключения PendSV / SVC немедленно?

Я работаю над механизмом сохранения и восстановления контекста на Cortex-M4, чтобы я мог реализовать простую многозадачность. я использую arm-none-eabi-g++ для компиляции этого кода. Портативность на данный момент не является проблемой.

Я использую это для совместной многозадачности, когда задача может вызвать yield функция, которая заставит выполнение вернуться к ядру, подняв PendSV исключение. (Затем ядро ​​может запланировать выполнение другой задачи и в конечном итоге вернуться к текущей.)

void Task::yield() {
// ...
// ... (Context saving code goes here) ...
// ...

// Set the PENDSVSET to trigger a PendSV exception
SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
}

Я хотел бы, чтобы выполнение немедленно вернулось к ядру.

Вопрос после того, как я установил PENDSVSET немного в ICSRГарантируется ли выполнение PendSV_Handler немедленно или он продолжает выполнять инструкции после yield функционировать?

Буду ли я лучше использовать SVC инструкция для этого?

void Task::yield() {
// ...

// SVC has an 8-bit immediate constant argument, which
// can be used by the kernel for determining what kind
// of system call this is.
asm volatile("SVC 0");
}

0

Решение

Из описания в руководстве по архитектуре PendSV действительно предназначен для случаев, когда обработчик исключений с более высоким приоритетом говорит «о, поток, который я прервал, теперь должен будет сделать системный вызов в своем собственном контексте из-за этого» , Если вы просто хотите, чтобы поток выполнял синхронный системный вызов в процессе его нормального выполнения, это единственная цель svc инструкция.

3

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

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