Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Позиционно независим код Cortex + gcc
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=9460
Страница 1 от 2

Автор:  setoy [ Вто Окт 25, 2011 11:01 am ]
Заглавие:  Позиционно независим код Cortex + gcc

Как става номера? Убедих се че компилирането с -fpic само по себе си не е достатъчно...

Автор:  miro_atc [ Вто Окт 25, 2011 11:27 am ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

мда.. сложничко е. Преди време се мъчих да го разгадая, но като видях че от версия на версия променят разни неща се отказах да ползвам pic...

Ако много държиш да го подкараш ще помагам (ако мога), но съветът ми е ако можеш по друг начин да го направиш не си губи времето.

Автор:  t_i_t_o [ Вто Окт 25, 2011 1:52 pm ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

По спомени (може и да греша) -fpic добавя GOT (глобална офсет таблица) която оказва разни адреси които трябва да се подменят преди да ти се стартира кода, с други думи кода трябва да се обработи от лоудър преди да се изпълни.

Ако ще правиш по-прости неща, самите АРМ инструкции по съсщество са си адресно независими, т.е. колове и джъмпове. Аз напирмер имам написани на С агенти за програмиране на ФЛАШ които се изпълняват от кой да е адрес от РАМа, просто е важно да е инициализиран стек поинтера преди да предадеш управлението на кода, от там всички локални променливи са в стека. Особеното е, че не трябва да използваш switch-case, защото се генерира код с твърди адреси, а вместо това само if-else.

Горното е тествано и работи на каквито се сетиш процесорни архитектури - ARM, PPC, Cortex, Bfin, ColdFire, AVR32, MIPS...

Автор:  palavrov [ Вто Окт 25, 2011 4:27 pm ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

А защо ти трябва позиционно независим код? С линкерския конфиг на gcc можеш да решиш много проблеми без да се налага кода да е позиционно независим. Обясни проблема, може да се измисли друго решение.

Автор:  tgi [ Вто Окт 25, 2011 6:33 pm ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

А бе щом го иска навярно му трябва. Позиционно независимият код е основно
нещо в програмирането и да се отхвърля само защото не работи някакъв тъп
развоен софтуер просто не е сериозно.

Автор:  palavrov [ Вто Окт 25, 2011 8:25 pm ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

Питам защото поне в моята практика за 20 години единсвтвения позиционно независим код съм писал беше като писах вируси в училище 89-90-та. Другото място където съм виждал такъв код е в bootloaders, bootstrapers, exepackers където винаги става въпрос за малки парчета които се пишат на асемблер. За останалите случаи или се правят магии с конфигурациите на линкера, или се прави примерно някакъв elf лоадер който напасва кода за определен адрес.

Автор:  tgi [ Вто Окт 25, 2011 10:43 pm ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

Хмм, аз пък последните 17 години почти не съм писал друг освен позиционно
независим код (докарвам средно 150к работещ сорс/месец). Не се сещам за
много други начини на писане за мулти-таск машина с динамично резервиране
на паметта и без MMU или с но с линейно транслиране. Нали като стартира
някаква задача ако е писана за фиксиран адрес там просто може да е заета
паметта в момента... Лесно става навик и е добър такъв, другото е кръпка.

Автор:  palavrov [ Вто Окт 25, 2011 11:12 pm ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

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

Автор:  miro_atc [ Вто Окт 25, 2011 11:23 pm ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

Разбира се че се ползва...
Но това няма нищо общо с "тъпия развоен софтуер". GCC към момента поддържа над 40 архитектури, като само АРМ са около 80 деривата. Отделно десетки операционни системи и за всяка различен модел на executables и библиотеки, PAM-ве, овърлеи и всякакви изгъзици.

Проблемът е че позиционно независия код не е стандарт. Няма как на чисто Ц и чисто Ц++ да кажеш ей тая функция е такава или онакава. Отчасти заради М$ и бозата, която и до ден днеше доколкото знам не е особено отворена и DLL се прави легално само с VStudio.
Но и DLL-те и shared libraries до голяма степен скриват от програмиста подробностите. Не се казва "правя позиционно независим код" а "правя библиотека" (динамична или shared).
Разбира се GCC поддържа всички по-известни (и позволени) начини за PIC, включително и за по-неизвестни ОС-ве като Symbian, VxWorks и т.н.

Но тъй като PIC не е стандарт за компилатори, а за ОС-а или обкръжението няма как GCC да го направи без да ги познава. Той дефакто си генерира позиционно независимия код, това е никакъв проблем. Но някой трябва да направи динамичното свързване, защото примерно компилираш Ц++ статичен клас, ама кой ще го инициализира и кога? Изобщо не е толкова просто колкото изглежда!

Ако трябва да се направи като хората, трябва да се портне glib (май?) за bare metal... Ама то от metal до metal разликата е голяма.

Автор:  miro_atc [ Вто Окт 25, 2011 11:27 pm ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

palavrov написа:
А програмирането на флаша за което колегата е писал по горе бих го направил със линкер скрипт в който е указана специална секция за код която се зарежда в дата сегмента т.е. в рам-а.


не става...
не се знае предварително къде ще е 'дата сегмента' ;-)

А пък да прикачаш линкер към относително малък фърмуер....

Автор:  palavrov [ Вто Окт 25, 2011 11:56 pm ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

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

Автор:  tgi [ Сря Окт 26, 2011 3:23 am ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

palavrov написа:
А какво е предимството да го правиш така? Аз бих го направил с elf лоадер - т.е. рънтайм линкер, ефекта е същия. А програмирането на флаша за което колегата е писал по горе бих го направил със линкер скрипт в който е указана специална секция за код която се зарежда в дата сегмента т.е. в рам-а. А като правиш мулти таск машина без мму как да защитаваш тасковете да не си омазват паметта като се изтърве някой бъг?


Предимството е става срещу не става -> минаване към печене на чушки (имаме и
тема за целта :D :D ).
Говоря от опита с моите DPS машини, там практически всичко става в RAM, флашът е само за излизане от reset,
после се явява като периферия (диск). Но и в споменатия контекст работата е пак така,
ако и да не е толкова очевидна.

Опазването на тасковете от омазване един друг няма нищо общо с позиционно независимото
кодиране. Или според тебе машини без MMU трябва да работят само в един таск, как никой не
е прозрял тая работа последните 50-ина години :D .

Автор:  palavrov [ Сря Окт 26, 2011 12:22 pm ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

Е, в твоя случай явно върши работа, но за един микроконтролер с 512кб флаш и 64кб рам това просто не върви. А това дали машини без ММУ трябва да са с мултитаскинг или не си е приказка за бира. Преди 20-30 години когато са се наливали основите на съвременните ПЦ-архитектури и операционните им системи не е имало 32 битови чипове за под $1 и развойни среди за $25, вече живеем в друг свят и можем да решаваме проблемите доста по прагматично - разбирай за всеки таск микроконтолер :D ... въпреки че и на мен ми звучи малко еретично, все пак не е невъзможно. Ама айде да не разваляме темата на човека.

Автор:  tgi [ Сря Окт 26, 2011 12:30 pm ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

Всъщност и най-дребните контролери се ползват масово с мултитаскинг.
И в HC11 , с 512 байта RAM, съм пускал по няколко таска. Не помня да съм
правил с един таск нещо последните 20-ина години.
А да ползва човек контролер с десетки k RAM без мултитаскинг не е приказка
за бира а за бабичките пред блока, що за код ще е това.

Автор:  setoy [ Чет Окт 27, 2011 11:58 am ]
Заглавие:  Re: Позиционно независим код Cortex + gcc

Ех, като гледам колко сериозна стана дискусията... чак ме е срам сега да кажа за каква глупост става въпрос :oops:

За най-тъп боотлоадер, само че исках да върви от RAM-a. Това обаче
Код:
typedef void (*btldr) (void);
btldr knf;
extern unsigned long _btldr_len;
unsigned char buff[4096] __attribute__((aligned(4)));

     w = (unsigned char*) &Btldr;
     for (cnt=0;cnt< ((int) &_btldr_len)  ;cnt++){
        buff[cnt]=*w++;
     }
     knf=(btldr) buff;
     (*knf)();   


води то hard-fault и lockup.
Тъй като същия код си върви от флаша както трябва, реших, че явно щото е позиционно зависим. След бая дзверене в асемблера, от който не разбирам започнах да подозирам че не е от това. Накрая се сетих да проверя фориума на TI (за Луминари става въпрос щото) и там го намерих.

http://e2e.ti.com/support/microcontroll ... spx#420187

Цитат:
So, I thought it would be rather simple:

1. Copy a function (a self-branching opcode) from flash into RAM.
2. Make a function pointer which points to that instruction in RAM.
3. Call the function pointer.
4. Watch it loop.

The problem is, instead of sticking and looping in ram (step 4), it faultISRs when it tries to branch. Is there something I should be doing to enable running from RAM, like some sort of permission?



EDIT: A friend helped me solve this. Turns out that if it's an aligned address, the processor goes into full-length instruction mode. If it's unaligned ( +1) then it stays in thumb mode.


Значи, трябвало да скочиш на неподравнен адрес, иначе тъпото ядро минавало в режим на ARM инструкции, които за съжаление не поддържа въобще и айде право на lockup. 8O
Що за дивотия, и защо като прескача из флаша чрез пойнтери няма проблем с подравнени или неподравнени адреси... ? Така че

Код:
knf=(btldr) (((unsigned int) &buff[0])+1)  ;


въпреки всякаква логика работи. Дивотия, нали ви казах... :oops: Благодаря ви

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/