Проблема при создании двоичного файла с помощью командного файла tiobj2bin в среде Code Composer Studio (CCS). Выводится сообщение об ошибке примерно такого вида:
...
Finished building: "HelloWorld.out"
"C:/ti/ccs1010/ccs/utils/tiobj2bin/tiobj2bin.bat" "HelloWorld.out" "HelloWorld.bin"
tiobj2bin.bat failed on ofd470
Please see http://processors.wiki.ti.com/index.php/Tiobj2bin_Failed
tiobj2bin.bat failed on hex470
Please see http://processors.wiki.ti.com/index.php/Tiobj2bin_Failed
mkhex4bin failure occurred. Giving up.
"C:\Users\derai\workspace_v10\HelloWorld\Debug\armofd" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
"mkhex4bin" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
**** Build Finished ****
Подобная проблема может возникать либо в среде Windows при запуске tiobj2bin.bat, либо в Linux при запуске аналогичного скрипта.
Некоторые автономно запускающиеся встраиваемые системы требуют, чтобы исполняемый код был запрограммирован в память flash. ПО, которое программирует flash, не могут записать исполняемый объектный файл (т. е. выходной файл с расширением .out в ELF-формате, предназначенный для отладки), генерируемый линкером. Вместо этого нужен простой двоичный файл. Утилита tiobj2bin преобразует исполняемый объектный файл в такой двоичный файл. Шаг post-build проекта CCS запускает tiobj2bin с необходимыми аргументами.
Подробности, как работает скрипт tiobj2bin, лучше всего прочитать в его комментариях. На данный момент достаточно знать о том, какие важные шаги в нем выполняются, и какие инструменты для этого используются:
OFD. Это сокращение от Object File Display, обозначает утилиту расшифровки объектного файла. Имя исполняемого файла armofd.exe, он находится в директории ccs\tools\compiler\ti-cgt-arm_20.2.1.LTS\bin каталога установки CCS.
HEX. Утилита преобразования HEX. Имя исполняемого файла armhex.exe, он также находится в директории ccs\tools\compiler\ti-cgt-arm_20.2.1.LTS\bin каталога установки CCS.
MKHEX. Утилита, автоматически генерирующая файл hex-команд. Имя исполняемого файла mkhex4bin.exe. Поставляется от Code Generation Tools XML Processing Scripts [2]. Находится в директории ccs\utils\tiobj2bin каталога установки CCS, в той же папке находится и файл tiobj2bin.bat.
Примечание: здесь пути указаны для платформы Windows, по умолчанию каталог установки CCS это c:\ti\ccs1010.
[Что может пойти не так]
Утилиты компилятора TI ARM поменяли имена своих исполняемых файлов начиная с релиза 5.0.0. Вместе с другими изменениями ofd470.exe поменялся на armofd.exe, и hex470.exe поменялся на armhex.exe. Рассмотрим, что произойдет, когда компилируется старый проект CCS, и у него настроен шаг post-build, использующий tiobj2bin. Этот шаг будет вызывать утилиты OFD и HEX по именам ofd470.exe и hex470.exe. К счастью, скрипт tiobj2bin автоматически может это определить, и поменять имя ofd470.exe на armofd.exe. То же самое делается и для hex470.exe и armhex.exe.
Если Вы увидели сообщение об ошибке, наподобие показанного выше, то система изменения имен вызова этих исполняемых утилит потерпела неудачу. Имя команды, показанное в диагностике, является исходной формой этой команды перед любым изменением. По неизвестным причинам могут быть не найдены ofd470.exe и/или armofd.exe. Если предоставлен полный путь до исполняемого файла утилит, то будет произведен поиск в этой директории. Если же не предоставлен полный путь, то для поиска используются системные пути поиска (на Windows это пути, прописанные в переменной окружения %PATH%).
Пример правильной настройки шагов post-build для генерации файла app, предназначенного для загрузки с карты с помощью загрузчика MLO:
Шаг 1, получение двоичного файла HelloWorld.bin:
"${CCE_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin.bat" "${BuildArtifactFileName}"
"${BuildArtifactFileBaseName}.bin" armofd.exe armhex.exe
"${CCE_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin.exe"
Шаг 2, добавление к файлу HelloWorld.bin заголовка:
Шаг 2, добавление к файлу HelloWorld.bin заголовка:
"c:\ti\AM335X_StarterWare_02_00_01_01\tools\ti_image\tiimage.exe"
0x80000000 NONE "${BuildArtifactFileBaseName}.bin" "${CWD}\app"
[Переход с компилятора TI ARM на компилятор GCC ARM]
Одна из причин ошибки: переход с компилятора TI ARM на компилятор GCC ARM. Например, проект CCS начинали разрабатывать с помощью компилятора TI ARM. Затем с какого-то момента перешли на компилятор GCC ARM. Это изменение могло быть применено к существующей конфигурации сборки, или путем добавления новой конфигурации сборки. Так или иначе, обновленная или новая конфигурация сборки наследует многие свойства первоначальной конфигурации сборки. Одно из этих свойств относится к armofd, это строка ${CG_TOOL_ROOT}/bin/armofd или что-то подобное. Когда меняется конфигурация сборки, переменная CG_TOOL_ROOT меняется с пути до компилятора TI на путь до компилятора GCC. В месте расположения компилятора GCC может не быть ни armofd, ни armhex. Так что смотрите сообщение диагностики об ошибке.
Одно из решений проблемы - поменять способ, как создается двоичный файл. Можно не использовать больше tiobj2bin, и вместо него использовать GCC objcopy. Удалите шаг post-build, и вместо него используйте GNU-утилиту objcopy для преобразования .out в двоичный файл.
[Ссылки]
1. Tiobj2bin Failed site:ti.com. 2. Code Generation Tools XML Processing Utilities site:ti.com. 3. AM335X StarterWare: загрузка и прошивка. |