IAR Build Actions |
![]() |
Добавил(а) microsin |
Эти технические заметки дают дополнительную информацию по использованию Build Actions в системе программирования IAR Embedded Workbench (перевод Technical Note 99436 [1]). Подсистема "Build Actions" (действия при сборке, далее сокращенно BA), управляемая через свойства проекта, предназначена для запуска команд и скриптов перед сборкой проекта (действия pre-build) и после его сборки (post-build). Это очень полезная функция, позволяющая осуществлять автоматизацию процесса сборки - например генерацию исходного кода [6], запуск перекодировщиков прошивки (например для шифрования [7]) и т. п. Совет 1: чтобы посмотреть вывод от запрограммированных действий, связанных со сборкой (build actions) в окне сообщений сборки (Build window), разрешите опцию Tools -> Options... -> откроется окно IDE Options. Выберите Messages -> Show build messages -> All. Совет 2: когда код проекта не требует перекомпиляции (т. е. уже скомпилирован, находится в актуальном, обновленном состоянии up-to-date), то команды BA не запустятся, они выполняются только в том случае, когда запускаются какие-либо компиляционные инструменты тулчейна IAR, влияющие на генерацию конечного выходного двоичного кода. [Командная строка Build Actions] Вы можете ввести имяприложения.exe в командных строках pre-build и post-build, если переменная окружения PATH включает директорию, где находится этот запускаемый файл имяприложения.exe. Можно проверить значение переменной окружения PATH с помощью команды path, введенной в приглашении интерпретатора командной строки cmd.exe. Однако имейте в виду, что обычные команды MS-DOS не могут быть исполнены в строках pre-build и post-build. Т. е., к примеру, Вы можете запустить через эти строки BA команду calc.exe, однако команда copy не запустится. Для запуска команд наподобие copy, path, set и командных bat-файлов применяйте в строке вызов cmd.exe: cmd.exe /c "командная строка"
Пример запуска команды path из строк BA: cmd /c "path"
По умолчанию инсталлятор IAR добавляет путь до папки $TOOLKIT_DIR$\bin в переменную окружения PATH, так что Вы можете запустить приложения IAR Embedded Workbench непосредственно из строк BA (строки команд pre-build и post-build). Пример командной строки post-build (пример для IAR Embedded Workbench for ARM): ielfdumparm [Перенаправление stdout и stderr] Чтобы перенаправить вывод stdout и stderr в командной строке Windows, можно ввести следующую командную строку в приглашении интерпретатора cmd.exe: output.txt 2>&1 Чтобы запустить ту же самую команду из строки BA, нужно сделать промежуточный вызов cmd.exe: cmd /c "path > output.txt 2>&1"
Совет 3: здесь текущей директорией, куда запишется файл output.txt, будет директория, где находится IarIdePm.exe. Если Вы хотите указать другой каталог, то укажите полный путь до него. Например, для сохранения файла output.txt в каталоге проекта введите команду: cmd /c "path > $PROJ_DIR$\output.txt 2>&1"
Чтобы перенаправить вывод из приложения Windows, Вы можете ввести командную строку наподобие следующей: имяприложения.exe > output.txt 2>&1 Ожидаемая соответствующая строка BA будет выглядеть следующим образом: cmd /c "имяприложения.exe > output.txt 2>&1"
Может произойти, что Вы получите пустой файл output.txt. В этом случае нужно применить двойной косвенный вызов команды: cmd /c "cmd /c "имяприложения.exe > output.txt 2>&1"" Пример строки BA (для IAR Embedded Workbench for ARM): cmd /c "cmd /c "ielfdumparm > $PROJ_DIR$\output.txt 2>&1"" Совет 4: поскольку подобные строки команд могут выглядеть сложными и запутывающими, лучшим альтернативным решением будет вызов командного bat-файла из строк BA (см. далее). [Использование скриптов *.bat] С помощью .bat-файла Вы можете запускать команды MS-DOS как обычно. Внутри .bat-файла можно указать несколько команд друг за другом, и в них можно пропустить вызов "cmd /c", как это требовалось для командной строки BA. Примечание: если ранее надо было делать двойной вызов "cmd /c", то в .bat-файле можно ввести только первую часть "cmd /c". Пример запуска команды "path" с помощью .bat-файла, находящегося в директории проекта: $PROJ_DIR$\pre-build.bat Содержимое файла pre-build.bat: path Пример перенаправления вывода команды "path" с помощью .bat-файла, находящегося в директории проекта: $PROJ_DIR$\pre-build.bat "$PROJ_DIR$"
Содержимое файла pre-build.bat: path > %1\output.txt 2>&1 Примечание: Вы не можете внутри скрипта bat-файла использовать переменные аргумента наподобие $PROJ_DIR$, поскольку интерпретатор команд ничего не знает при них (это переменные среды IAR [8]). Вместо этого Вы можете передать переменные аргумента через параметры .bat-файла. Пример запуска ielfdumparm с помощью .bat-файла, находящегося в директории проекта: $PROJ_DIR$\post-build.bat Содержимое файла post-build.bat (пример для IAR Embedded Workbench for ARM): ielfdumparm Примечание: эта команда запустится, однако вывод из неё возможно не будет виден в окне сообщений сборки IAR (в окне Build window). В таком случае перенаправьте вывод и дамп файла с помощью команды "type" (см. далее). Пример перенаправления вывода из ielfdumparm с помощью .bat-файла, находящегося в директории проекта: $PROJ_DIR$\post-build.bat "$PROJ_DIR$"
Содержимое файла post-build.bat (пример для IAR Embedded Workbench for ARM): cmd /c "ielfdumparm > "%1\output.txt 2>&1"" Чтобы получить дамп содержимого файла output.txt, добавьте к .bat-файлу следующую строку: type "%1\output.txt"
Примечание: если Вы хотите запустить в .bat-файле несколько команд, откройте статью Википедии [2], и прочитайте разделы по перенаправлению, каналам и объединению действий в цепочку (redirection, piping, chaining). Также см. пример проекта в [3] Common, который использует файл post-build.bat для BA post-build. [Возвращаемые значения] Если любая из команд BA (post- или pre-build) вернет код ошибки (результат, не равный 0), то весь процесс выполнения команд Build/Make будет оборван. См. проект примера [4] и его скриншоты ниже. [Просмотр вывода только от Build Action] Если Вы считаете, что окно сборки выводит слишком много информации, и очень трудно увидеть вывод от настроенных команд BA, то в качестве альтернативы можно перенаправить вывод в текстовый файл, и запустить блокнот (notepad.exe) чтобы увидеть вывод только сообщений BA. Командная строка post-build: $PROJ_DIR$\post-build.bat $PROJ_DIR$ Содержимое файла post-build.bat (пример для ARM): echo off cmd /c "ielfdumparm > "%1\output.txt 2>&1"" echo Look in the notepad window and then close notepad "%1\output.txt" echo on Примечание: когда здесь имеются символы пробела в имени файлового пути, то обычный путь избежать проблем с такими путями - заключить их в двойные кавычки. Но если это не работает, например когда запускается notepad, попробуйте использовать путь, который не содержит пробелов или кавычек, или преобразуйте длинное имя пути в короткое типа 8.3. [Команда touch системы Cygwin] Вы можете запустить приложение Cygwin (cygwin-application.exe) в строках команд BA, если переменная окружения PATH содержит директорию, где находится cygwin-application.exe. Вы можете запустить Cygwin-команду "touch" в командной строке pre-build, но если Вы добавите путь до файла, например "touch d:/test.c", то путь до файла не будет воспринят системой Cygwin. Cygwin ожидает путь по стандарту POSIX, наподобие /cygdrive/d/test.c, так что результирующая командная строка должна быть "touch /cygdrive/d/test.c", однако эта команда не может быть выполнена напрямую в командах BA. Вместо этого такая команда запускается косвенно, через вызов cmd.exe: cmd /c "touch /cygdrive/d/test.c"
Альтернативно файл .bat (находящийся в каталоге проекта) может выглядеть следующим образом (команда pre-build): $PROJ_DIR$\pre-build.bat Файл pre-build.bat: touch /cygdrive/d/test.c Нет никакого смысла передавать переменные аргумента, такие как $PROJ_DIR$, в такой *.bat-файл через параметры, так как Cygwin не сможет их использовать напрямую (Cygwin ожидает путь POSIX). Если Вы хотите запустить команду touch без внесения изменений, то BA не запустятся, и Вам нужно обратиться к другому способу запуска BA. Конечно, можно сделать предварительную очистку (Clean) и затем запустить сборку как обычно, чтобы привести в действие команды BA. Альтернативно можно сделать отдельный .bat-файл (который нужно запускать вручную), чтобы запустить touch, за которым будет запуск "IarBuild.exe -build" (см. Technical Note 47884 [5] для получения информации об IarBuild.exe). Альтернатива для запуска команды touch - иметь действие pre-build, которое удаляет какой-нибудь объектный файл проекта: cmd /c "del "$OBJ_DIR$\test.o"" [Пример Post-Build для автоматизации прошивки nRF51844] В этом примере рассматривается компиляция проекта ble_app_hids_keyboard на основе чипа nRF51422_xxAA (установлен на плате PCA10028). Этот проект доступен в nRF5 SDK v12.3.0 [10]. После компиляции автоматически запускается скрипт, который сначала прошивает в память чипа двоичный код SoftDevice (s130_nrf51_2.0.1_softdevice.hex), а потом прошивается двоичный код приложения (ble_app_hids_keyboard_pca10028_s130.hex). Процесс по шагам: 1. Создайте командный файл post-build.cmd следующего содержания: @rem Передача опций командной строки:
set PROJ_DIR=%1
set SERIAL=%2
set FIRMWARE=%3.hex
@rem Абсолютный путь до прошиваемого SoftDevice:
set SOFTDEVICE=%PROJ_DIR%\..\..\..\..\..\..\components\softdevice\s130\hex\ s130_nrf51_2.0.1_softdevice.hex @rem Абсолютный путь до утилиты JLink.exe:
set JLINK722="%ProgramFiles(x86)%\SEGGER\JLink\JLink.exe" @rem Имя скрипта команд для JLink.exe:
set JLINK_SCRIPT=%PROJ_DIR%\..\..\..\prg51.jlink @rem Имя файла для выводимых сообщений JLink.exe:
set JLINKOUTPUT=%PROJ_DIR%\..\..\..\jlinkoutput.txt @rem Генерация файла команд для JLink.exe:
echo device NRF51422_XXAA> %JLINK_SCRIPT% echo si SWD >> %JLINK_SCRIPT% echo speed 4000 >> %JLINK_SCRIPT% echo r >> %JLINK_SCRIPT% echo h >> %JLINK_SCRIPT% echo loadfile %SOFTDEVICE% >> %JLINK_SCRIPT% echo loadfile %FIRMWARE% >> %JLINK_SCRIPT% echo q >> %JLINK_SCRIPT% @rem Запуск прошивки кода SoftDevice и кода приложения:
%JLINK722% -USB %SERIAL% -CommandFile %JLINK_SCRIPT% >> %JLINKOUTPUT%
В этот командный файл будут передаваться 3 опции: %1: эта опция передает каталог проекта (где находится файл *.ewp, в SDK этот файл находится в подкаталоге ble_app_hids_keyboard\pca10028\s130\iar\). Опция передается с помощью переменной $PROJ_DIR$ IAR. Примечание: переменные $PROJ_DIR$ и $TARGET_BPATH$ это специальные текстовые строки (переменные аргумента, Argument variables), которые можно передавать в строку команд BA. Подробнее см. [8]. 2. Запишите командный файл post-build.cmd в папку examples\ble_peripheral\ble_app_hids_keyboard SDK. 3. Откройте свойства проекта, перейдите в раздел настроек Build Actions, и в строке "Post-build command line:" введите следующее: $PROJ_DIR$\..\..\..\post-build.cmd $PROJ_DIR$ 12345678 $TARGET_BPATH$ Эта команда запустит post-build.cmd, и передаст в него полный путь до каталога проекта, серийный номер J-Link и полный путь до выходного файла приложения без расширения. На этом все. Перекомпилируйте проект. Скрипт post-build.cmd автоматически сгенерирует файл команд prg51.jlink следующего содержания: device NRF51422_XXAA si SWD speed 4000 r h loadfile D:\asm\nRF5_SDK_12.3.0_d7731ad\examples\ble_peripheral\ble_app_hids_keyboard\pca10028\ s130\iar\..\..\..\..\..\..\components\softdevice\s130\hex\s130_nrf51_2.0.1_softdevice.hex loadfile D:\asm\nRF5_SDK_12.3.0_d7731ad\examples\ble_peripheral\ble_app_hids_keyboard\pca10028\ s130\iar\_build\ble_app_hids_keyboard_pca10028_s130.hex q И затем этот файл команд будет передан утилите JLink.exe, в результате чего в память чипа nRF51422 будет записан сначала код SoftDevice, затем код приложения. Причем память FLASH чипа будет записана с экономией её ресурса перезаписи: будут стерты только те сектора, содержимое которых не совпадает с записываемыми данными. Это хорошо видно в выводе утилиты JLink.exe (Skipped. Contents already match): SEGGER J-Link Commander V7.22 (Compiled Jun 2 2021 10:04:41) DLL version V7.22, compiled Jun 2 2021 10:03:15 J-Link Command File read successfully. Processing script file... J-Link connection not established yet but required for command. Connecting to J-Link via USB...O.K. Firmware: J-Link OB-SAM3U128-V2-NordicSemi compiled Feb 2 2021 16:47:20 Hardware version: V1.00 S/N: 681130725 License(s): RDI, FlashBP, FlashDL, JFlash, GDB VTref=3.300V Selecting SWD as current target interface. Selecting 4000 kHz as target interface speed Target connection not established yet but required for command. Device "NRF51422_XXAA" selected. Connecting to target via SWD Found SW-DP with ID 0x0BB11477 DPIDR: 0x0BB11477 Scanning AP map to find all available APs AP[1]: Stopped AP scan as end of AP map has been reached AP[0]: AHB-AP (IDR: 0x04770021) Iterating through AP map to find AHB-AP to use AP[0]: Core found AP[0]: AHB-AP ROM base: 0xF0000000 CPUID register: 0x410CC200. Implementer code: 0x41 (ARM) Found Cortex-M0 r0p0, Little endian. FPUnit: 4 code (BP) slots and 0 literal slots CoreSight components: ROMTbl[0] @ F0000000 ROMTbl[0][0]: E00FF000, CID: B105100D, PID: 000BB471 ROM Table ROMTbl[1] @ E00FF000 ROMTbl[1][0]: E000E000, CID: B105E00D, PID: 000BB008 SCS ROMTbl[1][1]: E0001000, CID: B105E00D, PID: 000BB00A DWT ROMTbl[1][2]: E0002000, CID: B105E00D, PID: 000BB00B FPB ROMTbl[0][1]: F0002000, CID: B105900D, PID: 000BB9A3 ??? Cortex-M0 identified. Reset delay: 0 ms Reset type NORMAL: Resets core & peripherals via SYSRESETREQ & VECTRESET bit. Reset: Halt core after reset via DEMCR.VC_CORERESET. Reset: Reset device via AIRCR.SYSRESETREQ. PC = 000006D0, CycleCnt = 00000000 R0 = FFFFFFFF, R1 = FFFFFFFF, R2 = FFFFFFFF, R3 = FFFFFFFF R4 = FFFFFFFF, R5 = FFFFFFFF, R6 = FFFFFFFF, R7 = FFFFFFFF R8 = FFFFFFFF, R9 = FFFFFFFF, R10= FFFFFFFF, R11= FFFFFFFF R12= FFFFFFFF SP(R13)= 000007C0, MSP= 000007C0, PSP= FFFFFFFC, R14(LR) = FFFFFFFF XPSR = C1000000: APSR = NZcvq, EPSR = 01000000, IPSR = 000 (NoException) CFBP = 00000000, CONTROL = 00, FAULTMASK = 00, BASEPRI = 00, PRIMASK = 00 FPU regs: FPU not enabled / not implemented on connected CPU. Downloading file [D:\asm\nRF5_SDK_12.3.0_d7731ad\examples\ble_peripheral\ble_app_hids_keyboard\pca10028\ s130\iar\..\..\..\..\..\..\components\softdevice\s130\hex\s130_nrf51_2.0.1_softdevice.hex]... J-Link: Flash download: Bank 0 @ 0x00000000: Skipped. Contents already match O.K. Downloading file [D:\asm\nRF5_SDK_12.3.0_d7731ad\examples\ble_peripheral\ble_app_hids_keyboard\pca10028\ s130\iar\_build\ble_app_hids_keyboard_pca10028_s130.hex]... J-Link: Flash download: Bank 0 @ 0x00000000: Skipped. Contents already match O.K. Script processing completed. [Ссылки] 1. Build Actions (pre-build and post-build) site:iar.com. |