| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Област с 0x00 в края на генерирания от GCC bin http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=16275 |
Страница 1 от 2 |
| Автор: | Nikola Kirov [ Вто Дек 25, 2018 2:08 pm ] | ||||||||||||||||||
| Заглавие: | Област с 0x00 в края на генерирания от GCC bin | ||||||||||||||||||
Направо ме подлуди този път. Вече 7-8 часа се боря. В края на бинарния файл имам голяма област с нули и то извън диапазона за flash който съм задал. Процесора е Атмелски Cortex M0 и Компилирам с Atml Studio. Това ми е линкерския скрипт:
Но упорито гадината слага някакви нули отзад. Интересно е като извадя hex файл се получава това в края.
Изглежда че отнякъде се слага секция извън диапазона за rom който съм задал. И в бинарния фал между края на програмата и това запълва с нули. Като откоментирам .CRC секцията си я слага на мястото и след този адрес пак същите нули. Вече ми писна и пуснах един питонски скрипт изхода да изреже излишното. Някой да има повече опит и да има идеи. Моите се изчерпаха. Почвам да си мисля че output converter-a който ползва Atmel Studio прави идиотията но не ми е ясно как да изясня случая. |
|||||||||||||||||||
| Автор: | Zdrav [ Вто Дек 25, 2018 11:31 pm ] | ||||||||||||||||||
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin | ||||||||||||||||||
Пробва ли така?
Друг вариант е да направиш отделен регион за CRC-то:
|
|||||||||||||||||||
| Автор: | Nikola Kirov [ Сря Дек 26, 2018 10:29 am ] |
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin |
Може би не съм обяснил правилно, с CRC то и без него все си имам такъв регион с нули. Просто като го включа за тест го слага на верния адрес и нулите си продължават. Това го писах само като някаква допълнителна зависимост която открих. |
|
| Автор: | Zdrav [ Сря Дек 26, 2018 10:46 am ] |
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin |
Да, на някои места ми се губеше нишката на обясненията. А .map файл имаш ли генериран? -T mapfile.map при извикването на линкера. В .map файла би трябвало да видиш какво мапва на тези адреси. Възможно е да имаш входна секция, която не е указано в линкер скрипта, къде в коя изходна секция да отиде.Вероятно имаш секция за която линкера предполага, че трябва да се инициализира и съответно заделя и в rom региона неявно секция с нули която се предполага при стартъп да бъде качена в ram. |
|
| Автор: | Nikola Kirov [ Сря Дек 26, 2018 1:25 pm ] | |||||||||
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin | |||||||||
Гледам ама нищо не е отбелязано след CRC32 то. Ето я тази част която гледам:
Ако някъде другаде във файла може да е отбелязано, то не се сещам къде. |
||||||||||
| Автор: | Nikola Kirov [ Сря Дек 26, 2018 1:34 pm ] |
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin |
Всъщност имам версия която е с орязана функционалност. Тоест генерира по малко код. При нея генерирания бин е в размера на rom от линкерския скрипт. Но областта с нули е след генерирания код. |
|
| Автор: | Zdrav [ Сря Дек 26, 2018 3:11 pm ] |
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin |
Имам смътен спомен че и аз съм срещал този проблем. Останало ми е в главата, че заклинанието (NOLOAD) го решаваше. Според мен съмнението, че някой Атмелски-Микрочипски output converter прави проблемите може да се провери като ръчно изгенерираш от .elf файла hex файл с objcopy(вероятно при теб е arm-none-eabi-objcopy). И най-вероятно при теб за генерирането на hex файла се ползва точно objcopy, а не някакъв convertor. Кои версии на gcc и ld се ползват? |
|
| Автор: | Nikola Kirov [ Сря Дек 26, 2018 4:10 pm ] | |||||||||
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin | |||||||||
Ебаси и лайняната работа.
Точно това заклинание оправи работата. Но какъв му е зора? Нали това е секция в рама? Много благодаря за подсказките |
||||||||||
| Автор: | Zdrav [ Сря Дек 26, 2018 4:32 pm ] |
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin |
Странното е че вероятно има неявно насочени/мапнати входни секции към .no_init В .map файла виждат ли се някакви секции в .no_init ? Вероятно там отиват неинициализирани променливи от къстъм входна секция. Т.е. неинициализирани, но не са насочени към .bss В този случай явно линкера решава да генерира същия по размер блок с 0x00, за да може стартъп кода да "зареди" тези нули и да инициализра с нули къстъм секцията в RAM-a. Потърси тези къстъм секции или из .map файла или като пуснеш търсене из всички .с сорс файлове на проекта за променливи сложени в къстъм секции. Търсиш __attribute__ и преглеждаш всички които имат следния вид: ((section(".име на къстъм секция"))) после в линкер скрипта насочваш тези секции към изходни секции и слагаш заклинанието (NOLOAD) на тези изходни секции. Поне да бъдат явно насочени/мапнати. |
|
| Автор: | Nikola Kirov [ Сря Дек 26, 2018 5:10 pm ] |
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin |
Хм , нали идеята на no_init секцията е че тази област не се инициализира? Тази секция не е някаква моя секция а се ползва за променливите които са __no_init обявени. |
|
| Автор: | Nikola Kirov [ Сря Дек 26, 2018 7:37 pm ] | |||||||||
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin | |||||||||
Уф GCC то си е ебало майката. След поправката генерирания бин е неработоспособен. След още доста блъскане на главата използвах синтаксиса на .bss секцията и стана така
Така си работи и не генерира излишни нули в края. |
||||||||||
| Автор: | Zdrav [ Сря Дек 26, 2018 9:41 pm ] |
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin |
Да, това имах предвид. В началото имаше просто една празна изходна секция .no_init Връзката между входна и изходна не става по име. Така както си го направил сега, вътре в блока на изходната секция .no_init имаш мапнати от всички обекти, входните секции .no_init както и секциите чието име започва с този стринг т.е. .no_init.* Това че имената на входна и изходна секция са същите е съвпадение. За име на изходна секция би трябвало да можеш да сложиш каквото име си избереш. Обаче как и защо преди това е мапвал точно тези секции в точно тази изходна секция е неясно. |
|
| Автор: | Nikola Kirov [ Сря Дек 26, 2018 10:45 pm ] |
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin |
Нямаше нищо в map файла свързано с no_init. Извратена работа. Поне някакво предупреждение да изгенерира. Изобщо колкото пъти съм стигал да правя нещо по линкерски конфигурационен файл на GCC все някакъв главобол е имало. |
|
| Автор: | ДедоБоре [ Чет Дек 27, 2018 10:29 am ] |
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin |
e, то писането на линкер скриптове вече се доближава до стария стил на sendmail конфига... и (уж за твое добро) в съвременните среди, тя замества естествения интелект и ти го генерира скрипта всеки път. съответно съвсем вече нищо не знаеш какво и къде отива. ако компилираш чужд сорс, може да има някаква вероятност някоя дефиниция да му се вижда на gcc-то като константа, без да е инициализирана с по-сложните кортекси (м7, примерно) е по-комплицирано излюването на пиленцето - копирането на .data в паметта, евентуално функции от .text в TCM и подобни алабализми, ама за кортекс М0... балигу. |
|
| Автор: | relsys [ Нед Дек 30, 2018 2:37 pm ] | |||||||||
| Заглавие: | Re: Област с 0x00 в края на генерирания от GCC bin | |||||||||
А имаш ли тогава логично обяснение що го ползваш...? |
||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|