Twin_by 0 7 сентября, 2015 Опубликовано 7 сентября, 2015 · Жалоба Всем здравствуйте! Столкнулся с проблемой и никак не могу найти ее решение. Стоит задача прописывать в файле программы main.c имя версии. Я пробовал объявлять строку const char name_fw[] = "xxxx"; или const char name_fw[] PROGMEM = "xxxx"; Но при оптимизации эта строка вырезается т.к. в программе она нигде не используется. В итоге main.hex не содержит информации о версии ПО, и при считывании прошивки с микроконтроллера поди угадай какая версия туда была залита. Подскажите как можно решить эту проблему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KSN 0 7 сентября, 2015 Опубликовано 7 сентября, 2015 · Жалоба Попробуйте объявить через __root Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 11 7 сентября, 2015 Опубликовано 7 сентября, 2015 · Жалоба Пишу в AVRStudio на ассемблере. Вот такая строка в кодовом сегменте: Version: .DB __DAY__,__MONTH__,__YEAR__,__HOUR__,__MINUTE__,__SECOND__ ;версия ПО пропишет в память дату и время компиляции прошивки (удобнее,чем № версии). Если нет аналогичной возможности на Си, попробуйте сделать ассемблерную вставку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pyzhman 0 7 сентября, 2015 Опубликовано 7 сентября, 2015 · Жалоба /* Turn optimization off, for testing purposes */ #pragma opt- /* Turn optimization on */ #pragma opt+ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 7 сентября, 2015 Опубликовано 7 сентября, 2015 · Жалоба Да что вы мучаетесь? напишите const volatile и будет вам счастье Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 7 сентября, 2015 Опубликовано 7 сентября, 2015 · Жалоба Да что вы мучаетесь? напишите const volatile и будет вам счастье Опередил :) +1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EvgenWL 0 7 сентября, 2015 Опубликовано 7 сентября, 2015 · Жалоба Twin_by, а как Вы на работающем устройстве определяете версию залитой в него прошивки? Напишите команду чтения версии вот и будет обращение к строке и никаких volatile не понадобится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Twin_by 0 7 сентября, 2015 Опубликовано 7 сентября, 2015 · Жалоба Да что вы мучаетесь? напишите 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"); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 7 сентября, 2015 Опубликовано 7 сентября, 2015 · Жалоба Попробовал ваш вариант. Но ругается ошибкой " 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 7 сентября, 2015 Опубликовано 7 сентября, 2015 · Жалоба Компилятор-то какой? Для gcc можно использовать __attrubute__((used)) const char name_fw[] PROGMEM = "xxxx"; Подробности: https://gcc.gnu.org/onlinedocs/gcc-5.2.0/gc...able-Attributes Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Twin_by 0 8 сентября, 2015 Опубликовано 8 сентября, 2015 · Жалоба Вроде получилось. И получилось двумя способами: способ от 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 отдельное спасибо за ссылочку. Она еще мне пригодиться) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BALDA 0 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Пишу в AVRStudio на ассемблере. Вот такая строка в кодовом сегменте: Version: .DB __DAY__,__MONTH__,__YEAR__,__HOUR__,__MINUTE__,__SECOND__ ;версия ПО пропишет в память дату и время компиляции прошивки (удобнее,чем № версии). Если нет аналогичной возможности на Си, попробуйте сделать ассемблерную вставку. слушайте действительно работает! а где вы вычитали эту фичу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 11 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Уже не помню. Лет 15 назад, когда начинал работать с AVR-ками. __DAY__ и прочее - это специфические константы avr-ассемблера. Видимо, в хэлпе по ассемблеру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Поэтому, чтобы прописать версию прошивки (ПО) нужно было убрать флаг -fdata-sectionsИ тем самым отключить выбрасывание всех неиспользуемых переменных. Если бы у меня возникла необходимость оставить в памяти неиспользуемую константу, я бы поместил ее в отдельную секцию (__attribute__((section("имя_секции")))) и разместил бы эту секцию именно туда, где она мне нужна, запретив линкеру ее выкидывать ( KEEP(*(имя_секции)) ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Раз уж такая пьянка, а не расскажете как заставить make пересобирать конкретный *.c даже если в нём не было изменений? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться