Главная arrow Программирование arrow ARM arrow IAR EW ARM: автоматическая генерация версии прошивки Sunday, October 22 2017  
ГлавнаяКонтактыАдминистрированиеПрограммированиеСсылки
UK-flag-ico.png English Version
GERMAN-flag-ico.png Die deutsche Version
map.gif карта сайта
нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Поделиться:

IAR EW ARM: автоматическая генерация версии прошивки Версия для печати
Написал microsin   
22.04.2010

В составе кода прошивки удобно иметь информацию о версии программного обеспечения - например, её можно выводить на экран при старте программы. При этом всегда будет понятно, какая версия 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);

Последнее обновление ( 22.04.2010 )
 

Комментарии  

  1. #1 Вячеслав Мезенцев
    2011-07-2419:46:52 Вот тут я описал ещё один вариант:
    http://electronix.ru/forum/index.php?showtopic=92599&st=15&start=15

    Исходники здесь (для С++ проектов):
    https://mysvn.ru/cop/Example/
    prebuild.cmd
    postbuild.cmd
    version.txt
    versionfile-gen.js
    versionfile-update.js
    Version.h
    Version.cpp

    Файлы должны находится в папке проекта. Доработать для себя уже самостоятельно.

    Тут версия в виде x.x.x.x .

    Так собирается:

    // Вычисление строки с версией программы
    utoa( CVersion::GetMa jor(), buffer, 10 );
    strcat( Version, buffer );
    strcat( Version, "." );

    utoa( CVersion::GetMi nor(), buffer, 10 );
    strcat( Version, buffer );
    strcat( Version, "." );

    utoa( CVersion::GetRe vision(), buffer, 10 );
    strcat( Version, buffer );
    strcat( Version, "." );

    utoa( CVersion::GetBu ild(), buffer, 10 );
    strcat( Version, buffer );

Добавить комментарий

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:

Защитный код
Обновить

< Пред.   След. >

Top of Page
 
microsin © 2017