GCC ARM Cortex-M3/M4: инструкция SVC переводит ЦП из состояния Thumb в состояние ARM из-за неправильного значения в таблице векторов

Я портирую ядро ​​реального времени 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, поэтому для обоих инструментов есть несколько макросов.


person Dmitry Frank    schedule 17.11.2014    source источник
comment
Это всегда полезно: >указать людям на источник. Я предполагаю, что GNU as (ассемблер) имеет разные псевдооперации, и они не установлены для SVC_Handler. В частности, для этого вам понадобятся .thumb и .thumb_func. См.: последние версии U-boot и Thumb2.   -  person artless noise    schedule 17.11.2014
comment
@artlessnoise Извините, что не упомянул источник; Я обновил свой вопрос. Я использую .thumb, но не использую .thumb_func, дайте мне попробовать...   -  person Dmitry Frank    schedule 17.11.2014
comment
@artlessnoise Большое спасибо, .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
comment
@artlessnoise, пожалуйста, напишите свой комментарий в качестве ответа, я приму его.   -  person Dmitry Frank    schedule 17.11.2014
comment
возможный дубликат смешивания инструкций ARM и THUMB, а также директивы GAS ARM.   -  person artless noise    schedule 17.11.2014
comment
Я проголосовал за ваш вопрос. Легко найти ответ, когда вы его знаете :) Однако я думаю, что связывать его как дубликат лучше для переполнения стека, чем отвечать на него за баллы.   -  person artless noise    schedule 17.11.2014