Я портирую ядро реального времени TNeoKernel на процессоры Cortex-Mx, оно работает при компиляции с ARMCC, но не работает при компиляции с GCC: сразу после вызова инструкции SVC
PC
обновляется до SVC_Handler
, а при следующей (любой) инструкции возникает исключение UsageFault.
Проверка CFSR
показывает, что бит INVSTATE
установлен: т. е. процессор находится в состоянии ARM, что недопустимо для процессоров Cortex-M. Я проверил xPSR
: да, бит T
сброшен.
Потом просмотрел таблицу Vector: да, по смещению 0x2c
у меня стоит адрес моего SVC_Handler
, но LSB очищается: 0x8013c40
. Так что неудивительно, что ЦП переведен в состояние ARM. Сюрприз в том, почему у меня очищен LSB?
Я перепроверил адрес SVC_Handler
при компиляции с помощью ARMCC, и да, там установлен LSB: фактический адрес SVC_Handler
равен 0x0800297a
, но таблица Vector содержит 0x0800297b
.
Итак, GCC генерирует неправильную таблицу векторов.
В настоящее время я использую CooCox IDE и arm-none-eabi-gcc
версии 4.8.4; параметры, которые предоставляются GCC:
-mthumb -mcpu=cortex-m4
Это кажется достаточно красивым, чтобы GCC знал, что процессор не поддерживает состояние ARM, так что это ошибка в GCC? Или я должен дать ему еще несколько ключей, чтобы он сгенерировал правильную таблицу векторов?
UPD: вот исходный файл tn_arch_cortex_m.S на битбакете. У меня есть директива .thumb
; обратите внимание, что этот файл предназначен для работы как с GCC, так и с ARMCC, поэтому для обоих инструментов есть несколько макросов.
SVC_Handler
. В частности, для этого вам понадобятся.thumb
и.thumb_func
. См.: последние версии U-boot и Thumb2. - person artless noise   schedule 17.11.2014.thumb
, но не использую.thumb_func
, дайте мне попробовать... - person Dmitry Frank   schedule 17.11.2014.thumb_func
делает свое дело! Святая корова, я потратил так много времени. Не могли бы вы немного научить меня gcc-fu: как вы так быстро нашли эту информацию? Я прочитал Полное руководство по ARM Cortex-M3/M4 (перед реализацией порта Cortex), много гуглил, прежде чем спросить, и не нашел. Теперь, когда я знаю оthumb_func
, я только что перепроверил последний pdf-файл с gcc.gnu.org/onlinedocs , про.thumb_func
ничего нет! Итак, как вы его нашли? - person Dmitry Frank   schedule 17.11.2014