Перейти к содержанию
    

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да что вы мучаетесь? напишите 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");

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал ваш вариант. Но ругается ошибкой " 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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

__attrubute__((used))

const char name_fw[] PROGMEM = "xxxx";

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде получилось. И получилось двумя способами: способ от 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 отдельное спасибо за ссылочку. Она еще мне пригодиться)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

 

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...