03 Nov 2018
이 팁은 다음의 내용을 안내 해드립니다.
- 빌드 버튼을 누른 시각을 변수 또는 플래시(Flash) 메모리에 기록하는 방법을 알아봅니다.
- 다국적 환경에서 빌드 시간의 시간차 문제를 해결하는 방법을 알아봅니다.
미리 정의된 매크로를 사용하는 방법
한국/일본과 같이 두 나라 간 시간차가 없는 지역에서만 사용한다면 이 방법이 가장 빠르고 간단한 방법이 될 수 있습니다. KEIL ARM 컴파일러는 __DATE__ 와 __TIME__ 이라는 매크로를 정의하고 있는데 이것을 이용하여 펌웨어가 빌드 된 시각을 기록할 수 있습니다.
다음의 예제코드를 사용하여 적용합니다.
char code my_date[] = "Compile Date = " __DATE__; char code my_time[] = "Compile Time = " __TIME__;
Unix Time을 사용하는 방법
한국/대만과 같이 두 나라 간 시간차가 있는 지역은 Unix Time을 사용하여 이 문제를 극복합니다. 아래의 코드를 복사하여 배치파일을 만들고 파일 이름은 적당히 compile_time.bat 으로 지정 후 Keil uvision 프로젝트 폴더내 Inc 폴더에 저장합니다.
@echo off call :GetUnixTime UNIX_TIME echo UNIX_TIME = %UNIX_TIME% echo #ifndef __COMPILE_TIME_H__> ../Inc/compile_time.h echo #define __COMPILE_TIME_H__>> ../Inc/compile_time.h echo.>> ../Inc/compile_time.h echo #define COMPILED_UNIX_TIME %UNIX_TIME%>> ../Inc/compile_time.h echo.>> ../Inc/compile_time.h echo #endif>> ../Inc/compile_time.h echo.>> ../Inc/compile_time.h goto :EOF :GetUnixTime setlocal enableextensions for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do ( set %%x) set /a z=(14-100%Month%%%100)/12, y=10000%Year%%%10000-z set /a ut=y*365+y/4-y/100+y/400+(153*(100%Month%%%100+12*z-3)+2)/5+Day-719469 set /a ut=ut*86400+100%Hour%%%100*3600+100%Minute%%%100*60+100%Second%%%100 endlocal & set "%1=%ut%" & goto :EOF
이때, 배치파일이 실행될 때 마다 배치 파일의 경로에 compile_time.h 파일로 빌드 시간을 업데이트합니다. 따라서 이 헤더파일을 코드에 적당히 include후 COMPILED_UNIX_TIME을 플래시에 기록될 수 있도록 프로그래밍 하여야 합니다. 필요에 따라 배치파일을 수정하여 빌드할 때 마다 빌드 버전을 자동으로 카운트하거나 git commit hash를 기록하도록 하여 디버깅 및 관리에 용이하게 활용할 수 있습니다.

마지막으로 Keil uvision 프로젝트 설정의 User – Before Build/Rebuild에서 빌드 전 배치파일이 실행되도록 설정합니다. 이렇게 하면 빌드 전 배치파일이 빌드 시간이 정의된 헤더파일을 업데이트 후 빌드를 전행합니다.

빌드된 펌웨어를 플래시에 다운로드 후 디버그 프린트나 통신 프로그램으로 결과를 확인합니다.
참고
- KEIL ARM – Predefined macros – http://www.keil.com/support/man/docs/armcc/armcc_chr1359125007083.htm