|
|
 |
Ответов
|
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, 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)
|
|
|
|
|
Sep 10 2015, 12:37
|
Участник

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

|
Цитата(Сергей Борщ @ Sep 9 2015, 15:00)  И тем самым отключить выбрасывание всех неиспользуемых переменных. Если бы у меня возникла необходимость оставить в памяти неиспользуемую константу, я бы поместил ее в отдельную секцию (__attribute__((section("имя_секции")))) и разместил бы эту секцию именно туда, где она мне нужна, запретив линкеру ее выкидывать ( KEEP(*(имя_секции)) ) Что то не получается у меня реализовать ваш пример. Где я ошибся??? Код const char name_fw[5] PROGMEM = "xxxx"; __attribute__ ((section (".init3"))); KEEP(*(".init3"));
|
|
|
|
|
Sep 10 2015, 13:47
|
Участник

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

|
Цитата(demiurg_spb @ Sep 10 2015, 15:55)  Вы собственно не применили атрибут. Код const char __attribute__ ((section (".init3"))) name_fw[5] = "xxxx"; KEEP(*(".init3")); Теперь ругается на звездочку: expected declaration specifiers or '...' before '*' token
|
|
|
|
|
Sep 10 2015, 19:05
|

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

|
Цитата(Twin_by @ Sep 10 2015, 16:47)  Теперь ругается на звездочку: expected declaration specifiers or '...' before '*' token Так строку KEEP(*(".init3")) надо в скрипт лнкера вписывать, чтобы он знал, в какое именно место памяти надо вашу строку разместить. И не стоит использовать секции .initX - они уже используются стартапом. Цитата(Spider @ Sep 9 2015, 16:04)  а не расскажете как заставить make пересобирать конкретный *.c даже если в нём не было изменений? touch my_file.c & make Чаще всего такая необходимость возникает при смене каких-то ключей в makefile. А поскольку мы заранее не знаем, какие файлы это может затронуть, лучше заставить make пересобирать все файлы при изменении makefile. У меня список всех объектных файлов собирается в переменной OBJ, поэтому в makefile присутствует строка: Код $(OBJ): makefile
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 11 2015, 06:43
|
Участник

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

|
Цитата(Сергей Борщ @ Sep 10 2015, 22:05)  Так строку KEEP(*(".init3")) надо в скрипт лнкера вписывать, чтобы он знал, в какое именно место памяти надо вашу строку разместить. И не стоит использовать секции .initX - они уже используются стартапом. А какую секцию лучше использовать? Я кроме этих секций AVR GCC: секции памяти (что такое .text, .data, .bss, .noinit?) , других не знаю. И второй вопрос где и как отредактировать скрипт линкера или где можно прочитать про него? Так чтобы на доступном языке. Я с этими вещами первый раз столкнулся поэтому опыта в этом маловато.
|
|
|
|
|
Sep 11 2015, 07:16
|

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

|
Цитата(Twin_by @ Sep 11 2015, 09:43)  А какую секцию лучше использовать? Я кроме этих секций AVR GCC: секции памяти (что такое .text, .data, .bss, .noinit?) , других не знаю. Пока вы глубоко в этом не разобрались, добавлять можно в .text. Добавлять в .data не очень хорошо - вы получите копию вашей строки в ОЗУ. .bss, .noinit - тоже ОЗУ, но в отличие от .data их содержимое вообще в прошивку не попадает. Цитата(Twin_by @ Sep 11 2015, 09:43)  И второй вопрос где и как отредактировать скрипт линкера Поищите в комплекте вашего компилятора файлы с расширением .ld Посмотрите их содержимое, почитайте комментарии в них. выберите тот, который подходит к вашему процессору (можно было каким-то ключем линкера узнать, какой из них он использует по-умолчанию для вашего процессора, но я не помню какой именно ключ нужен. Вы можете найти его самостоятельно, почитав документацию на линкер Google->"gnu ld"). Копируйте выбранный файл в папку проекта, дайте ему внятное имя и укажите линкеру использовать этот файл (в командную строку линкера добавьте -Wl,-T,имя_файла_скрипта). Цитата(Twin_by @ Sep 11 2015, 09:43)  или где можно прочитать про него? Так чтобы на доступном языке. Не знаю, насколько доступен для вас английский. По ссылке выше в документации на линкер это раздел "3 Linker Scripts". Можете поискать перевод.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 11 2015, 13:05
|
Участник

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

|
Цитата(Сергей Борщ @ Sep 11 2015, 10:16)  Поищите в комплекте вашего компилятора файлы с расширением .ld Посмотрите их содержимое, почитайте комментарии в них. выберите тот, который подходит к вашему процессору (можно было каким-то ключем линкера узнать, какой из них он использует по-умолчанию для вашего процессора, но я не помню какой именно ключ нужен. Вы можете найти его самостоятельно, почитав документацию на линкер Google->"gnu ld"). Копируйте выбранный файл в папку проекта, дайте ему внятное имя и укажите линкеру использовать этот файл (в командную строку линкера добавьте -Wl,-T,имя_файла_скрипта). Что удалось узнать пока. Файлы ld Atmel Studio как таковые не использует. Она использует файлы в папке c:\WinAVR-20100110\avr\lib\ldscripts\avr2.* (avr2.* имеет поддержку процессора Attiny88 http://microsin.net/programming/avr/avr-gcc-options.html ) имеющие следующие описание: *.x script file is the default script *.xr script is for linking without relocation (-r flag) *.xu script is like .xr but *do* create constructors (-Ur flag) *.xn script is for linking with -n flag (mix text and data on same page). *.xbn script is for linking with -N flag (mix text and data on same page). Why are there five different linker scripts?Вот тут даются рекомендации по использованию своего скрипта AVR Libc Reference Manual Controlling the linker avr-ld. Там они предлагают заменить стандартный avr2.x на свой. Что я потом сделал. Я скопировал файл avr2.x в папку с проектом (там где Makefile, *.o, *.d), переименовал его в version_fw.x. Отредактировал его содержимое, добавив Код *(.text) KEEP(*(.text)) строчка 75 Потом в Atmel Studio main Properties -> Toolchain -> AVR/GNU Linker/Miscellaneous прописал -Wl,-T,-version_fw.x (или -version_fw). И при компилирование снова выдал ошибку: expected declaration specifiers or '...' before '*' token Прикрепил файл, расширение сменить на *.x
|
|
|
|
|
Sep 11 2015, 13:32
|

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

|
Цитата(Twin_by @ Sep 11 2015, 16:05)  Код *(.text) KEEP(*(.text)) Тут имя секции .text не подходит. При линковке есть понятие "входные секции" - это которые компилятор создает в объектных файлах из вашего исходника и "выходные секции" - это в которые линкер складывает входные секции. То есть линкер берет входные секции и размещает их в выходные согласно скрипта. В выходном файле входных секций уже нет, в нем только выходные. Вы правильно разместили свою секцию внутри выходной секции .text. Но имя вашей секции надо было дать какое-то другое. Имя .text компилятор использует для кода. Цитата(Twin_by @ Sep 11 2015, 16:05)  Потом в Atmel Studio main Properties -> Toolchain -> AVR/GNU Linker/Miscellaneous прописал -Wl,-T,-version_fw.x (или -version_fw). Минус лишний перед именем скрипта:-Wl,-T,version_fw.x Цитата(Twin_by @ Sep 11 2015, 16:05)  И при компилирование снова выдал ошибку: expected declaration specifiers or '...' before '*' token А вы строчку KEEP(*(".init3")) из исходника убрали? Попробуйте так: В исходнике Код __attribute__ ((section (".fw_version"))) const char name_fw[] = "xxxx"; В скрипте линкера: Код *(.text) /*тут где-то еще должно быть*/ *(.text.*) KEEP(*(.fw_version))
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Twin_by Прописывание версии ПО (прошивки) Sep 7 2015, 08:04 KSN Попробуйте объявить через __root Sep 7 2015, 08:05 V_G Пишу в AVRStudio на ассемблере.
Вот такая строка в... Sep 7 2015, 08:24  Kovrov Цитата(V_G @ Sep 7 2015, 12:24) Пишу в AV... Sep 9 2015, 08:58 pyzhman /* Turn optimization off, for testing purposes */
... Sep 7 2015, 08:33 ЯadiatoR Да что вы мучаетесь? напишите const volatile и буд... Sep 7 2015, 08:45 Spider Цитата(ЯadiatoR @ Sep 7 2015, 11:45) Да ч... Sep 7 2015, 08:53 Twin_by Цитата(ЯadiatoR @ Sep 7 2015, 11:45) Да ч... Sep 7 2015, 10:05  Jury093 Цитата(Twin_by @ Sep 7 2015, 13:05) Попро... Sep 7 2015, 13:10 EvgenWL Twin_by, а как Вы на работающем устройстве определ... Sep 7 2015, 09:18 esaulenka Компилятор-то какой?
Для gcc можно использовать
... Sep 7 2015, 13:27          Twin_by Цитата(Сергей Борщ @ Sep 11 2015, 16:32) ... Sep 11 2015, 14:03 V_G Уже не помню. Лет 15 назад, когда начинал работать... Sep 9 2015, 11:27 Spider Раз уж такая пьянка, а не расскажете как заставить... Sep 9 2015, 13:04 demiurg_spb Цитата(Spider @ Sep 9 2015, 16:04) Раз уж... Sep 9 2015, 13:38  msalov Цитата(demiurg_spb @ Sep 9 2015, 16:38) Ц... Sep 10 2015, 14:00 Сергей Борщ Цитатаinternal error:Это ошибка в линкере. По-хоро... Sep 11 2015, 14:53 Twin_by Цитата(Сергей Борщ @ Sep 11 2015, 17:53) ... Sep 14 2015, 06:17  Сергей Борщ Цитата(Twin_by @ Sep 14 2015, 09:17) А ес... Sep 14 2015, 07:55   Twin_by Цитата(Сергей Борщ @ Sep 14 2015, 10:55) ... Sep 14 2015, 11:30    Сергей Борщ Цитата(Twin_by @ Sep 14 2015, 14:30) Помо... Sep 14 2015, 12:05     Twin_by Цитата(Сергей Борщ @ Sep 14 2015, 15:05) ... Sep 14 2015, 12:53      Сергей Борщ Цитата(Twin_by @ Sep 14 2015, 15:53) А я ... Sep 14 2015, 14:11
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|