Я работаю над проектом с CodeWarrior для MCU v10.6 IDE
. Это IDE на основе Eclipse от NXP. Проект нацелен на K21 SoC от NXP (точно MK21FN1M0M12
, который встраивает cortex-m4
, armv7-m
). CodeWarrior настроен на использование инструментальной привязки ARM.Может ли перехват большого пальца быть деактивирован на CW 10.6 с помощью инструментария ARM?
Я столкнулся с крахом, связанным с большим пальцем. Эта функция включена с помощью IDE и не может быть отключена.
Поскольку armv7-m
поддерживает только большой палец2, использование большого пальца не имеет смысла в первую очередь. Но я, наверное, что-то пропустил. Весь код правильно сгенерирован в инструкциях с большим пальцем.
У меня возникает проблема при вызове косвенной функции через указатель. Код функции получает нечетный адрес на этапе ссылки, который в порядке (это указывает, что это код большого пальца). Однако при вызове его через указатель генерируется команда BLX (я полагаю, что компоновщик обновляет исходный BL в BLX здесь) И значение функции указателя остается четным! Поскольку значение указателя равно, скачок указывает ядру переключиться в режим ARM. Отсюда крушение.
Я думаю, что компоновщик обновляет BL до BLX из-за активизации функции перехвата большого пальца. На CodeWarrior для MCU v10.6
это принудительно, я не могу отключить его. Мне сказали, что это «требуется для процессора» инструментом и не может щелкнуть соответствующий флажок (Properties->C/C++ Build->Settings
, ARM CPU. Процессор установлен на "cortex-m4"
).
Я не понимаю, почему, так как это armv7-m
. Более того, это, похоже, приводит меня в беду. Я думаю, что здесь что-то не хватает.
Не могли бы вы помочь мне понять, что происходит, и/или сообщить мне, есть ли способ отключить взаимодействие пальцев с CodeWarrior?
Спасибо и наилучшими пожеланиями,
Пьер
Отключение Thumb interworking прервет вызов функции _every_ (инструменты не заставляют его просто для хихиканья). Это немного проблема XY, и у вас есть неправильный Y. Можете ли вы дать полный [mcve] фактического проблемного кода? – Notlikethat
Спасибо @Notlikethat за ваш комментарий. Извините, что спросить, но почему бы отключить вызовы функций перехвата большого пальца? Другими словами, зачем нужны 'bx' /' blx'? Я попытаюсь привести такой пример из проекта, который довольно велик. –
Я думаю, что ответил на мой вопрос из моего предыдущего комментария.Согласно информации ARM о 'bl' и' blx', только последний может использовать регистр в качестве операнда. Таким образом, я теперь понимаю, почему требуется «blx», и почему удаление большого пальца-перехвата приведет к поломке вызовов функций. –