Падение конца функции naked
на самом деле не является ошибкой. Предупреждение в этом случае было ошибкой G CC, которая была исправлена где-то до G CC 5.4. (Но code-gen тот же; более старые версии G CC, которые предупреждают, не нарушают ваш код.)
Написание функции naked
в C + дает лишь несколько незначительных преимуществ. asm:
- Если у вас есть код, который может компилироваться для любого режима, компилятор выдает директивы thumb vs. ARM. (Cortex-M0 предназначен только для большого пальца, поэтому в вашем случае никакой пользы.)
- информация об отладке, динамический c размер библиотечной функции и другие подобные метаданные.
- заставьте компилятор измените имя C ++ вместо того, чтобы объявлять его
extern "C"
, если вы писали C ++. - Вы можете поддерживать его рядом с некоторым фактическим кодом C, с которым он взаимодействует.
В противном случае вы могли бы просто написать отдельный файл asm. Он все еще не может быть встроен, как не naked
функция-оболочка вокруг GNU C Extended asm-оператора.
Я не эксперт по ARM, но в этом нет ничего плохого вы использовали встроенную функцию asm / naked
. Тело naked
в основном является единственным разумным вариантом использования для GNU C "Basi c" asm (без ограничений).
Если вы скомпилируете это с правильными параметрами G CC, G CC должен выдать те же директивы, которые вы использовали в резервном asm. (Хотя не .cantunwind
в случае, если это имеет значение.)
Из Godbolt , gcc5.4.1 -O2 -Wall -mcpu=cortex-m0 -mthumb -fverbose-asm
компилирует его чисто (без предупреждений). Это вывод asm с неотфильтрованными директивами, но некоторое ручное редактирование для удаления директив и меток, я думаю, просто беспорядок (включая информацию об отладке):
.syntax unified
.cpu cortex-m0
.fpu softvfp
.text
.global dummy
.code 16
.thumb_func
.type dummy, %function
dummy:
.syntax divided
push {r1-r7, lr}
MOV R0, R3
pop {r1-r7, pc}
.thumb
.syntax unified
.cfi_endproc
.size dummy, .-dummy
Поскольку вы используете процессор только для большого пальца, вы не требуется взаимодействие большого пальца через bx lr
, но, как указывает таймер @old: если вы можете оставить LR нетронутым во время выполнения функции, вы можете просто вернуться с bx lr
вместо того, чтобы вставлять его обратно в P C.
Также обратите внимание, что первый аргумент передается в R0, поэтому чтение R3 означает чтение регистра, который, по утверждению вашего прототипа, не является входом.
Перемещение это в автономный файл asm совершенно нормально, так же верно и, вероятно, лучший выбор. Но поскольку вы спросили, как это сделать с помощью функции naked
, это тоже должно работать.