Если вы хотите длительная функция, которая будет ярлыком прерывания, и сделать это в чистой материи, действительно, есть только один способ вам нужно для создания чистого возврата в функции. Как вы скажете, что функция возврата может иметь прерывание, установите общий ресурс (например, переменную), и цикл цикла/функции может вернуться. Или вы можете опросить какой-то опрос в области переднего плана (например, булавка gpio, таймер и т. Д.).
Обычно то, что вы хотели бы сделать, это нечто иное. Вы разрешаете задачам переднего плана выполнять задачи с низким приоритетом, например, обновлять дисплей или обрабатывать ввод пользователя или что-то в этом роде, и вы не заставляете его преждевременно покидать функции, вместо этого в isr вы обрабатываете все, что нужно, приоритет.
Это или вы можете сделать мини-os, если хотите, и иметь разные потоки, прерывания, которые улавливают аппаратные события, которые необходимо обработать, оставить эту информацию и/или обменять потоки (сохранить копию всех регистров, используемых текущий исполняемый код, замените все регистры кодом обработчика и верните код обработчика). Если isr не меняет местами, тогда будет появляться периодический таймер, который увидит событие приоритета и свопинг, а затем периодический таймер будет заменяться, когда обработчик приоритета работает на холостом ходу. Или обработчик приоритета может вызывать функцию перед ее простоя, чтобы вернуть коммутатор обратно в поток переднего плана. Не сложный, более сложный, чем простой isrs, да, но все же не очень сложный.
Непонятно, почему вы хотите отказаться от рутины, в которой находитесь, и немедленно отбросить назад. Можете ли вы предоставить нам еще один контекст? Ваш собственный вариант 1 и 3 не был бы немедленным, но может работать для ваших нужд, в то время как варианты 2 и 4 являются немедленными, но кажутся хрупкими, как черт. – Ross