ARM7 i przerwania

Jun 28, 2006 4 Replies

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.



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