(STM32) Keil uVision 컴파일(빌드)한 시각을 변수/플래시에 기록하는 방법

03 Nov 2018

이 팁은 다음의 내용을 안내 해드립니다.

  1. 빌드 버튼을 누른 시각을 변수 또는 플래시(Flash) 메모리에 기록하는 방법을 알아봅니다.
  2. 다국적 환경에서 빌드 시간의 시간차 문제를 해결하는 방법을 알아봅니다.

미리 정의된 매크로를 사용하는 방법

한국/일본과 같이 두 나라 간 시간차가 없는 지역에서만 사용한다면 이 방법이 가장 빠르고 간단한 방법이 될 수 있습니다. 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에서 빌드 전 배치파일이 실행되도록 설정합니다. 이렇게 하면 빌드 전 배치파일이 빌드 시간이 정의된 헤더파일을 업데이트 후 빌드를 전행합니다.

빌드된 펌웨어를 플래시에 다운로드 후 디버그 프린트나 통신 프로그램으로 결과를 확인합니다.


참고

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.