Využítí ARM GCC vývojového retezce

| Kategorie: Diplomové, bakalářské práce  | Tento dokument chci!

Předmětem této práce je studium stávajícího vývojového řetězce pro mikroprocesor LPC23xx v předmětu MPOA. Hlavním cílem je zkoumání možností realizace nového vývojového řetězce, postaveného na GCC. Výstupy této práce jsou ukázkové aplikace s mikroprocesorem LPC2378 a GCC. Součástí vysledků jsou i návody pro studenty, jak tyto ukázkové aplikace implementovat. Ukázky zahrnují základní aplikace, RTOS aEthernet.

Vydal: FEKT VUT Brno Autor: Jan Ledvina

Strana 28 z 93

Vámi hledaný text obsahuje tato stránku dokumentu který není autorem určen k veřejnému šíření.

Jak získat tento dokument?






Poznámky redaktora
Není tedy jasné kdo kdy provedl. Jelikož byla již načata problematika přerušení systém přerušení byl studován i dříve, bylo rozhodnuto dodělat nové funkce pro možnost zakázání povolení přerušení, pro případ opět řešila podobná problematika. Jak se ukázalo, jde velice jednoduchý úkon, avšak jeho realizace poměrně složitá. Pro správné napsání funkce třeba znát následující: − Globální IRQ flagy jsou CPSR (Current Program Status Registr) − Přístup tomuto registru pouze přes speciální instrukce MSR, MRS − Flag IRQ mistě bitu, flag FIQ bitu − Vynulování(vypnutí) provede zápisem logické 1!!! − Pro maximální efektivitu třeba, aby funkce byla In-Line Na základě těchto znalostí výsledný kód vytváří mnohem jednodušeji.21 bufferu obdobně jako varianta cvičení. Výsledný kód potom vypadá takto: Samotná funkce: inline void disable_irq() { long b; __asm__ __volatile__ "MRS %0, CPSR \n\t" "ORR %0, %0, #0xC0 \n\t" "MSR CPSR_c,%0 "=r" (b)); } Prototyp této funkce potom vypadá takto: extern inline void disable_irq (void) __attribute__ ((always_inline)); . Bohužel však chyběla jakákoliv dokumentace těchto úprav. Pro ověření správnosti těchto funkcí byl vytvořen nový program, jeho hlavní část vypadala takto: timer_init(TIME_INTERVAL_ms(1000)); disable_irq(); FIO2PIN 0xf0; while(1); Ve funkci pro obsluhu přerušení časovače byl doplněn následující kód: FIO2PIN 0xef; V případě, tedy funkce disable_irq() skutečně vypne přerušení, rozsvítí pouze horní polovina LED. případě, přerušení nevypne, dojde vteřině rozsvícení teměř všech diod. Jelikož všechny tyto informace začátku nebyly, bylo třeba ním postupně dostat. Na základě tohoto kódu pak byla vytvářená funkce pro vypnutí přerušení