Jump to content

    
Sign in to follow this  
Twin_by

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

Recommended Posts

Всем здравствуйте! Столкнулся с проблемой и никак не могу найти ее решение. Стоит задача прописывать в файле программы 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

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

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

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

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

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

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

Компилятор-то какой?

 

Для gcc можно использовать

__attrubute__((used))

const char name_fw[] PROGMEM = "xxxx";

 

 

Подробности: https://gcc.gnu.org/onlinedocs/gcc-5.2.0/gc...able-Attributes

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this