Боюсь, этот шаблон дизайна в корне ошибочен.
При первом событии SysTick task1()
будет вызываться из обработчика PendSV , который, следовательно, не вернется , Дальнейшие события SysTick прервут обработчик PendSV и снова установят бит PendSV, но если запущенное задание не завершится и обработчику PendSV не будет разрешено вернуться, оно не может быть вызвано снова.
Хорошая новость заключается в том, что Правильное переключение контекста на M3 - это лишь небольшое количество ассемблера - возможно, 10 строк Вам также необходимо выполнить некоторую настройку, чтобы код пользовательского режима использовал указатель стека процессов и т. Д., И вам нужно настроить стек для каждой задачи, но на самом деле это еще не все.
Если вы если вы хотите отменить запущенную задачу, когда прибывает SysTick, и запустить другую, все они могут использовать один и тот же стек; но было бы намного проще, если бы это был стек процессов, чтобы его указатель стека мог быть сброшен изнутри PendSV, не влияя на возврат из режима обработчика. Вам также нужно будет сделать несколько стеков, чтобы убедить PendSV «вернуться» к началу следующей задачи, которую вы хотели запустить.