Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как включить версию прошивки в бинарник?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Ivan Kuznetzov
Привет всем! Есть девайс на STM32, обновление прошивки происходит с SD карты. Обновляется бинарником, сгенерированными ИАРом. Как в бинарник включить в начало какое-нибудь слово (или дату компиляции прошивки), которое было-бы для моего девайса уникальным?

спасибо
rezident
Может стоит уже за художественное цитирование документации и даташитов плату брать? rolleyes.gif Открываем файл
x:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\doc\EWARM_DebuggingGuide.ENU.pdf и ищем раздел
Descriptions of predefined preprocessor symbols (стр.346). Читаем там про __BUILD_NUMBER__, __DATE__ и __TIME__.
Далее открываем
x:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\doc\EWARM_IDEGuide.ENU.pdf на стр.44 и читаем.
Цитата
USING PRE- AND POST-BUILD ACTIONS
If necessary, you can specify pre-build and post-build actions that you want to occur
before or after the build. The Build Actions dialog box—available from the Project
menu—lets you specify the actions required.
For detailed information about the Build Actions dialog box, see Build actions options,
page 189.
Using pre-build actions for time stamping
You can use pre-build actions to embed a time stamp for the build in the resulting binary
file. Follow these steps:
1 Create a dedicated time stamp file, for example, timestamp.c and add it to your
project.
2 In this source file, use the preprocessor macros __TIME__ and __DATE__ to initialize
a string variable.
3 Choose Project>Options>Build Actions to open the Build Actions dialog box.
4 In the Pre-build command line text field, specify for example this pre-build action:
"touch $PROJ_DIR$\timestamp.c"
You can use the open source command line utility touch for this purpose or any other
suitable utility which updates the modification time of the source file.
5 If the project is not entirely up-to-date, the next time you use the Make command, the
pre-build action will be invoked before the regular build process. Then the regular build
process must always recompile timestamp.c and the correct timestamp will end up in
the binary file.
If the project already is up-to-date, the pre-build action will not be invoked. This means
that nothing is built, and the binary file still contains the timestamp for when it was last
built.
prottoss
Цитата(Ivan Kuznetzov @ Mar 8 2011, 04:22) *
Привет всем! Есть девайс на STM32, обновление прошивки происходит с SD карты. Обновляется бинарником, сгенерированными ИАРом. Как в бинарник включить в начало какое-нибудь слово (или дату компиляции прошивки), которое было-бы для моего девайса уникальным?
спасибо

Я устанавливаю все нужные константы после таблицы векторов:
В файле cstartup.s
Код
/*******************************************************************************
Exception vectors & startup code
*******************************************************************************/

#define ASSEMBLER_INCLUDE
#include "app_cfg.h"

    MODULE  ?cstartup
    SECTION    IRQ_STACK:DATA:NOROOT(2)
    SECTION    FIQ_STACK:DATA:NOROOT(2)
    SECTION    SVC_STACK:DATA:NOROOT(2)
    SECTION    ABT_STACK:DATA:NOROOT(2)
    SECTION    UND_STACK:DATA:NOROOT(2)
    SECTION    C_STACK:DATA:NOROOT(3)

/*******************************************************************************
Def's
*******************************************************************************/

/* Mode, correspords to bits 0-5 in CPSR */
#define ARM_MODE_BITS    0x1F
#define ARM_MODE_USR    0x10
#define ARM_MODE_FIQ    0x11
#define ARM_MODE_IRQ    0x12
#define ARM_MODE_SVC    0x13
#define ARM_MODE_ABT    0x17
#define ARM_MODE_UND    0x1B
#define ARM_MODE_SYS    0x1F

/* Irq's bits in CPSR */
#define ARM_CPSR_I_DIS    0x80
#define ARM_CPSR_F_DIS    0x40

/*******************************************************************************

*******************************************************************************/
    SECTION .vectors:CODE:NOROOT(2)
    PUBLIC    __program_start
    PUBLIC    __sw_version
    EXTERN    AT91_CPU_UndefHandler
    EXTERN    AT91_CPU_SWIHandler
    EXTERN    AT91_CPU_PREFHandler
    EXTERN    AT91_CPU_DATAHandler
    EXTERN    AT91_CPU_FIQHandler
    
    CODE32    /* ARM mode */

/* Vectors */
/* CPU */
__program_start:
    LDR        PC, = __cstartup        /* Branch to low level init code */
    LDR     PC, __cpu_undef_handler    /* Branch to undefined instruction handler */
    LDR     PC, __cpu_swi_handler    /* Branch to software interrupt handler */
    LDR     PC, __cpu_pref_handler    /* Branch to prefetch handler */
    LDR     PC, __cpu_data_handler    /* Branch to data abort handler */
    LDR        PC, = __cstartup        /* Branch to startup code - reserved vector */
    LDR        PC, = __irq_handler        /* Branch to IRQ handler */
    LDR     PC, __cpu_fiq_handler    /* Branch to FIQ handler */

__cpu_undef_handler:    DCD        AT91_CPU_UndefHandler
__cpu_swi_handler:        DCD        AT91_CPU_SWIHandler
__cpu_pref_handler:        DCD        AT91_CPU_PREFHandler
__cpu_data_handler:        DCD        AT91_CPU_DATAHandler
__cpu_fiq_handler:        DCD        AT91_CPU_FIQHandler

/*******************************************************************************
Application version.
Address = __programm_start + (13 * 4) = 52
*******************************************************************************/
__sw_version:            DCD        APP_CFG_SW_VERSION
__sw_name:                DCD        APP_CFG_SW_NAME
    

/*******************************************************************************
Handles incoming interrupt requests by branching to the corresponding
handler, as defined in the AIC. Supports interrupt nesting.
*******************************************************************************/
__irq_handler:
......................
......................
......................

В файле конфигурации приложения:
Код
#ifndef APP_CFG_H
#define APP_CFG_H

#include <ioat91sam7s64.h>    /* Link CPU */

/*******************************************************************************
Configs
*******************************************************************************/

/* Board version */
#define APP_CFG_BOARD_VERSION        2

/* This software version */
#define APP_CFG_SW_VERSION            0x00110210 /* Year, Month, Day */

/* This software name */
#define APP_CFG_SW_NAME                "My Device"
......................
......................
......................
Nixon
А еще неплохо прочитать раздел 30.2 Reference Manual на STM32. Про Unique Device ID.
Ivan Kuznetzov
Цитата(Nixon @ Mar 8 2011, 12:54) *
А еще неплохо прочитать раздел 30.2 Reference Manual на STM32. Про Unique Device ID.

Причем здесь ID-шник чипа? я говорю про "магический" нумбер, записываемый в файл-бинарник при компиляции.
Nixon
Цитата(Ivan Kuznetzov @ Mar 7 2011, 23:22) *
Как в бинарник включить в начало какое-нибудь слово (или дату компиляции прошивки), которое было-бы для моего девайса уникальным?

Я вас неправильно понял?
Ivan Kuznetzov
Цитата(Nixon @ Mar 10 2011, 01:05) *
Я вас неправильно понял?

немного да... уникальным для данной модели устройства.
Впрочем проблемку решил по простецки: добавляю вначало бинарника слово *TIFLO*, а загрузчик проверяет бинарник на наличие этого слова в бинарнике.
KSN
1. А есть способ во время компиляции выводить в окно сообщений компилятора значения __BUILD_NUMBER__, __DATE__ и __TIME__?
2. Подскажите документ, в котором описана работа с "PRE- AND POST-BUILD ACTIONS": команды, синтаксис и т.п. Может быть есть примеры, которые можно принять на вооружение. У IAR-а написано, что есть такой инструмент, а как им пользоваться - не нашел.
SSerge
Цитата(KSN @ Feb 8 2013, 11:36) *
1. А есть способ во время компиляции выводить в окно сообщений компилятора значения __BUILD_NUMBER__, __DATE__ и __TIME__?
2. Подскажите документ, в котором описана работа с "PRE- AND POST-BUILD ACTIONS": команды, синтаксис и т.п. Может быть есть примеры, которые можно принять на вооружение. У IAR-а написано, что есть такой инструмент, а как им пользоваться - не нашел.

1. У IAR есть расширение: директива препроцессора #warning, с её помощью можно выдавать сообщения.
2. arm/doc/EWARM_IDEGuide.ENU.pdf
не менее полезны также
EWARM_DevelopmentGuide.ENU.pdf
EWARM_DebuggingGuide.ENU.pdf

Если пользуетесь системой контроля версий, то можно возложить эти задачи на неё.
SVN, например, умеет выполнять подстановку ключевых слов, заменяя $Date$ на дату а $Revision$ на номер ревизии.
Есть специальная утилита для этого, её можно или запускать как PrebuildAction или поручить эту работу самой SVN.
uriy
Цитата
SVN, например, умеет выполнять подстановку ключевых слов, заменяя $Date$ на дату а $Revision$ на номер ревизии.
Есть специальная утилита для этого, её можно или запускать как PrebuildAction или поручить эту работу самой SVN.
Можно подробней об этом? Как называется утилита? И знаете ли вы что-то подобное для GIT, я уже пару лет не использую SVN.
KSN
Цитата(SSerge @ Feb 8 2013, 16:05) *
1. У IAR есть расширение: директива препроцессора #warning, с её помощью можно выдавать сообщения.

Сейчас и пользуюсь #warning, но в нем надо явно указывать то, что хочу выводит. А хочу вроде такого:
Код
#define FIRMWARE "1.2.3.4"
#warning FIRMWARE

и чтобы выводилось 1.2.3.4, а не FIRMWARE
scifi
Цитата(uriy @ Feb 8 2013, 14:07) *
Можно подробней об этом? Как называется утилита? И знаете ли вы что-то подобное для GIT, я уже пару лет не использую SVN.

Утилита называется SubWCRev, входит в состав TortoiseSVN.
Для git вроде бы полагается использовать git describe.
Кстати, в SVN приятно то, что код ревизии - это просто число, причём оно со временем только увеличивается. Это в отличие от git.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.