В составе кода прошивки удобно иметь информацию о версии программного обеспечения - например, её можно выводить на экран при старте программы. При этом всегда будет понятно, какая версия 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);
|
Комментарии
__DATE__[] в коде программы, для отображения даты компиляции программы. Формат даты "Mmm dd yyyy" например "Oct 30 2010"
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 );
RSS лента комментариев этой записи