| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| ARM assembler to C http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=9995 |
Страница 1 от 2 |
| Автор: | ¶ [ Пон Мар 26, 2012 8:56 pm ] | |||||||||
| Заглавие: | ARM assembler to C | |||||||||
Събота и неделя реших да изпробвам CoIDE, защото била out of the box, заработи от раз на няколко машини, изрових от мазето една Luminary демо платка с LM3S8962, пуснах CoOS-а на нея, пуснах IP стека с прост Web сървър, SD картата е по SPI, събраха се 5 задачи и ми хареса как работи CoOS. Та сега искам да я изпробвам и на PIC32. Всичко по CoOS е написано на C, което се компилира безпроблемно на PIC32, има един файл в който има 5 функции, които са на асемблер, двете най-простите от тях ги пренаписах на C, но другите 3 искат по детайлно познаване на Cortex М0-M3 . Някой може ли да удари едно рамо и да напише тези 3 функции на C ? Или поне на всеки ред на ARM асемблера да вмъкне коментар кое къде се копира ( като е при SetEnvironment() ) ? На мен ще ми трябва поне седмица да направя някакъв първоначален порт.... Още инфо което ми трябва: каква е GCC конвенцията при предаване на параметри на функции при ARM Cortex M3 ? Доколкото виждам, ако е един единствен указател, се използва регистъра R0...
|
||||||||||
| Автор: | miro_atc [ Пон Мар 26, 2012 9:52 pm ] |
| Заглавие: | Re: ARM assembler to C |
Пирев, що се занимаваш с глупости? колко пъти да ти казвам, че това е твоят ОС Иначе прехвърлянето на горните функции едва ли ще ти помогне особено... Освен ако нямаш идея как да емулираш Pending service на MIPS-a. SwitchContext() пуска заявка за пендинг сървис, за целта се пише константата NVIC_PENDSVSET в регистър NVIC_INT_CTRL (те имат едно излишно четене за заблуда на противника А пък в хендлъра (PendSV_Handler) правят смяна на контекста. Имат някакви глобални указатели TCBRunning и TCBNext, ако са еднакви пропускат смяната. Иначе спасяват текущия контекст в *TCBRunning, зареждат новия от next-a и го правят running... Такива ми ти работи, само че не виждам какво те топли това. За PIC32 ще трябва да го пренапишеш като за PIC32. |
|
| Автор: | ¶ [ Пон Мар 26, 2012 10:00 pm ] | |||||||||
| Заглавие: | Re: ARM assembler to C | |||||||||
Няма проблем, можеш да го повтаряш колкото си искаш |
||||||||||
| Автор: | fan [ Пон Мар 26, 2012 10:13 pm ] |
| Заглавие: | Re: ARM assembler to C |
Много добре Пирев! |
|
| Автор: | miro_atc [ Пон Мар 26, 2012 10:39 pm ] | |||||||||||||||||||||||||||
| Заглавие: | Re: ARM assembler to C | |||||||||||||||||||||||||||
Ей, луд умора няма И каква е целта (ако не тайна)? Иначе като ще се трепеш, що не вземеш да направиш твоя версия... мисля че мога да ти помогна с разни идеи. Особено ако целта ти е да направиш нещо просто и ефикасно. Примерно ето как изглежда при мен смяната на контекста:
точно 3 пъти по-малко инструкции от кокосите... |
||||||||||||||||||||||||||||
| Автор: | ¶ [ Пон Мар 26, 2012 11:30 pm ] | |||||||||||||||||||||||||||
| Заглавие: | Re: ARM assembler to C | |||||||||||||||||||||||||||
Лудите също са полезни ( понякога )
Защо да се трепя ? Мисля още дъълги години да живея То е ясно, че при PIC32/dsPIC ще е моя версия. Разполагам с достатъчно на брой PIC32/dsPIC развойни платки, така че ще ми е лесно да проверя дали всичко при CoOS е наред. При ARM разполагам с 3-4 на брой платки, на първата всичко заработи от раз, като имам време ще изпробвам CoOS и на Primer2 с STM32xxx. NuttX е .... една голяма какафония, стотици файлове, неясна концепция, а бе не ми хареса, нея съм я отписал. FreeRTOS също не попада в полезрението ми. RetroBSD ме заинтригува, но е много обемиста, та поне засега няма да се занимавам с нея.
Няма да я използвам на ARM, така че ми е все тая дали е с 3 или 4 инструкции в повече. Пък и все пак CoOS е дело на китайски студенти, но като за студентска работа си е доста добре. |
||||||||||||||||||||||||||||
| Автор: | palavrov [ Вто Мар 27, 2012 1:35 am ] | ||||||||||||||||||
| Заглавие: | Re: ARM assembler to C | ||||||||||||||||||
Още един китайски RTOS - http://en.rt-thread.org/ поддържа и ARM и MIPS А това е тежката артилерия http://ecos.sourceware.org/ малко е големичко, но ако си поиграе човек с настройките му може да падне под 20кб, ако има повечко памет си струва да му се ползва POSIX поддръжката. И да се закача малко си Миро
или
|
|||||||||||||||||||
| Автор: | miro_atc [ Вто Мар 27, 2012 8:47 am ] | |||||||||
| Заглавие: | Re: ARM assembler to C | |||||||||
Недей да се закачаш И двете парчета дето си дал за 4-та и 7ма архитектура са извадки дето само местят регистрите. Липсва кода който вика тия извадки. Като го сложиш, тогава ще сравняваме... Това, което вероятно ти убягва е, че при мен няма друг код |
||||||||||
| Автор: | palavrov [ Вто Мар 27, 2012 9:53 pm ] | ||||||||||||||||||||||||||||||||||||
| Заглавие: | Re: ARM assembler to C | ||||||||||||||||||||||||||||||||||||
Айде сега, не ми е убягнало разбира се ... между другото и двата варианта са за 4+ ARM архитектура ... но не стават за thumb и thumb2, и варианта който се инлайнва наистина е с много по-малко инструкции, но не бих се хванал на бас че е по бърз - записва 15 регистъра вместо 10 както е варианта със запис в стека. Ето ти повече код:
Ето ти го дизасемблирано:
Имай в предвид, че тук е и кода на schedulera който взема следащия таск. Ако можеш да покажеш нещо по-оптимално на C или assembler - давай |
|||||||||||||||||||||||||||||||||||||
| Автор: | miro_atc [ Вто Мар 27, 2012 10:53 pm ] | |||||||||
| Заглавие: | Re: ARM assembler to C | |||||||||
давам Виж tmos/ports/cortex-m3/exceptions.S и services.S. Първият файл е за хендлърите, вторият с всички функции на кърнела. Те това е всичко ако не броим хедърите, ама те не генерират код... |
||||||||||
| Автор: | palavrov [ Сря Мар 28, 2012 12:02 am ] | ||||||||||||||||||
| Заглавие: | Re: ARM assembler to C | ||||||||||||||||||
Ако съм проследил правилно логиката, аналогичен код на моя започва от TaskDelay: - преброих някъде към 22-23 инструкции, моя пример е с 14 инструкции, е като обем твоя код е по малък заради 16 битовите опкодове. |
|||||||||||||||||||
| Автор: | miro_atc [ Сря Мар 28, 2012 12:29 am ] | |||||||||
| Заглавие: | Re: ARM assembler to C | |||||||||
Къде видя аналогия? Според мен няма аналогия между preemptive и nonpremptive multitasking... Едно е да броиш дървета, друго е да видиш гората отгоре |
||||||||||
| Автор: | palavrov [ Сря Мар 28, 2012 10:59 pm ] |
| Заглавие: | Re: ARM assembler to C |
Гледай сега, това, че има функция която explicit-но прехвърля контрола на друг таск не значи непременно, че scheduler-а е preemptive. Ползвах го като пример защото в нея се вижда на едно място всичко на куп - общия брой инструкции който се изпълнява когато има task switching. Затова и потърсих аналогично нещо в твоята ОС-ка - като съзнателно извадих само парче код. Както и да е, не ми се разправя - успех! |
|
| Автор: | miro_atc [ Чет Мар 29, 2012 12:14 am ] | ||||||||||||||||||
| Заглавие: | Re: ARM assembler to C | ||||||||||||||||||
И аз това се опитвам да ти кажа... това че прехвърляш контрол не изначава че правиш истински task switch Ако се напънеш малко тоя yeld може да го замениш с един call и тогава ще ме биеш отвсякъде...
Да, ама аналогия няма щото в моя ОС няма yeld и не може да има. А в твоя няма preemption и не може да има. И двамата правим смяна на контекст, но причините са коренно различни. Ако искаш да се сравняваме трябва или ти да добавиш premeption и приоритети, или аз да направя твоя вариант. За мен няма никакъв смисъл да се занимавам с nonpriemtive кърнел. Но на твое място бих разкарал забраната за прекъсвания, от нея няма никаква файда щото така или иначе не може да имаш premeption. Отделно, ако си забелязал идеята - може един или два регистъра да се заделят само за кърнела. Това спестява още инструкции, но това е компромис, който може да направиш само ако не ползваш чужд код като мен. Това е основната причина да имам по-кратък switch спрямо кокосите (които също са preemptive и затова се сравнявам с тях). На това трябва да обърне внимание и Пирев, защото при MIPS стандартно има заплюти два регистъра за ОС и ще е грехота да не се възползва |
|||||||||||||||||||
| Автор: | palavrov [ Пет Мар 30, 2012 2:09 am ] |
| Заглавие: | Re: ARM assembler to C |
Извинявай - грешно съм се изразил - исках да напиша, че и моето е с preemptivе multitasking, ама имам и функция която 'ръчно' да превключи на следващия таск. Приоритетите нарочно ги махнах за да опростя нещата - честно казано досега не ми се е налагало да ползвам приоритети така, че компромиса беше лесен (не казвам, че няма смисъл от тях, просто на мен не ми трябват). Отделно не ползвам double linked list, ами single linked cyclic list с указател към последния елемент, вместо към първия. По този начин добавянето към опашката е елементарно, а достъпа до главата е през един указател повече. И шедулера не прави никакви калкулации кой да е следващия таск - просто се мести една позиция в кръговия лист. Като се налага някой таск да поспи повече време се разкача от списъка с активни задачи и се закача в друг списък на чакащи. Ако чака някой мутекс, пак така. Прекъсванията ми трябват за да синхронизирам достъпа до таск листа. Ако не беше приемптив мултитаскинг наистина няма смисъл от пипането им. |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|