2013-12-14 2 views
-1

Я пытаюсь создать простой проект для Cortex M3. Проблема, с которой я столкнулся, заключается в том, что компилятор содержит неправильные библиотеки для memset и других mem * -функций (memcpy, memcmp). И это приводит к жесткой ошибке каждый раз, когда выполнение подходит к memset(arr, 0x55, 10); в файле списка, оно написано как blx <memset>. Я использую компилятор arm-none-eabi-gcc. Я не использую arm-none-eabi-ld для соединения, но arm-none-eabi-gcc (4.8.2).Cortex M3 не может обрабатывать memset

Для GCC компилятора я использую эти флаги: -mthumb -mcpu=cortex-m3 -msoft-float -Os -gdwarf-2 -g3 -Wall -Wextra -Wimplicit-function-declaration -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes -Wundef -Wshadow -fno-common -ffunction-sections -fdata-sections

Для компоновщика сценария я использую эти флаги: -L$(TOOLCHAIN_DIR) -L$(LIBGCC) --static -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group -nostartfiles -Wl,--gc-sections -Wl,--allow-multiple-definition -mthumb -mcpu=cortex-m3 -msoft-float -Wl,--print-gc-sections -T$(LINKER_SCRIPT) где $ (LINKER_SCRIPT) мой собственный компоновщик скрипт $ (TOOLCHAIN_DIR) - путь к libc.a, libnosys.a библиотек $ (LIBGCC) - путь к библиотеке libgcc.a

рука-ни-EABI-GCC версии 4.8.2

Итак, мой вопрос: где может Возможная проблема? Почему memset и другие функции из string.h вообще не работают? Не могли бы вы рассказать мне, что я пропустил?

Специальный раздел для dwelch ТОЛЬКО: Я не могу предоставить вам этот код, потому что у меня нет такого набора инструментов больше. Понимаете, когда вы спросили меня об ассемблере, я уже перекомпилировал toolchain и получил тростник этой ошибки. Новая инструментальная цепочка создает очень отличный код asm, который работает. Вы хотели, чтобы я предоставил вам то, чего больше не существует. Это просто. Последнее, что я понял, это команда blx. Кроме того, есть много тем, где люди жаловались на функции mem *. В этих темах люди обычно забывали добавить флаг архитектуры в компоновщик

доверять мне, я просмотрел этот код в течение очень долгого времени, и я видел много примеров в сети. По существу, это выглядело так: 08004c10 blx <memset> /*here was an error*/ Прямо сейчас это выглядит !!! 08004a14 BL <memset> !!! И он работает без каких-либо исключений и жестких ошибок. Итак, перекомпиляция инструментальной цепочки была решением. В этой ситуации вы ошибаетесь, требуя кода, который больше не существует и пытается сказать, что я не понимаю проблемы.

Конец специальной секции #fordwelchonly

+1

Хм .. вы уверены, что имеете связь с правильным набором библиотек? Вы указываете -mumb для взаимодействия, но вызов blx,

+0

Да, Я уверен, я пытался с и без обоих - mumb и -mthumb-interwork. Результат все тот же. Да, я читал об этой проблеме, но кажется, что на данный момент решения нет. ошибка или я тоже виноват? – user1415536

+0

, пожалуйста, разместите демонтаж, показывающий проблему. –

ответ

0

Это не совсем ответ ... но все же. Мне пришлось перестроить инструментальную цепочку. Итак, теперь все выглядит так, как должно быть. Перед перекомпиляции ToolChain линию, которая сделала вызвать тяжелую ошибку выглядел как:

08004c10  blx  <memset> 

После перекомпиляции набора инструментов эта строка кода:

08004a14  bl  <memset> 

По-видимому, Набор инструментов был настроен и построен в неправильный путь.

Ближе всего к тому, что я только что сделал это сообщение: http://www.bengreen.eu/fancyhtml/techiestuff/createcrosscompiletoolchainforlpcmbed.html

Если кто-то имеет такую ​​же проблему, пожалуйста, проверьте ссылку я отправил выше.

Добавлено: Посмотрите на комментарий Мартина по этой теме. Мартин был прав насчет связанных библиотек.

Добавлено: Причина, по которой я не вижу ярлыка blx в моем коде, проста - Cortex M3 не имеет состояния руки. Игорь Скочинский указал на это. Cortex M3 работает только в больших и отладочных состояниях + реализует набор инструкций thumb2. Кроме того, в руководстве armv7m говорится, что он работает только в состояниях большого пальца. То есть у нас есть причина, почему это не сработало. Спасибо, Игорь и Мартин за помощь.