IAR EW ARM: автоматическая генерация версии прошивки Печать
Добавил(а) microsin   

В составе кода прошивки удобно иметь информацию о версии программного обеспечения - например, её можно выводить на экран при старте программы. При этом всегда будет понятно, какая версия firmware прошита и работает. Совет подойдет не только к IAR для ARM, но и к IAR для AVR. В приведенном примере версия генерируется на основе года, месяца, дня, часов, минут, секунд.

Как сделать автоматическую генерацию номера версии (она будет пересчитываться заново при каждой перекомпиляции проекта), процесс по шагам:

1. Пишем vbs-скрипт (versionfile-gen.vbs) примерно такого содержания:

'[Начало versionfile-gen.vbs]
Dim Args
Set Args = WScript.Arguments

if (Args.Count < 1) then
  MsgBox "Error generate version file." + vbCrLf + "Usage:" + vbCrLf + "version-gen.vbs <filename>"
else
  'получаем имя выходного файла
  verfilename = Args(0)
  'получаем дату/время
  vYear  = CStr(Year  (Date))
  vMonth = CStr(Month (Date))
  if Len(vMonth) < 2 then
     vMonth = "0"+vMonth
  end if
  vDay    = CStr(Day    (Date))
  if Len(vDay) < 2 then
     vDay = "0"+vDay
  end if
  vHour  = CStr(Hour  (Time))
  if Len(vHour) < 2 then
     vHour = "0"+vHour
  end if
  vMinute = CStr(Minute (Time))
  if Len(vMinute) < 2 then
     vMinute = "0"+vMinute
  end if
  vSecond = CStr(Second (Time))
  if Len(vSecond) < 2 then
     vSecond = "0"+vSecond
  end if
  version_full = "const char version_full [] = ""-- ПКРЦ-М "+vDay+"."+vMonth+"."+vYear+" "+vHour+":"+vMinute+":"+vSecond+" --\n\r"";"
  version_logo = "const char version_logo [] = ""Версия ПО: "+Right(vYear, 2)+vMonth+vDay+" "+vYear+" г.\n\r"";"
  Set FSO = CreateObject("Scripting.FileSystemObject")
  Set FileOutStream = FSO.OpenTextFile(verfilename, 2, true, 0)
  FileOutStream.Write version_full + vbCrLf
  FileOutStream.Write version_logo + vbCrLf
end if
'[Конец versionfile-gen.vbs]

Этот скрипт в качестве параметра принимает имя генерируемого файла с версией (в моем примере будет генерироваться version.c), в котором будут две строки version_full и version_logo, содержащие номер версии firmware. Строк две, потом у что мне так захотелось. Вы можете в своем vbs-скрипте генерировать одну строку, или вообще любой код, который надо. Вот пример содержимого файла version.c, который будет генерироваться скриптом versionfile-gen.vbs:

const char version_full [] = "-- ПКРЦ-М 22.04.2010 12:54:08 --\n\r";
const char version_logo [] = "Версия ПО: 100422 2010 г.\n\r";

2. Делаем заголовок version.h для нашего файла version.c (его, как обычно, будем подключать в том месте, где нам понадобятся строки version_full или version_logo):
extern const char version_full [];
extern const char version_logo [];

3. В нашем примере скрипт versionfile-gen.vbs должен лежать в папке doc\version-gen относительно корня проекта. Файлы настроек проекта (имя_проекта.ewd и имя_проекта.ewp) лежат в папке ewp относительно корня проекта.

Настраиваем Build Actions проекта, чтобы наш скрипт выполнялся перед компиляцией. Идем в свойства проекта: меню Project -> Options -> Category: Build Actions -> в поле Pre-build command line: вставляем такой текст:
wscript.exe $PROJ_DIR$\..\doc\version-gen\versionfile-gen.vbs $PROJ_DIR$\..\version.c

Обращаю Ваше внимание, что пути указаны с учетом места размещения скрипта versionfile-gen.vbs и файлов настроек проекта (файлы с расширением .ewd и .ewp). Для вычисления корня проекта используется макропеременная $PROJ_DIR$, которая указывает на размещение файлов настроек проекта (файлы с расширением .ewd и .ewp).

Готово! Теперь при каждой перекомпиляции проекта в теле прошивки будет обновляться информация о версии программного обеспечения. Строки version_full и version_logo можно использовать по своему усмотрению, например:
trace_LOG(trace_INFO, version_full);