В настоящее время я работаю над кортексом руки m4. Я реализовал простое переключение контекста, вызвав PendSV (который выполняет переключение) из прерывания SysTick. Я пытался реализовать функцию void delay(int ms)
через SVC. Это должно работать так:
- Триггер SVC
- Функция Delay записывает задержку в task_info
- Планировщик уменьшает задержку в task_info при следующем повороте задач и пропускает задачу.
- Когда задержка равна 0, задание снова назначается нормально
Проблема в том, что я хотел бы вызвать переключение контекста после того, как функция задержки записала соответствующее значение в task_info. В противном случае задержка будет действовать только после следующего переключения контекста. Я пытался вызвать PendSV от прерывания SVC. К сожалению, это, похоже, не работает.
С моей прежней реализацией функции задержки я обнаружил ошибки использования памяти, когда более чем одна задача вызывала функцию одновременно.
В связи с тем, что текущая идея более точна во времени, я бы хотел, чтобы она сработала. Помощь очень ценится.
PS: просто для ясности, значение задержки в int ms
умножается на коэффициент, полученный из тактовой частоты и частоты SysTick.