Witam. Piszê procedurki na ARM7 (PLCXXXX), ktore normalnie chodz± w trybie THUMB. I teraz obs³uga przerwania musi byæ w trybie ARM. Jak zadeklarowaæ funkcjê by GCC skompilowa³o j± (prze³±czy³o) do ARM, gdy ca³y program bêdzie kompilowany w trybie THUMB i nie wywala³o mi b³êdów: "interrupt Service Routines cannot be coded in Thumb mode"? "Okulary twoim przyjacielem", ale mimo jeszcze swoich, nie mogê znale¼æ a co¶ mnie k³uje, ¿e trza chyba jaki¶ atrybut do³o¿yæ i nie mogê siê doszukaæ niczego konkretnego. Gierkowskim: pomo¿ecie? Pozdrawiam, CodiJack.
ARM7 i przerwania
Jun 28, 2006
4 Replies
CodiJack napisał(a):
"Opakowanie" funkcji obsługi przerwania napisz w asemblerze ARM, skąd wywołuj funkcję THUMB (instrukcją bx).
Możesz też skompilować oddzielny plik .c w trybie ARM jeżeli nie dasz flagi kompilacji -mthumb. Aby taki kod mógł współpracować z funkcjami THUMB, dodaj flagę -mthumb-interworking dla kompilatora i linkera.
U¿ytkownik "Adam Dybkowski" snipped-for-privacy@amwaw.edu.pl> napisa³ w wiadomo¶ci news:e7uoaq$1op$ snipped-for-privacy@nemesis.news.tpi.pl...
Jest to mój pierwszy "prawdziwy" projekt. Jakby¶ móg³ mi obja¶niæ to "opakowanie" bêdê wdziêczy.
Deklaracja przyk³adowego przerwania: void RTC_interrupt(void) __attribute__ ((interrupt ("IRQ")));
Dalej jego cia³o: void RTC_interrupt(void) { .... VICVectAddr = 0x00; // koniec obslugi dla VIC }
Nie za bardzo wiem jak "opakowaæ" :(
Pozdrawaim, CodiJack.
CodiJack napisał(a):
Jeżeli tak to chyba będzie zbyt trudne jak na początek. Chodziło mi o napisanie oddzielnego pliku w asemblerze (.s), gdzie będą zrzucone na stos niezbędne rejestry (te, które są wspólne dla trybu IRQ i tego, w którym normalnie działasz, np. USER) i skok do właściwej funkcji obsługi przerwania napisanej w Thumbie.
Gdyby napisać to w samym C, wystarczy funkcję obsługi przerwania (tą twoją RTC_interrupt) skompilować w trybie ARM. Stamtąd możesz wywołać funkcję właściwą z innego pliku, już w Thumbie. Musisz mieć to napisane oddzielnie w makefile, aby dla pliku z funkcją RTC_interrupt kompilator nie dostał flagi -mthumb. Wszystkie pliki i linker muszą mieć flagę
-mthumb-interworking aby były możliwe wywołania między trybami ARM i Thumb. Linker może mieć flagę -mthumb i wtedy doczepi biblioteki standardowe (libc) w trybie Thumb. Jeżeli tej flagi nie będzie, zostaną użyte biblioteki ARMowe - co ma znaczenie wydajnościowe gdy chodzisz z zewn. pamięci albo wewnętrznego wolnego Flasha w procesorach AT91SAM7Sxx.
U¿ytkownik "Adam Dybkowski" snipped-for-privacy@amwaw.edu.pl> napisa³ w wiadomo¶ci news:e81lsd$d8g$ snipped-for-privacy@nemesis.news.tpi.pl...
O..., to chyba têdy droga. Dziêki, CodiJack.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required