Jump to content

    

Прописывание версии ПО (прошивки)

Всем здравствуйте! Столкнулся с проблемой и никак не могу найти ее решение. Стоит задача прописывать в файле программы main.c имя версии. Я пробовал объявлять строку const char name_fw[] = "xxxx"; или const char name_fw[] PROGMEM = "xxxx"; Но при оптимизации эта строка вырезается т.к. в программе она нигде не используется. В итоге main.hex не содержит информации о версии ПО, и при считывании прошивки с микроконтроллера поди угадай какая версия туда была залита. Подскажите как можно решить эту проблему.

Share this post


Link to post
Share on other sites

Попробуйте объявить через __root

Share this post


Link to post
Share on other sites

Пишу в AVRStudio на ассемблере.

Вот такая строка в кодовом сегменте:

Version:
.DB    __DAY__,__MONTH__,__YEAR__,__HOUR__,__MINUTE__,__SECOND__        ;версия ПО

пропишет в память дату и время компиляции прошивки (удобнее,чем № версии).

Если нет аналогичной возможности на Си, попробуйте сделать ассемблерную вставку.

Share this post


Link to post
Share on other sites

/* Turn optimization off, for testing purposes */

#pragma opt-

 

/* Turn optimization on */

#pragma opt+

 

Share this post


Link to post
Share on other sites

Да что вы мучаетесь? напишите const volatile и будет вам счастье

Share this post


Link to post
Share on other sites
Да что вы мучаетесь? напишите const volatile и будет вам счастье

Опередил :) +1

Share this post


Link to post
Share on other sites
Twin_by, а как Вы на работающем устройстве определяете версию залитой в него прошивки? Напишите команду чтения версии вот и будет обращение к строке и никаких volatile не понадобится.

Share this post


Link to post
Share on other sites
Да что вы мучаетесь? напишите const volatile и будет вам счастье

 

Volatile не помогает, при оптимизации строчка выкидывается

 

Twin_by, а как Вы на работающем устройстве определяете версию залитой в него прошивки? Напишите команду чтения версии вот и будет обращение к строке и никаких volatile не понадобится.

 

А на работающем никак не определить версию ПО. Этого и не нужно. Нужно после того как сняли модуль, прочитать микроконтроллер и с помощью hex-editor (XVI32) найти имя прошивки.

 

Пишу в AVRStudio на ассемблере.

Вот такая строка в кодовом сегменте:

Version:
.DB    __DAY__,__MONTH__,__YEAR__,__HOUR__,__MINUTE__,__SECOND__    ;версия ПО

пропишет в память дату и время компиляции прошивки (удобнее,чем № версии).

Если нет аналогичной возможности на Си, попробуйте сделать ассемблерную вставку.

 

Попробовал ваш вариант. Но ругается ошибкой " Error 1 unknown pseudo-op: `.db' ". Пишу в AtmelStudio 6.2

asm("Version: .DB DAY__,__MONTH__,__YEAR__,__HOUR__,__MINUTE__,__SECOND");

 

Share this post


Link to post
Share on other sites
Попробовал ваш вариант. Но ругается ошибкой " Error 1 unknown pseudo-op: `.db' ". Пишу в AtmelStudio 6.2

лет 10 назад выводил примерно так:

uart_puts(__DATE__); // вывели дату прошивки в порт
uart_putc(' ');
uart_puts(__TIME__); // вывели время прошивки в порт

на выхлопе в консоли что-то типа Oct 24 2014 01:53:28

не заглядывал, но вероятно эти же цифры будут и в бинарнике..

(работает на m8, m128, m16, m32, m8535)

Share this post


Link to post
Share on other sites

Вроде получилось. И получилось двумя способами: способ от Spider и от esaulenka. Единственное что общего у них, это что картинка флагов оптимизации (-Os) выглядела следующим образом

 

-ffunction-sections (prepare functions for garbage collection) = SET

-fdata-sections (prepare functions for data collection) = CLEAR (по умолчанию обычно SET)

-fpack-struct (pack structure members together) = SET

-fshort-enums (allocate only as many bytes needed by enaum types) = SET

-mshort-calls (use rjamp/rcall (limited range) on > 8K devices) = CLEAR

 

Поэтому, чтобы прописать версию прошивки (ПО) нужно было убрать флаг -fdata-sections и после инклудов написать:

 

volatile const char fw_name[5] PROGMEM = "xxxx";

ИЛИ

const char name_fw[5] PROGMEM = "xxxx";
__attribute__ ((used (name_fw)));

 

Если есть еще какие замечания или комментарии с интересом выслушаю. Всем спасибо за помощь и советы. Esaulenka отдельное спасибо за ссылочку. Она еще мне пригодиться)

 

 

Share this post


Link to post
Share on other sites
Пишу в AVRStudio на ассемблере.

Вот такая строка в кодовом сегменте:

Version:
.DB    __DAY__,__MONTH__,__YEAR__,__HOUR__,__MINUTE__,__SECOND__    ;версия ПО

пропишет в память дату и время компиляции прошивки (удобнее,чем № версии).

Если нет аналогичной возможности на Си, попробуйте сделать ассемблерную вставку.

 

слушайте действительно работает!

а где вы вычитали эту фичу?

 

Share this post


Link to post
Share on other sites

Уже не помню. Лет 15 назад, когда начинал работать с AVR-ками.

__DAY__ и прочее - это специфические константы avr-ассемблера. Видимо, в хэлпе по ассемблеру.

Share this post


Link to post
Share on other sites
Поэтому, чтобы прописать версию прошивки (ПО) нужно было убрать флаг -fdata-sections
И тем самым отключить выбрасывание всех неиспользуемых переменных. Если бы у меня возникла необходимость оставить в памяти неиспользуемую константу, я бы поместил ее в отдельную секцию (__attribute__((section("имя_секции")))) и разместил бы эту секцию именно туда, где она мне нужна, запретив линкеру ее выкидывать ( KEEP(*(имя_секции)) )

 

Share this post


Link to post
Share on other sites

Раз уж такая пьянка, а не расскажете как заставить make пересобирать конкретный *.c даже если в нём не было изменений?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this