2016-12-08 3 views
0

Я работаю над проектом с 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?

Спасибо и наилучшими пожеланиями,

Пьер

+1

Отключение Thumb interworking прервет вызов функции _every_ (инструменты не заставляют его просто для хихиканья). Это немного проблема XY, и у вас есть неправильный Y. Можете ли вы дать полный [mcve] фактического проблемного кода? – Notlikethat

+0

Спасибо @Notlikethat за ваш комментарий. Извините, что спросить, но почему бы отключить вызовы функций перехвата большого пальца? Другими словами, зачем нужны 'bx' /' blx'? Я попытаюсь привести такой пример из проекта, который довольно велик. –

+0

Я думаю, что ответил на мой вопрос из моего предыдущего комментария.Согласно информации ARM о 'bl' и' blx', только последний может использовать регистр в качестве операнда. Таким образом, я теперь понимаю, почему требуется «blx», и почему удаление большого пальца-перехвата приведет к поломке вызовов функций. –

ответ

1

@Notlikethat был прав, мой вопрос был чем-то вроде проблемы XY.

Моя проблема возникла из-за использования библиотек, построенных с помощью GCC, с CodeWarrior, настроенных на использование инструментальной привязки Freescale (инструменты ARM).

Указатель функции с LSB не был установлен набор из одной из этих библиотек и был оценен на этапе ссылки CodeWarrior. Поскольку компоновщик правильно помещает каждую функцию из этих библиотек на нечетные адреса, я догадался, что она должна пропустить некоторую информацию, чтобы обнаружить, что ошибочный указатель был фактически указателем функции.

Короче говоря, выяснилось, что библиотеки были лишены, особенно с флагом --strip-unneeded. Я удалил этот флаг, и компоновщик сделал отличную работу!

Смежные вопросы