Я работаю над механизмом сохранения и восстановления контекста на 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");
}
Из описания в руководстве по архитектуре PendSV действительно предназначен для случаев, когда обработчик исключений с более высоким приоритетом говорит «о, поток, который я прервал, теперь должен будет сделать системный вызов в своем собственном контексте из-за этого» , Если вы просто хотите, чтобы поток выполнял синхронный системный вызов в процессе его нормального выполнения, это единственная цель svc
инструкция.
Других решений пока нет …