|
|
 |
Ответов
|
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)
|
|
|
|
Сообщений в этой теме
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, 10:16) ... Sep 11 2015, 13:05         Сергей Борщ Цитата(Twin_by @ Sep 11 2015, 16:05) Код*... Sep 11 2015, 13:32          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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|