|
Прописывание версии ПО (прошивки) |
|
|
|
Sep 7 2015, 08:04
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 3-09-11
Из: Минск
Пользователь №: 66 982

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

Профессионал
    
Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955

|
Пишу в AVRStudio на ассемблере. Вот такая строка в кодовом сегменте: Код Version: .DB __DAY__,__MONTH__,__YEAR__,__HOUR__,__MINUTE__,__SECOND__ ;версия ПО пропишет в память дату и время компиляции прошивки (удобнее,чем № версии). Если нет аналогичной возможности на Си, попробуйте сделать ассемблерную вставку.
|
|
|
|
|
Sep 7 2015, 08:33
|
Группа: Новичок
Сообщений: 1
Регистрация: 29-03-12
Из: Тольятти
Пользователь №: 71 064

|
/* Turn optimization off, for testing purposes */ #pragma opt-
/* Turn optimization on */ #pragma opt+
|
|
|
|
|
Sep 7 2015, 10:05
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 3-09-11
Из: Минск
Пользователь №: 66 982

|
Цитата(ЯadiatoR @ Sep 7 2015, 11:45)  Да что вы мучаетесь? напишите const volatile и будет вам счастье Volatile не помогает, при оптимизации строчка выкидывается Цитата(EvgenWL @ Sep 7 2015, 12:18)  Twin_by, а как Вы на работающем устройстве определяете версию залитой в него прошивки? Напишите команду чтения версии вот и будет обращение к строке и никаких volatile не понадобится. А на работающем никак не определить версию ПО. Этого и не нужно. Нужно после того как сняли модуль, прочитать микроконтроллер и с помощью hex-editor (XVI32) найти имя прошивки. Цитата(V_G @ Sep 7 2015, 11:24)  Пишу в 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");
|
|
|
|
|
Sep 7 2015, 13:10
|
Знающий
   
Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050

|
Цитата(Twin_by @ Sep 7 2015, 13:05)  Попробовал ваш вариант. Но ругается ошибкой " 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)
|
|
|
|
|
Sep 7 2015, 13:27
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Компилятор-то какой? Для gcc можно использовать __attrubute__((used)) const char name_fw[] PROGMEM = "xxxx"; Подробности: https://gcc.gnu.org/onlinedocs/gcc-5.2.0/gc...able-Attributes
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Sep 8 2015, 10:57
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 3-09-11
Из: Минск
Пользователь №: 66 982

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

Мастер-фломастер
   
Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700

|
Цитата(V_G @ Sep 7 2015, 12:24)  Пишу в AVRStudio на ассемблере. Вот такая строка в кодовом сегменте: Код Version: .DB __DAY__,__MONTH__,__YEAR__,__HOUR__,__MINUTE__,__SECOND__ ;версия ПО пропишет в память дату и время компиляции прошивки (удобнее,чем № версии). Если нет аналогичной возможности на Си, попробуйте сделать ассемблерную вставку. слушайте действительно работает! а где вы вычитали эту фичу?
--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
|
|
|
|
|
Sep 9 2015, 12:00
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Twin_by @ Sep 8 2015, 13:57)  Поэтому, чтобы прописать версию прошивки (ПО) нужно было убрать флаг -fdata-sections И тем самым отключить выбрасывание всех неиспользуемых переменных. Если бы у меня возникла необходимость оставить в памяти неиспользуемую константу, я бы поместил ее в отдельную секцию (__attribute__((section("имя_секции")))) и разместил бы эту секцию именно туда, где она мне нужна, запретив линкеру ее выкидывать ( KEEP(*(имя_секции)) )
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|