На самом деле, моя проблема была связана с версией Spring Tool Suite, которую я использовал. Оказывается, я обновил свою среду, используя сайт обновления, вместо загрузки новой версии. Я использовал Spring Tool Suite 4.7.3a вместо 4.8.0. Использование 4.8.0 разрешило проблему.
Нам повезло, что ваша предыдущая версия функции работала без сбоев.
Единственное, что может быть безопасно помещено в функцию naked
, это чистый базовый оператор Asm. https://gcc.gnu.org/onlinedocs/gcc/ARM-Function-Attributes.html . Вы можете разделить его на несколько операторов Basic Asm вместо asm("insn \n\t"
/ "insn2 \n\t"
/ ...);
, но вы должны написать всю функцию в asm самостоятельно.
Хотя использование расширенного asm или смеси базового кода asm и C может показаться работоспособным, от них нельзя полагаться, что они работают надежно, и они не поддерживаются.
blockquote>Если вы хотите запустить код C ++ из голой функции, вы можете
call
обычную функцию (илиbl
в ARM,jal
в MIPS и т. д.), следуя стандартному вызову конвенции.
Как по конкретной причине в этом случае? Может быть, создание этого адреса в регистре наступило на функцию args, что привело к неправильной ветке? Проверьте сгенерированный asm, если хотите, но он на 100% не поддерживается.
Или, может быть, он использовал больше регистров, и, поскольку он
naked
не сохранил должным образом / не восстановил регистры, сохраненные при вызове? Я сам не смотрел на генератор кода для поиска голых функций.Вы уверены, что эта функция должна быть
naked
? Я думаю, это потому, что вы манипулируетеlr
, чтобы вернуться в новый контекст.Если вы не хотите просто писать больше логики в asm, возможно, вам нужно, чтобы вызывающая функция выполняла больше работы (и, возможно, передавала ей указатель и / или логические аргументы, говоря ей более просто, что нужно сделать, чтобы ваши входные данные были уже есть в регистрах, и вам не нужен доступ к глобальным переменным).