Цитата(jcxz @ Mar 31 2016, 09:39)

Вызов функции подменой стека не делается. Вызов функции подразумевает возврат. Там вероятно у Вас идёт переключение задач пользовательского уровня по запросу из ISR.
Вероятно там уже есть какая-то ОС. Может быть самописная.
Отчасти Вы правы. То что там происходит, действительно можно назвать переключением задач. Я просто не хотел подробно расписывать.
В общем, есть две "задачи" - ядро и пользовательская. Ядро запускается, настраивает железо и передает управление в main() пользовательской. Там выполняются определенные действия (инициализация/настройка), затем через SVI выполняется подключение к USB (обработчики SVI находятся в коде ядра). После этого пользовательский main() зацикливается по while(1) и все замирает в ожидании прерывания от USB.
В случае прерывания bulk in/out MSC-класса происходит общение с NAND (все это делается прямо в обработчике).
В случае прерывания bulk in/out Custom-класса происходит уже описанное переключение стека и возврат из прерывания происходит в обработчик ядра, который крутится в бесконечном цикле. Он проверяет флаги (которые ставятся в обработчике прерывания USB), если хоть один установлен - ставит соответствующий флаг в пространстве пользовательского кода и вызывает оттуда функцию-обработчик. Тот просматривает все флаги и выполняет соответствующие действия. Затем управление возвращается в обработчик ядра.
То есть "переключение" осуществляется только один раз - по первому USB-прерыванию.