Цитата(Omnicake @ May 12 2014, 20:17)

Видимо действительно у меня нет понимания. Я решаю, извините за каламбур, задачу переключения задач в ассемблере. Для этого хотелось использовать прерывание от системного таймера, так как там вполне ясный и понятный режим срабатывания (время прошло - сработало прерывание - задача сменилась). Про PendSV мне удалось найти только информацию о том, что он пригодится при переключении задач. Но то как его вызывать, как он срабатывает и что делает - нет. Каким образом тогда построить стэк, чтобы при записи числа EXC он правильно подцеплялся?
Понимаю тягу к ассемблеру Cortex-M, но считаю, что это всего лишь инструмент.
Для переключения контекста не обязательно писать на Си или Асм - нужно разобраться в архитектуре.
SysTick это всего лишь таймер, одинаковый для всех производителей микроконтроллеров на ядре Cortex-M.
Для переключения задач Вам нужно либо в задаче вызавать системную функцию, в которой произойдет переключение.
Либо переключить задачу по прерыванию. В том числе от таймера. В том числе от таймера SysTick.
Можно переключать задачи в SysTick, но в случае, если SysTick у Вас с самым низким приоритетом - это гарантирует, что Вы точно знаете положение
стекового кадра main. Можно использовать два стека, что в какой-то степени решит проблему вложенных прерываний. Но когда Вы сделаете такой
переключатель задач по таймеру, вряд ли легко сможете переключать задачи где-либо еще. Задачи в некоторый случаях (где есть ассинхронная пауза)
будут "тупить" до момента сработки таймера SysTick.
Если в конце SysTick взводить PendSv (ровно как и в функциях ядра), то переключение будет:
- гарантированно происходить после каждого срабатывания SysTick;
- в функциях ядра;
- гарантированно происходить до момента передачи управления в main.
Идеально. Что при таком подходе Вам не нравится? На Асме красиво реализуется.