Отговори на тема  [ 31 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща
GCC - НЕинициализирани променливи? 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
ясно. Със секции си става. Ама що пък трябва да е лесно, като може и да е сложно :?

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Вто Юни 16, 2009 12:59 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
Да указваш на ниво сорс адреси няма особен смисъл (какви ще ги върши линкера тогава) и не прави нещата лесни. :)


Вто Юни 16, 2009 1:34 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Да бе, така го виждаш ти. От мойта камбанария изглежда тъпо да не може. За конкретния случай не е проблем. Става въпрос за версията която трябва да се съхранява на края на бинарния имидж като стринг. Ама се сещам за едно приложение в което имах 20 тина стринга разхвърляни в отделни страници в паметта. То щеше да падне едно описване на секции.....

Всички комерсиални среди с които съм работил го правят това директно на ниво сорс - ръгаш location=нещо си и забравяш.... Какъв е проблема? Естествено тогава това чудо наречено линкер скрипт език започва да се обезмисля, а това би било кошмар за GNU гилдията. Сакън, как така няма да имат линкер скриптове :)

Всъщност 90% от потребителите на комерсиални среди, даже не знаят, че съществува такова животно като линкерски скрипт. Просто указват процесора на средата и почват да пишат :)

То това с линкерския скрипт нямаше да е толкова страшно ако имаше човешка документация. Ама документацията на ld е такава каша, че само човека който я е писал, може да намери вътре каквото му трябва :)

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Вто Юни 16, 2009 3:37 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
Цецо спри се. Плашиш хората. Нещата не са толкова лоши. :D
Щом като ламер като мене успя да намери документация, да я разбере и да си пише сам линкер скриптовете от нула не е такава каша.
Какво толкова сложно има в описването на една секция?

_________________
Най-опасният враг на истината и свободата е мнозинството.


Вто Юни 16, 2009 3:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11278
Местоположение: Добрич
Мнение 
Цецо е прав за някои неща, ама няма как да стане... и хората не искат да става ;-)

Рано или късно трябва да се направи избор - или правиш платформонезависими неща или правиш не конкрентно. И едното си има предимства и недостатъци съответно и другото.

Ако избереш някой комерсиален продукт ще имаш точните инструменти и #pragma location и т.н. Но тия неща ще бачкат само на това нещо, защото те са си НЕСТАНДАРТНИ. Утре ако тръгнеш на нещо друго и трбябва да преправяш всичко. Просто неща като location си зависят от таргета - дали ти е фон нойман, дали имаш предвид вирутална памет или физическа, страници, банки и т.н.
GCC идеологията е да се гони стандартизация и правят всичко възможно да ти стъжнят живота ако тръгнеш да излизаш от коловоза... Това е нормално щото едно нещо не е ли стандартизирано и всеки прави каквото си иска става манджа с грозде, а пък GCC-феновете по принцип са много и без друго забъркват големи манджи...

От друга страна GCC се развива предимнно от и за големи фирми, където хората си имат разделение на труда - един пише С и пише чисто С, друг прави мейкове и линкове.. Абе изобщо има много обесняния и логика защо всичко е така.

Все пак ако решиш да излезеш от коловоза можеш да го направиш - дефакто с GCC може всичко да направиш, стига да си достатъчно упорит ;-)
Въпорсът е че по принцип не е добра идея да разполагаш кдето ти падне разни неща... Буквално залагаш бомбички.


Вто Юни 16, 2009 5:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
miro_atc написа:
Все пак ако решиш да излезеш от коловоза можеш да го направиш - дефакто с GCC може всичко да направиш, стига да си достатъчно упорит ;-) Въпорсът е че по принцип не е добра идея да разполагаш кдето ти падне разни неща... Буквално залагаш бомбички.


Ми в случая нищо опасно няма. Просто по изискване (незнам откъде дошло), версията на фирмуера трябва да се вижда като стринг в края на bin файла. Идеята е в пройзводството, при програмиране, лесно да се разпознава версията независимо от името на файла. В което има логика.

Както и да е - със секция номера минава.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Вто Юни 16, 2009 5:22 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11278
Местоположение: Добрич
Мнение 
Абе подходът със секции никак не е лош, замисли се само сорс кодът ти ще изглежда по един и същ начин, независимо дали проекта ти е за PIC или за някой многоядрен паралелен дзвер, дето идея си нямаш каква му е организацията на паметта.
Всъщност ти дори няма нужда да слагаш нищо в сорса ако е само версията. Mоже в мейка да си сложиш скрипт дето вика cvs, парсва резултата за да извлече ревизията, подава я като параметър на линкера и тоя добавя към края на фърмуера ти... Не че те го препоръчвам де, щото това са излишни сложнотии. Ама в крайна сметка ако е някаква традиция във фирмата - правите го веднъж и после го ползвате за всякакви проекти с GCC - почти *независимо* какъв професор ползвате...


Вто Юни 16, 2009 6:45 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Нед Ное 28, 2004 10:02 pm
Мнения: 141
Местоположение: София
Мнение 
Имам и аз едно питане, от спортна злоба:

Как, аджеба, да накарам тъпия линкер да сложи един масив на точно определено място във флаша (чипа беше някакъв по-елементарен STM, май 101-нещо си)?
С дефиниране на област от флаша и използване на секции не ще - слага го в рам-а 8O

Код:
...
FLASHB32 (rx)  : ORIGIN = 0x08007C00, LENGTH = 1K;  //в линкер скрипт-а
...
uc8 FlashBuffer[BUFSIZE] __attribute__((section ("FLASHB32")));    // в сорса


В крайна сметка в пристъп на ужас и безумие стана с това:
woody написа:
...но пробвай да сложиш в линкер скрипта в правилната секция:
str = 0x1234;
...

Става, само че не го слага на адреса, който съм сложил, а го отмества (вместо на 8007C00, го слага на 8007D0C). В случая върши работа, 'щото е в същия сегмент, но не е чисто. В крайна сметка "проектът" мина и замина, но това отместване не ми дава да спя спокойно все още...

Това всичкото е с GCC, "пакетирано" в най-гнусната среда на света (поне аз по-гнусна не съм виждал, може би съм се разлигавил с IAR) - Ride7, която "уж" е безплатна, само че може да дебъгва до 32к, за повече искат много кеш (и целия бой с GCC-то се обезсмисля, поне за мен), но това бяха пратили и с това трябваше да си блъскам главата... :cry:


Пон Юни 07, 2010 9:11 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2692
Мнение 
woody написа:
Да указваш на ниво сорс адреси няма особен смисъл (какви ще ги върши линкера тогава) и не прави нещата лесни. :)


форума е за микроконтролери все пак, на пецето хич не ми пука кое на какъв адрес е, ама на микроконтролера ми пука.


Пон Юни 07, 2010 10:09 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 13, 2007 12:12 pm
Мнения: 712
Мнение 
Змийо, вземи се порови малко в нета - помага по някога! :)
http://support.code-red-tech.com/CodeRe ... serveFlash
http://www.stm32circle.com/forum/viewtopic.php?pid=4686


Пон Юни 07, 2010 10:15 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
zaphod написа:
woody написа:
Да указваш на ниво сорс адреси няма особен смисъл (какви ще ги върши линкера тогава) и не прави нещата лесни. :)


форума е за микроконтролери все пак, на пецето хич не ми пука кое на какъв адрес е, ама на микроконтролера ми пука.

Да указваш на ниво сорс адреси няма особен смисъл ...[/b]


Сря Юни 09, 2010 4:37 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11278
Местоположение: Добрич
Мнение 
zmej написа:
С дефиниране на област от флаша и използване на секции не ще - слага го в рам-а 8O


Не знам как си дефинирал uc8, но по принцип ти трябва "const uc8" ако искаш да го разположиш в read only секция...

Цитат:
В крайна сметка в пристъп на ужас и безумие стана с това:
woody написа:
...но пробвай да сложиш в линкер скрипта в правилната секция:
str = 0x1234;
...

Става, само че не го слага на адреса, който съм сложил, а го отмества (вместо на 8007C00, го слага на 8007D0C).


В случая инициализираш указател, не разполагаш нищо никъде... Най-вероятно си направил някаква каша като на едно място декларираш масив, а на друго място указател със същото име.


Цитат:
В случая върши работа, 'щото е в същия сегмент, но не е чисто. В крайна сметка "проектът" мина и замина, но това отместване не ми дава да спя спокойно все още...

Може да спиш спокойно ;-)

LD-то създава секциите на адрес на който му кажеш. Ако няма проблем със storage типа, компилатора разполага нещата в секцията която си указал. А пък "отместване" обикновено се получава, когато по невнимание сложиш повече от 1 обект в дадената секция. Винаги е добре да си пуснеш един листинг и да видиш какво къде е разположено...
Най-сигурният начин да сложиш даден обект на определен адрес е да направиш специална секция само за този обект, т.е. да не слагаш нищо друго в тая секция. Ако ще слагаш повече обекти в една секция може да ползваш сортиране (SORT() ) по име на секция/под-секция. Сортирането обикновено се ползва когато искаш нещо да се разполага след друго нещо, но трябва да внимаваш по какво точно ти е сортировката...


Сря Юни 09, 2010 8:34 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Нед Ное 28, 2004 10:02 pm
Мнения: 141
Местоположение: София
Мнение 
Миро, в това "дрВо" uc8 е тайпдефнат "const unsigned char". Предполагам, че бях омазал нещо фатално по скриптовете, че да го набие в рам-та, ама това вече е абсурд:
miro_atc написа:
Най-вероятно си направил някаква каша като на едно място декларираш масив, а на друго място указател със същото име.

В момента работи с ей това простичко нещо - декларирам си буфера като uc8 без никакви атрибути (нормален неинициализиран стринг, който да набие във флаша - uc8 FlashBuffer[BUFSIZE];), и в скрипта (секцията на флаша) по най-дърварския начин му казвам "FlashBuffer = 0x08007C00;". Засега работи, само че и в map-а, и като дебъгвам, указателя за начало на масива не е на 0x08007C00, а на 0x08007D0C ?!?!?!
В момента ме устройва, защото го набива само в един сегмент (последният въф флаша), и съответно не се налага да трия два при промяна на данните. Проблемът, който ме дразни и затова казвам, че не е чисто, е, че в момента програмката е тъпа и миниатюрна - не стига и половина флаш; ама по принцип трябва сегментът, в който си пиша глупостите, да може да бъде защитен от ръгане на код (и каквото и да е други данни), а да може да си се ползва само за "глупостите". Това по "дърварския" начин не мога да направя.

А с това:
Цитат:
...Да указваш на ниво сорс адреси няма особен смисъл...

не съм съгласен - най-малкото е предпоставка за грешки.


Пет Юни 18, 2010 1:28 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11278
Местоположение: Добрич
Мнение 
Човеко, правиш някакви свободни съчинения...


zmej написа:
В момента работи с ей това простичко нещо - декларирам си буфера като uc8 без никакви атрибути (нормален неинициализиран стринг, който да набие във флаша - uc8 FlashBuffer[BUFSIZE];),


uc8 FlashBuffer[BUFSIZE]; - това декларира масив, който трябва да бъде разположен в data секция. Компилаторът няма представа за флаш и "набиване" във флаш...

Грешките тук са много... първо декларираният обект НЕ Е const и затова линкерът трябва да го разположи в data, а тази секция си е с read+write атрибути и би било глупост да я слагаш във флаш...
Второ, нямаш указано нищо, така че линкерът може да разположи обекта където и да е било в дата секцията.


Цитат:
и в скрипта (секцията на флаша) по най-дърварския начин му казвам "FlashBuffer = 0x08007C00;".


Това декларира символ. Символите имат само стойност, но те НЕ СЕ разполагат НИКЪДЕ. Просто стойност!
Няма никаква връзка между "символа" FlashBuffer със стойност 0x08007C00, който си декларирал в линкерския скрипт и "обекта" масив, който си декларирал в сорса... Всъщност има връзка - и двете са с еднакви имена, но иначе са си две съвсем различни неща...

Цитат:
Засега работи

То работи, ама май не както ти си мислиш ;-)

Сега ето ти тук документацията на линкера http://sourceware.org/binutils/docs-2.2 ... ssignments
Обърни внимание на точката Source Code Reference...

Цитат:
по принцип трябва сегментът, в който си пиша глупостите, да може да бъде защитен от ръгане на код (и каквото и да е други данни), а да може да си се ползва само за "глупостите".


Правилният начин за това е да си направиш секция за глупости, която в линкер скрипта да укажеш къде се намира във флаша.... Гледай тая секция да не се бие със секцията ти за код (text) ли за константи (rodata). Линкерът няма да разположи код или други глупости в твоята SHIT секция, докато ти не му кажеш изрично... Това става по следния начин в сорса:

Код:
[b]const[/b] uc8 FlashBuffer[BUFSIZE] __attribute__ ((section (".shit")))  /* = {  инициализация ако искаш} */ ;



Има и алтернативен вариант - в линкерския скрипт да декларираш символа FlashBuffer, да му присвоиш като стойност началния адрес където искаш да е масива. Да се погрижиш това място да се заеме и евентуално да се инициализира с fill или нещо друго. А пък в сорса да ползваш това:

Код:
extern const uc8 FlashBuffer[BUFSIZE];


Пет Юни 18, 2010 3:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2692
Мнение 
woody написа:
zaphod написа:
woody написа:
Да указваш на ниво сорс адреси няма особен смисъл (какви ще ги върши линкера тогава) и не прави нещата лесни. :)


форума е за микроконтролери все пак, на пецето хич не ми пука кое на какъв адрес е, ама на микроконтролера ми пука.

Да указваш на ниво сорс адреси няма особен смисъл ...

има, понеже в мног ослучаи устройството трябва да се рефлашва частично или напълно, тогава изниква проблема че стария код си търси обектите където са били по време на неговото билдване, а новия код също ги търси там където са при неговото билдване. за да се сработят двата кода трябва да има поне един обект с твърдо зададен адрес, който да служи за опорна точка, било то променлива или функция.


Съб Юни 19, 2010 9:22 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 31 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни