Эти технические заметки дают дополнительную информацию по использованию 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:
По умолчанию инсталлятор IAR добавляет путь до папки $TOOLKIT_DIR$\bin в переменную окружения PATH, так что Вы можете запустить приложения IAR Embedded Workbench непосредственно из строк BA (строки команд pre-build и post-build).
Пример командной строки post-build (пример для IAR Embedded Workbench for ARM):
[Перенаправление stdout и stderr]
Чтобы перенаправить вывод stdout и stderr в командной строке Windows, можно ввести следующую командную строку в приглашении интерпретатора cmd.exe:
Чтобы запустить ту же самую команду из строки 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-файла, находящегося в директории проекта:
Содержимое файла pre-build.bat:
Пример перенаправления вывода команды "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-файлу следующую строку:
Примечание: если Вы хотите запустить в .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):
Файл pre-build.bat:
Нет никакого смысла передавать переменные аргумента, такие как $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. %2: эта опция передает серийный номер J-Link. Он нужен для скрипта команд утилиты JLink.exe. %3: эта опция указывает имя HEX-файла скомпилированного приложения. Она генерируется с помощью переменной $TARGET_BPATH$ 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. 2. COMMAND.COM site:wikipedia.org. 3. Hiding symbols in a library using isymexport Technical Note 28924 site:iar.com. 4. return-value-example-project-ewarm-6.50.6.zip Return value example project (IAR Embedded Workbench for ARM 6.50.6) site:iar.com. 5. Build from the command line Technical Note 47884 site:iar.com. 6. IAR EW ARM: автоматическая генерация версии прошивки. 7. Безопасная и защищенная реализация бутлоадера. 8. Переменные аргумента IAR ($PROJ_DIR$, $DATE$, и т. п.). 9. Автоматизация прошивки SoftDevice. 10. 211209nRF5_SDK_12.3.0_d7731ad-ble_app_hids_keyboard.zip - nRF5 SDK v12.3.0 с примерами приложений и скриптом post-build.cmd в каталоге проекта ble_app_hids_keyboard. |