(2012-06-14 14:27:47 отредактировано Neekeetos)

Guardant Code, map_parse и флажки оптимизации

Наткнулся на интересную проблему (номер 1) при сборке функций для ключа. Похоже что неверно формируется файл bmap, предлагаемый в сдк мэйкфайл зачем то одновременно собирает две версии кода, при этом неверно определяя присутствие среды winarm, получается что версия для старых ключей оказывается (на моем компьютере с установленным mingw,  ) собраной под х86, я бы с этим смирился, но оказывается мейкфайл явно по ошибке использует эту версию для создания bmap файла для ключа, вот строки из него

    @if [ -e ".obj/1" ]; then $(MAP2BIN) .out/$(TARGET)1.map .out/$(TARGET)1.bin
.out/$(TARGET)1.bmap ; fi;
    @if [ -e ".obj/2" ]; then $(MAP2BIN) .out/$(TARGET)1.map .out/$(TARGET)2.bin .out/$(TARGET)2.bmap ; fi;

видно что версия 2( для ключа 2 поколения) использует мап файл от первой версии! Далее оказывается что этот некорректно созданный бмап файл работает, если же сделать его корректно, программа работы с ключами отказывается его загружать. 

Проблема номер два , опять же связанная с map_parse.exe,  если указать флажки оптимизации

CFLAGS += -ffunction-sections -fdata-sections
и для линкера флаг
LDFLAGS  +=,--gc-sections

,то программа загружается в ключ но ведет себя непредсказуемо и вызывает сбой, та же программа собранная без вышеуказанных ключей работает без ошибок. Я предполагаю, что такое поведение связано с некорректной работой утилиты map_parse и соотв некорректным файлом bmap.

Подскажите пожалуйста как решить данные проблемы. Также хотелось бы узнать где можно найти описание файла bmap и утилиты map_parse, а также как проверить корректность ее работы.

Вот картинка, слева рабочий бмап файл созданый исходной версией мейкфайла, справа бмап созданый с использованием родного мап файла и соотв исправленый мейкфайл:
http://neekeetos.narod.ru/bmap_sample.png

Re: Guardant Code, map_parse и флажки оптимизации

В общем с молчаливого согласия поддержки отвечаю сам на свои вопросы

Пункт 1.  Оказывается утилита работы с образами ключей считает что адрес озу всегда начинается с 0x40003000 а не с 0x10003000 как в новых ключах. Утилитка map_parse ищет в файле мап строчку следующего вида:
RAM              0x40003000         0x00004fe0         rw
и выдирает оттуда адрес начала ОЗУ, при этом если мап сделан для кода нового ключа, то адрес неверный. Выходов тут может быть два, либо заменить число 01 по смещению 0х13 в свежесозданном бмап файле, либо (как я сделал) можно перед этапом создания бмап файла в мэйкфайле добавить нечто меняющее адрес в мап файле на "корректный",

ищется такой участок:

postbuild:
    @echo
    @if [ -e ".obj/1" ]; then $(OBJDUMP1) -xD .out/$(TARGET)1.ELF > .out/$(TARGET)1.asm ; fi;
    @if [ -e ".obj/2" ]; then $(OBJDUMP2) -xD .out/$(TARGET)2.ELF --disassembler-options=force-thumb > .out/$(TARGET)2.asm ; fi;
    @if [ -e ".obj/1" ]; then $(MAP2BIN) .out/$(TARGET)1.map .out/$(TARGET)1.bin .out/$(TARGET)1.bmap ; fi;
    @if [ -e ".obj/2" ]; then $(MAP2BIN) .out/$(TARGET)1.map .out/$(TARGET)2.bin .out/$(TARGET)2.bmap ; fi;

и заменяется на нечто вроде

postbuild:
    @echo
    @if [ -e ".obj/1" ]; then $(OBJDUMP1) -xD .out/$(TARGET)1.ELF > .out/$(TARGET)1.asm ; fi;
    @if [ -e ".obj/2" ]; then $(OBJDUMP2) -xD .out/$(TARGET)2.ELF --disassembler-options=force-thumb > .out/$(TARGET)2.asm ; fi;
    @if [ -e ".obj/1" ]; then $(MAP2BIN) .out/$(TARGET)1.map .out/$(TARGET)1.bin .out/$(TARGET)1.bmap ; fi;

    perl -ig -ne "s/0x10003000/0x40003000/;print $_;" .out/$(TARGET)2.map

    @if [ -e ".obj/2" ]; then $(MAP2BIN) .out/$(TARGET)2.map .out/$(TARGET)2.bin .out/$(TARGET)2.bmap ; fi;


Проблемс номер2 с некорректной работой ключей оптимизации, дело в том что ключи -ffunction-sections -fdata-sections вызывают создание большого количества секций вида например  .text.чтототам , а скрипт линкера их не учитывает, тем не менее можно все исправить следующим образом , редактируется файл rom2.ld , в нем меняется

         *(.text)                            /* remaining code */
на
         *(.text .text.*)                            /* remaining code */

         *(.data)
на
         *(.text .text.*)                            /* remaining code */

         *(.bss)
на
         *(.bss .bss.*)

Могут быть еще какие то секции, которые я не учел, но этих обычно достаточно

Neekeetos пишет:

Наткнулся на интересную проблему

Я ошибался, это скучно. Оказалось, что феерическая сборка в предлагаемой сдк сразу двух версий бинарников это фича чтобы обойти кривизну утилиты map_parse и прочих для работы с ключом,  решение достойное студента-первокурсника :)

Re: Guardant Code, map_parse и флажки оптимизации

И я столкнулся с тем же.
Строчка мейкфала
@if [ -e ".obj/2" ]; then $(MAP2BIN) .out/$(TARGET)1.map .out/$(TARGET)2.bin .out/$(TARGET)2.bmap ; fi;
вываливается с ошибкой.

Что за ерунда, даже примеры не работают. Вместо того, чтоб писать свою программу, я должен разбираться, почему проекты ключа не компилируются.

Re: Guardant Code, map_parse и флажки оптимизации

Jeevoy пишет:

Что за ерунда, даже примеры не работают. Вместо того, чтоб писать свою программу, я должен разбираться, почему проекты ключа не компилируются.

Вообще то говоря разработчики не предлагали собирать код для ключа под линуксом. Это видно из их игрушечного мейкфайла, жестко привязанного к двум сдк под виндовс.
А ифы все ненужные, я их поудалял, как и создание шаблона :)

Что меня во всем этом убивает так это великая тормознутость апи, тоесть ключ допустим выполняет код очень быстро, но чтобы сделать обращение к нему тратится 20+мс и на передачу каждого килобайта еще 70мс, это очень много. Из за этой штуки в итоге пришлось сделать кеш запросов, который объединяет отдельные запросы в блоки и передает на ключ. Вот это действительно настоящая подстава со стороны разработчиков получается, ведь они сами с одной стороны говорят - делайте как можно больше запросов к ключу, а с другой это их как можно больше практически является таким мизером, что не с чем работать и еще сверх этого - затормаживает основную программу.

Re: Guardant Code, map_parse и флажки оптимизации

Здравствуйте,

Во-первых хочу заверить Вас, что все сообщения о возможных ошибках makefile и сопутствующих утилит переданы соответствующим разработчикам. Мы обязательно разберемся со всеми проблемами, тем не менее хочу заверить Вас что в стандартной ситуации все наши примеры и makefile отрабатывают "на ура". Возможно обновились сборки тулчейнов, или возникла путаница в поколениях ключей или какой то неосознанный конфликт.

Во-вторых, мы вполне осознанно создали некоторую путаницу с адресами RAM в старых и новых ключах. Физически там адреса разные, но makefile должен скрывать эту разницу дабы не создавать лишних сложностей для GrdUtil и версий масок. Если вы работаете только со вторым поколением ключей и используете только yagarto то проблем возникать вообще не должно.

В-третьих, как справедливо было отмечено, сборку кода под Linux мы не обещали.

И главное, по поводу скорости ключей: я вас уверяю, мы со своей стороны делаем все возможное для ускорения так называемых накладных расходов. При этом мы должны сохранить защищенность протокола обмена - на текущий момент он шифруется на сеансовых ключах между микропрограммой ключа и Guardant API. К сожалению у протокола обмена USB есть ограничения не позволяющие слать пакеты чаще чем 1 раз в миллисекунду, и несмотря на то, что в ключах Guardant Code используются самые мощные в нашей линейке ARM-процессоры 20 секунд является технологическим ограничением.

В настоящий момент мы тестируем прототип ключа Code без шифрованного протокола обмена - в нем накладные расходы на вызов могут быть гораздо меньше (хотя из за особенностей USB-протокола все же меряются в миллисекундах), но при этом повышается ответственность разработчика по переносу кода в ключ (т.к. появляется уязвимое место в виде нешифрованного протокола). Если мы признаем данный проект разумным по соотношению защищенность/производительность, такие ключи могут поступить в продажу в не столь отдаленном будущем.

А умело обойти ограничения железа (пресловутые 20 мс) и при этом достичь высокой взломостойкости - это и есть мастерство разработчика защиты.

Re: Guardant Code, map_parse и флажки оптимизации

AndreyStepin пишет:

Во-первых хочу заверить Вас, что все сообщения о возможных ошибках makefile и сопутствующих утилит переданы соответствующим разработчикам. Мы обязательно разберемся со всеми проблемами, тем не менее хочу заверить Вас что в стандартной ситуации все наши примеры и makefile отрабатывают "на ура". Возможно обновились сборки тулчейнов, или возникла путаница в поколениях ключей или какой то неосознанный конфликт.

Или возможно никто не проверял даже изредка как работает то, что лежит в сдк, что, опять же, возможно, является вещью которую можно внести в расписание и проверять хотябы с выпуском каждой новой версии сдк. Было бы меньше недопонимания.

AndreyStepin пишет:

Во-вторых, мы вполне осознанно создали некоторую путаницу с адресами RAM в старых и новых ключах. Физически там адреса разные, но makefile должен скрывать эту разницу дабы не создавать лишних сложностей для GrdUtil и версий масок. Если вы работаете только со вторым поколением ключей и используете только yagarto то проблем возникать вообще не должно.

Я вас уверяю , все проблемы которые я нашел были связаны с использованием чисто yagarto без каких либо других установленых сред.

AndreyStepin пишет:

В-третьих, как справедливо было отмечено, сборку кода под Linux мы не обещали.

Но у вас спросили а вы поддержка, по большому счету то вы вообще ничего не обещали, даже работоспособность ключей, что теперь можно ничего не делать?

AndreyStepin пишет:

И главное, по поводу скорости ключей: я вас уверяю, мы со своей стороны делаем все возможное для ускорения так называемых накладных расходов. При этом мы должны сохранить защищенность протокола обмена - на текущий момент он шифруется на сеансовых ключах между микропрограммой ключа и Guardant API. К сожалению у протокола обмена USB есть ограничения не позволяющие слать пакеты чаще чем 1 раз в миллисекунду, и несмотря на то, что в ключах Guardant Code используются самые мощные в нашей линейке ARM-процессоры 20 секунд является технологическим ограничением.

Я измерял времена работы SSL на ключе, и получилось парадоксальное соотношение,
допустим ключ без кода вообще тратит на передачу килобайта (на ключ и обратно)  60милисекунд, если работает ssl c AES-CBC/HMAC-SHA256  то это время увеличивается на 2 милисекунды, странно да?

AndreyStepin пишет:

В настоящий момент мы тестируем прототип ключа Code без шифрованного протокола обмена - в нем накладные расходы на вызов могут быть гораздо меньше (хотя из за особенностей USB-протокола все же меряются в миллисекундах), но при этом повышается ответственность разработчика по переносу кода в ключ (т.к. появляется уязвимое место в виде нешифрованного протокола).

Вот это отличная новость, думаю ключам Code именно этого и не хватает. В свою очередь могу описать несколько криптографических примитивов и безопасных протоколов, с тем чтобы разработчики не начинали на ровном месте.

AndreyStepin пишет:

Если мы признаем данный проект разумным по соотношению защищенность/производительность, такие ключи могут поступить в продажу в не столь отдаленном будущем.

Мне кажется он будет разумным,  поскольку сам микроконтроллер быстрый, и позволяет пропускать через ключ кучу данных, для защиты это плюс.

AndreyStepin пишет:

А умело обойти ограничения железа (пресловутые 20 мс) и при этом достичь высокой взломостойкости - это и есть мастерство разработчика защиты.

Я согласен, можно обходить препятствия, но ведь многие из них могли бы не существовать и тогда не пришлось бы "умело обходить", кроме того там не 20мс, 20 это для пустого запроса без передачи данных, более близкая к реальности цифра - порядка 100мс или 10 запросов в секунду для вызова кода, или порядка 40мс для вызова встроеных алгоритмов.

Re: Guardant Code, map_parse и флажки оптимизации

Не, про линукс уже речи не идет - и так все ясно. Идет речь про то, что утилита map_parse несовместимма с текущим тулчейном.

Re: Guardant Code, map_parse и флажки оптимизации

Neekeetos пишет:

внести в расписание и проверять хотябы с выпуском каждой новой версии сдк. Было бы меньше недопонимания.

+1

Neekeetos пишет:

Вот это отличная новость, думаю ключам Code именно этого и не хватает. В свою очередь могу описать несколько криптографических примитивов и безопасных протоколов, с тем чтобы разработчики не начинали на ровном месте.

ещё раз +1

Пейте сладкий чай!

(2012-06-25 13:12:43 отредактировано Jeevoy)

Re: Guardant Code, map_parse и флажки оптимизации

Ну так что? Ответы то будут? Проекты стоят. Если программимты не помнимают, что текущая версия утилиты map_parse несовместимма с текущим тулчейном - можно доказать это через суд.
Выложите на сайте версию тулчейна, которая совместима с вашим ПО.

Re: Guardant Code, map_parse и флажки оптимизации

Здравствуйте, Jeevoy,

По представленной Вами информации я не могу понять в чем ошибка.

Только что проделал следующее:
1) На чистый компьютер с Win7 Pro установил Guardant SDK 6.1 - с сайта скачал для чистоты эксперимента
2) Установил последние версии YAGARTO Tools и YAGARTO GNU Toolchain с сайта http://www.yagarto.de/#download
3) Открыл наш самый наглядный пример C:\Program Files (x86)\Guardant\Guardant 6.1\DEMONVK\Samples\ARM\05 - LED Control\Loadable Code
Здесь загружаемый код заставляет ключ моргать с определенной периодичностью. Очень просто отследить работоспособность
4) Запустил команду make template, затем make all. Скомпилировалась пара файлов bin/bmap
5) Загрузил bin в ключ, маска по умолчанию.
6) Все работает, при вызове GrdCodeRun ключ моргает, никаких ошибок на всем пути.

Но ключ Code и вся инфраструктура GCC весьма сложные вещи, там все может слетать из за какого нибудь пробела в пути к файлу или подобной мелочи. Поэтому для локализации конкретно вашей ошибки нужно больше информации:
- версия SDK
- в какие папки на диске установлен SDK, Yagarto toolchain, Yagarto tools
- откуда и как запускаете make
- файл makefile
- полный вывод с команд make template и make all

Я сожалею что мы не ответили ранее, т.к. просто не заметили вопроса. Кривая освоения для Code в любом случае существует, ошибки неизбежны.

В итоге: map_parse отлично совместим с тулчейном, но небольшие правки makefile в зависимости от вашей инфраструктуры разработки это вполне нормальная вещь. Пишите подробности на hotline, разберемся.

Re: Guardant Code, map_parse и флажки оптимизации

Сейчас попробую проверить  - установить ваше ПО не по дефолтному пути.
Если ничего не указывать, то стоять оно будет в папке C:\Program Files\Guardant\Guardant 6.1\ИМЯ_КОНТРАКТА\
А значит пробелов по-минимуму два.

Yagarto про дефолту не ставится в ПФ, поэтому стоит на С в корне. Пробелов там нет.

Re: Guardant Code, map_parse и флажки оптимизации

Jeevoy пишет:

Сейчас попробую проверить  - установить ваше ПО не по дефолтному пути.
Если ничего не указывать, то стоять оно будет в папке C:\Program Files\Guardant\Guardant 6.1\ИМЯ_КОНТРАКТА\
А значит пробелов по-минимуму два.

Yagarto про дефолту не ставится в ПФ, поэтому стоит на С в корне. Пробелов там нет.

Касательно пути установки Guardant - ограничений нет для примеров, если вы makefile не трогаете. Там пути указаны в относительном виде. YAGARTO должен быть по пути без пробелов.

Я установил наш SDK в папку по умолчанию...

Re: Guardant Code, map_parse и флажки оптимизации

В общем, как человек ответственный я подытожу результат данного обсуждения:

1. Ссылка в документации на конкретную сборку YAGARTO дана некорректная, тем не менее последняя сборка с YAGARTO.DE отлично работает. Ссылки мы уберем, оставим только общую информацию.

Дополнительно, будем выкладывать рабочие сборки YAGARTO на нашем сайте вместе с SDK и записывать на диск в комплекте разработчика.

2. При установке нашего SDK по умолчанию и YAGARTO по рекомендованным в документации путям ВСЕ ПРИМЕРЫ КОМПИЛИРУЮТСЯ ИЗ КОРОБКИ, без правки makefile. Утверждать обратное некорректно.

3. Да, при переходе на новые ключи мы "подогнали" адреса RAM чтоб не путать клиентов и не вносить ненужные правки в GrdUtil (пришлось бы поддерживать две версии не только кода, но и дескриптора алгоритма в маске, что было неудобно нашим старым клиентам). Мы считаем что так банально удобнее. Жаль, если это производит впечатление работы школьника - это тем не менее работает.

4. Если в makefile использовать не относительные пути, а абсолютные, с пробелами, то их надо брать в кавычки! Например так:
CFG_SYS_DIR             = "C:\Program Files (x86)\Guardant\Guardant 6.1\DEMONVK\Bin"

5. Средства разработки пока только под Windows. Про Linux мы задумаемся при наличии соответствующего спроса :-).

Я благодарю участников Neekeetos и Jeevoy за обратную связь по продукту. Мы примем все это к сведению и попробуем упросить осовение продукта для новых клиентов и поправить непонятные моменты. Code является нашим самым сложным продуктом и самым продвинутым аппаратно - так что всегда приятно пообщаться с продвинутыми разработчиками.

Re: Guardant Code, map_parse и флажки оптимизации

AndreyStepin пишет:

Дополнительно, будем выкладывать рабочие сборки YAGARTO на нашем сайте вместе с SDK и записывать на диск в комплекте разработчика.

Не смог найти рабочие сборки на вашем сайте и на своём CD диске (полученном от вас в декабре 2012 г.) тоже. А это необходимо, т.к. с сайта http://www.yagarto.org/ их уже не скачать. Проект перешёл на SourceForge, но yagarto-tools там нет.


AndreyStepin пишет:

При установке нашего SDK по умолчанию и YAGARTO по рекомендованным в документации путям ВСЕ ПРИМЕРЫ КОМПИЛИРУЮТСЯ ИЗ КОРОБКИ, без правки makefile. Утверждать обратное некорректно.

Нашёл в интернете ‘yagarto-tools-20121018-setup.exe’ и ‘yagarto-bu-2.22_gcc-4.7.2-c-c++_nl-1.20.0_gdb-7.5_eabi_20121013.exe’, установил их в ‘c:\YAGARTO\’. SDK установлено в директорию по умолчанию ‘c:\Program Files (x86)\Guardant\SDK 6.3\’. И ваши примеры загружаемого кода из SDK не компилируются.

На Windows 8.1 Pro x64 я получаю:

c:\Program Files (x86)\Guardant\SDK 6.3\XXX\Samples\ARM\00 - Template\Loadable Code>make all
-------- begin --------
--Check WinARM--
      0 [main] sh 5992 sync_with_child: child 8340(0x16C) died before initialization with status code 0xC0000142
    660 [main] sh 5992 sync_with_child: *** child state waiting for longjmp
/usr/bin/sh: fork: Resource temporarily unavailable
make: *** [prebuild] Error 128

На Windows XP SP3 x32 (всё установлено по тем же путям: ‘c:\YAGARTO\’ и ‘c:\Program Files\Guardant\SDK 6.3\’) получаю, как в теме https://forum.guardant.ru/post/1020/:

c:\Program Files\Guardant\SDK 6.3\XXX\Samples\ARM\00 - Template\Loadable Code>make all
-------- begin --------
--Check WinARM--
/usr/bin/sh: arm-elf-gcc: command not found
--Check Yagarto--
arm-none-eabi-gcc.exe: fatal error: no input files
compilation terminated.
Compiling: main.o main.c
arm-none-eabi-gcc.exe: fatal error: no input files
compilation terminated.
make: *** [main.o] Error 1

Make.exe точно вызывается из ‘c:\YAGARTO\bin\make.exe’, проверял, подставлял полный путь, в обоих случаях результат тот же.

В чём может быть беда? Проверьте сами, работает ли это сейчас. Обращаюсь к разработчикам, только не тяните, ответьте, как можно быстрее. Уже почти 3 недели ковыряю защиту и большую часть времени по вине ошибок в ваших утилитах и описании к ним.

(2013-11-23 18:51:48 отредактировано Phaza7)

Re: Guardant Code, map_parse и флажки оптимизации

Разобрался со своей проблемой, примеры стали компилироваться и в WinXP x32 и в Win8.1 x64.

Как оказалось, разработчики были не при чём, makefile отрабатывают хорошо. Единственная вина разработчиков в том, что они оставляют нас один на один с проблемой отсутствия yagarto-tools. На указываемом в документации сайте его уже нет. Мне кажется, было бы правильно выкладывать на сайте в разделе загрузок как инсталлятор библиотек и компиляторов (yagarto), так и инсталлятор инструментальных утилит (yagarto-tools), с которыми примеры бы компилировались, а так же, как уже предлагалось, проверять их при выходе каждой новой версии комплекта разработчика. Не помню есть ли это в документации, но там должно быть обязательное указание на то, что эти оба инструментария должны устанавливаться в разные директории, не содержащие пробелов, например, c:\yagarto\ и c:\yagarto-tools\). Как раз установка в разные папки вылечило мою проблему в WinXP (странно, но заработало).

Проблема в Win8.1 x64 вылечилась пересборкой yagarto-tools. Опишу вкратце, что я сделал, может быть, кому пригодится. Я заменил все *.exe файлы, а так же msys-1.0.dll в папке c:\yagarto-tools\bin\ на их новые версии из http://www.mingw.org. Установил с сайта, скачал c помощью него нужные пакеты и вручную заменил файлы. Библиотеки libiconv2.dll и libintl3.dll можно удалить, они уже не нужны. Вместо них необходимо добавить все dll, на которые ссылаются *.exe и msys-1.0.dll. Для поиска недостающих dll файлов можно использовать http://www.dependencywalker.com. У меня получилось: msys-iconv-2.dll, msys-intl-8.dll, msys-regex-1.dll и msys-termcap-0.dll.

Re: Guardant Code, map_parse и флажки оптимизации

Спасибо Вам за мощную обратную связь.
Действительно, в связи с окончанием поддержки проекта Yagarto мы и наши клиенты (особенно новые) столкнулись с некоторыми сложностями. Мы решаем вопрос комплексно, дабы в ближайшем будущем сделать использование ключей Code как можно более удобным и простым прямо "из коробки".

Информация в данной ветке, особенно найденная Phaza7 нам очень поможет в этом деле.

Мы постараемся придумать, как отблагодарить Вас за помощь и такое глубокое вникание в наши технологии (особенно учитывая что в данном случае оно далеко от беспроблемного).

Re: Guardant Code, map_parse и флажки оптимизации

AndreyStepin пишет:

Спасибо Вам за мощную обратную связь.

Ну вот вам ещё хинт.

@set PATH="C:\yagarto-20121222\bin;C:\yagarto-tools-20121018\bin"
@C:\yagarto-tools-20121018\bin\make.exe %1 %2 %3

В итоге получаем

C:\Program Files\Guardant\Guardant 6.1\5EC003K\Samples\ARM\01 - General Sample\Loadable Code>C:\yagarto-tools-20121018\bin\make.exe
Режим вывода команд на экран (ECHO) отключен.
-------- begin --------
Непредвиденное появление: fname.
make: *** [prebuild] Error 255

Путем экспериментов выясняется, что команды отдавались CMD.exe вместо SH.exe. А причина простая - не надо было кавычки в PATH ставить. Не понимает их MAKE. И SHELL не понимает. И MAKESHELL не понимает.

3 дня коту под хвост :-(

Re: Guardant Code, map_parse и флажки оптимизации

Jef239 пишет:

Путем экспериментов выясняется, что команды отдавались CMD.exe вместо SH.exe. А причина простая - не надо было кавычки в PATH ставить. Не понимает их MAKE. И SHELL не понимает. И MAKESHELL не понимает.
3 дня коту под хвост :-(

Спасибо за обратную связь.

(2014-05-15 09:09:24 отредактировано Jef239)

Re: Guardant Code, map_parse и флажки оптимизации

Антон Тихиенко пишет:

Спасибо за обратную связь.

Ну вот вам ещё. Исправлено две проблемы:
1) Сообщение "cc1plus.exe: warning: command line option '-Wimplicit' is valid for C/ObjC but not for C++ [enabled by default]" при компиляции исходников на C++
2) Проблемы с компиляцией исходников, расположенных в нескольких каталогах.

Сравнение файлов Makefile.code и C:\PROGRAM FILES\GUARDANT\GUARDANT 6.1\5EC003K\SAMPLES\ARM\00 - TEMPLATE\LOADABLE CODE\MAKEFILE
***** Makefile.code
#JEF CFLAGS += -Wall -Wcast-align -Wcast-qual -Wimplicit 
CFLAGS += -Wall -Wcast-align -Wcast-qual
***** C:\PROGRAM FILES\GUARDANT\GUARDANT 6.1\5EC003K\SAMPLES\ARM\00 - TEMPLATE\LOADABLE CODE\MAKEFILE
CFLAGS += -Wall -Wcast-align -Wcast-qual -Wimplicit 
*****

***** Makefile.code
#JEF CONLYFLAGS += -Wmissing-prototypes -Wnested-externs 
CONLYFLAGS += -Wmissing-prototypes -Wnested-externs -Wimplicit 
***** C:\PROGRAM FILES\GUARDANT\GUARDANT 6.1\5EC003K\SAMPLES\ARM\00 - TEMPLATE\LOADABLE CODE\MAKEFILE
CONLYFLAGS += -Wmissing-prototypes -Wnested-externs 
*****

***** Makefile.code
OBJ0 = $(notdir $(OBJ))
#JEF OBJ1 = $(OBJ:.o=1.o)
OBJ1 = $(OBJ0:.o=1.o)
#JEF OBJ2 = $(OBJ:.o=2.o)
OBJ2 = $(OBJ0:.o=2.o)
***** C:\PROGRAM FILES\GUARDANT\GUARDANT 6.1\5EC003K\SAMPLES\ARM\00 - TEMPLATE\LOADABLE CODE\MAKEFILE
OBJ1 = $(OBJ:.o=1.o)
OBJ2 = $(OBJ:.o=2.o)
*****

***** Makefile.code
        @if [ -e ".obj/1" ]; then \
#JEF      $(CC1) -c $(ALL_CFLAGS1) $(CONLYFLAGS) $< -o .obj/$(@:.o=1.o) ; \
          $(CC1) -c $(ALL_CFLAGS1) $(CONLYFLAGS) $< -o .obj/$(@F:.o=1.o) ; \
        else \
#JEF      $(CC2) -c $(ALL_CFLAGS1) $(CONLYFLAGS) $< -o .obj/$(@:.o=1.o) ; \
          $(CC2) -c $(ALL_CFLAGS1) $(CONLYFLAGS) $< -o .obj/$(@F:.o=1.o) ; \
        fi;
#JEF    @if [ -e ".obj/2" ]; then $(CC2) -c $(ALL_CFLAGS2) $(CONLYFLAGS) $< -o .obj/$(@:.o=2.o) ; fi;
        @if [ -e ".obj/2" ]; then $(CC2) -c $(ALL_CFLAGS2) $(CONLYFLAGS) $< -o .obj/$(@F:.o=2.o) ; fi;

***** C:\PROGRAM FILES\GUARDANT\GUARDANT 6.1\5EC003K\SAMPLES\ARM\00 - TEMPLATE\LOADABLE CODE\MAKEFILE
        @if [ -e ".obj/1" ]; then \
          $(CC1) -c $(ALL_CFLAGS1) $(CONLYFLAGS) $< -o .obj/$(@:.o=1.o) ; \
        else \
          $(CC2) -c $(ALL_CFLAGS1) $(CONLYFLAGS) $< -o .obj/$(@:.o=1.o) ; \
        fi;
        @if [ -e ".obj/2" ]; then $(CC2) -c $(ALL_CFLAGS2) $(CONLYFLAGS) $< -o .obj/$(@:.o=2.o) ; fi;
*****

***** Makefile.code
        @if [ -e ".obj/1" ]; then \
#JEF      $(CPP1) -c $(ALL_CFLAGS1) $(CPPFLAGS) $< -o .obj/$(@:.o=1.o) ; \
          $(CPP1) -c $(ALL_CFLAGS1) $(CPPFLAGS) $< -o .obj/$(@F:.o=1.o) ; \
        else \
#JEF      $(CPP2) -c $(ALL_CFLAGS1) $(CPPFLAGS) $< -o .obj/$(@:.o=1.o) ; \
          $(CPP2) -c $(ALL_CFLAGS1) $(CPPFLAGS) $< -o .obj/$(@F:.o=1.o) ; \
        fi;
#JEF    @if [ -e ".obj/2" ]; then $(CPP2) -c $(ALL_CFLAGS2) $(CPPFLAGS) $< -o .obj/$(@:.o=2.o) ; fi;
        @if [ -e ".obj/2" ]; then $(CPP2) -c $(ALL_CFLAGS2) $(CPPFLAGS) $< -o .obj/$(@F:.o=2.o) ; fi;

***** C:\PROGRAM FILES\GUARDANT\GUARDANT 6.1\5EC003K\SAMPLES\ARM\00 - TEMPLATE\LOADABLE CODE\MAKEFILE
        @if [ -e ".obj/1" ]; then \
          $(CPP1) -c $(ALL_CFLAGS1) $(CPPFLAGS) $< -o .obj/$(@:.o=1.o) ; \
        else \
          $(CPP2) -c $(ALL_CFLAGS1) $(CPPFLAGS) $< -o .obj/$(@:.o=1.o) ; \
        fi;
        @if [ -e ".obj/2" ]; then $(CPP2) -c $(ALL_CFLAGS2) $(CPPFLAGS) $< -o .obj/$(@:.o=2.o) ; fi;
*****

***** Makefile.code
        @if [ -e ".obj/1" ]; then \
#JEF      $(CC1) -c $(ALL_ASFLAGS1) $< -o .obj/$(@:.o=1.o) ; \
          $(CC1) -c $(ALL_ASFLAGS1) $< -o .obj/$(@F:.o=1.o) ; \
        else \
#JEF      $(CC2) -c $(ALL_ASFLAGS1) $< -o .obj/$(@:.o=1.o) ; \
          $(CC2) -c $(ALL_ASFLAGS1) $< -o .obj/$(@F:.o=1.o) ; \
        fi;
#JEF    @if [ -e ".obj/2" ]; then $(CC2) -c $(ALL_ASFLAGS2) $< -o .obj/$(@:.o=1.o) ; fi;
        @if [ -e ".obj/2" ]; then $(CC2) -c $(ALL_ASFLAGS2) $< -o .obj/$(@F:.o=1.o) ; fi;
***** C:\PROGRAM FILES\GUARDANT\GUARDANT 6.1\5EC003K\SAMPLES\ARM\00 - TEMPLATE\LOADABLE CODE\MAKEFILE
        @if [ -e ".obj/1" ]; then \
          $(CC1) -c $(ALL_ASFLAGS1) $< -o .obj/$(@:.o=1.o) ; \
        else \
          $(CC2) -c $(ALL_ASFLAGS1) $< -o .obj/$(@:.o=1.o) ; \
        fi;
        @if [ -e ".obj/2" ]; then $(CC2) -c $(ALL_ASFLAGS2) $< -o .obj/$(@:.o=1.o) ; fi;
*****

(2014-07-04 10:58:26 отредактировано Kogen)

Re: Guardant Code, map_parse и флажки оптимизации

AndreyStepin пишет:

Только что проделал следующее:
1) На чистый компьютер с Win7 Pro установил Guardant SDK 6.1 - с сайта скачал для чистоты эксперимента
2) Установил последние версии YAGARTO Tools и YAGARTO GNU Toolchain с сайта http://www.yagarto.de/#download
3) Открыл наш самый наглядный пример C:\Program Files (x86)\Guardant\Guardant 6.1\DEMONVK\Samples\ARM\05 - LED Control\Loadable Code
Здесь загружаемый код заставляет ключ моргать с определенной периодичностью. Очень просто отследить работоспособность
4) Запустил команду make template, затем make all. Скомпилировалась пара файлов bin/bmap
5) Загрузил bin в ключ, маска по умолчанию.
6) Все работает, при вызове GrdCodeRun ключ моргает, никаких ошибок на всем пути.

Доброго времени суток.
Сделал как написано, только с Guardant SDK 6.31.
Бинарник получился, led_control.gcexe получился, и он даже загружается и вроде как выполняется, о чем свидетельствует лог из NetBeans'a 7.4:
Working Directory = D:\Guardant\GuardTest\GuardantDongleTest
Loading led_control.gcexe: No errors
Loading GCEXE File to Dongle: No errors
Run Code LED:No errors
Waiting... LED Control in process...
Press Enter to continue.

Однако при всём при этом никакая индикация на ключе не моргает. Как горел светодиод, так и горит.

P.S.: Ключ прошит файлом mask2.nsd, который лежит там же, где и примеры, т.е. в папке ..\Samples\ARM