Programowanie mikroprocesorów jednoukładowych Systemy operacyjne dla systemów wbudowanych Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 1 / 30
Plan I SLOS Inicjalizacja Model pamięci Obsługa przerwań i wyjątków Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 2 / 30
Simple Little Operating System SLOS to mały system operacyjny napisan na rdzeń ARM7TDMI oraz płytę ewaluacyjną Evaluator-7T. Jest prosty w modyfikacji i jest uruchamiany przez Sandstone firmware. Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 3 / 30
Inicjalizacja systemu I Listing 1: Inicjalizacja 1 AREA ENTRYSLOS, CODE, READONLY 2 ENTRY 3 LDR pc, v e c t o r R e s e t 4 LDR pc, v e c t o r U n d e f i n e d 5 LDR pc, vectorswi 6 LDR pc, v e c t o r P r e f e t c h A b o r t 7 LDR pc, v e c t o r D a t a A b o r t 8 LDR pc, v e c t o r R e s e r v e d 9 LDR pc, vectorirq 10 LDR pc, v e c t o r F I Q 11 v e c t o r R e s e t DCD c o r e I n i t i a l i z e 12 v e c t o r U n d e f i n e d DCD c o r e U n d e f i n e d H a n d l e r 13 vectorswi DCD coreswihandler Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 4 / 30
Inicjalizacja systemu II 14 v e c t o r P r e f e t c h A b o r t DCD c o r e P r e f e t c h A b o r t H a n d l e r 15 v e c t o r D a t a A b o r t DCD coredataaborthandler 16 v e c t o r R e s e r v e d DCD c o r e R e s e r v e d H a n d l e r 17 vectorirq DCD coreirqhandler 18 v e c t o r F I Q DCD corefiqhandler Listing 2: Ustawienia FIQ 1 b r i n g u p I n i t F I Q R e g i s t e r s 2 MOV r2, r14 ; s a v e r14 3 BL switchtofiqmode ; change FIQ mode 4 MOV r8,#0 ; r 8 _ f i q=0 5 MOV r9,#0 ; r 9 _ f i q=0 6 MOV r10,#0 ; r 1 0 _ f i q=0 7 BL switchtosvcmode ; change SVC mode 8 MOV pc, r2 ; r e t u r n Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 5 / 30
9 c o r e I n i t i a l i z e 10 BL b r i n g u p I n i t F I Q R e g i s t e r s Inicjalizacja systemu III Listing 3: Ustawienia stosu 1 MOV sp,#0 x80000 ; SVC s t a c k 2 MSR cpsr_c,# NoInt SYS32md 3 MOV sp,#0 x40000 ; u s e r / system s t a c k 4 MSR cpsr_c,# NoInt IRQ32md 5 MOV sp,#0 x9000 ; IRQ s t a c k 6 MSR cpsr_c,# NoInt SVC32md Wyniki działania powyższych listingów: inicjalizacja niskopoziomowego debugowania stos dla SVC, IRQ oraz systemu jest ustawiony Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 6 / 30
Inicjalizacja systemu IV Listing 4: Inicjalizacja PCB 1 ; v o i d pcbsetup ( v o i d entryaddr, v o i d PCB, UINT o f f s e t ) ; 2 pcbsetup 3 STR r0, [ r1,# 4] ; PCB[ 4]= C_TaskEntry 4 STR r0, [ r1,# 64] ; PCB[ 64]= C_TaskEntry 5 SUB r0, sp, r2 6 STR r0, [ r1,# 8] ; PCB[ 8]= sp <o f f s e t > 7 MOV r0,#0 x50 ; cpsr_c 8 STR r0, [ r1,# 68] ; PCB[ 68]= ift_user 9 MOV pc, l r Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 7 / 30
Inicjalizacja systemu V Listing 5: Ustawienie identyfikatora 1 LDR r0,= PCB_CurrentTask 2 MOV r1,#0 3 STR r1, [ r0 ] 4 LDR l r,=c_entry 5 MOV pc, l r ; e n t e r the CEntry world Inicjalizacja PCB dla wszystkich trzech zadań Ustawienie aktualnego PCB jako zadania 1 (identyfikator 0) Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 8 / 30
1 v o i d c i n i t _ i n i t ( v o i d ) 2 { 3 e v e n t I O D e v i c e I n i t ( ) ; 4 e v e n t S e r v i c e s I n i t ( ) ; 5 e v e n t T i c k I n i t ( 2 ) ; 6 } Inicjalizacja systemu VI 1 i n t C_Entry ( v o i d ) 2 { 3 c i n i t _ i n i t ( ) ; 4 e v e n t T i c k S t a r t ( ) ; 5 asm 6 { 7 MSR cp sr_ c,#0 x50 Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 9 / 30
Inicjalizacja systemu VII 8 } 9 C_EntryTask1 ( ) ; 10 r e t u r n 0 ; 11 } Rezultatem wywołania wszystkich funkcji inicjalizujących napisanych w C jest: Sterowiniki urządzeń są zainicjalizowane. Usługi są zainicjalizowane. Okresowy zegar jest zainicjalizowany i uruchomiony. Przerwania IRQ są aktywne w rejsterze cpsr. Procesor jest ustawiony w trybie użytkownika. Punkt startu zadania pierwszego jest wywołany (np. C_EntryTask1). Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 10 / 30
Model pamięci Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 11 / 30
Obsługa przerwań i wyjątków I Wyjątek Reset SWI IRQ Cel inicjalizacja systemu operacyjnego mechanizm dostępu do sterowników mechanizm obsługi zdarzeń Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 12 / 30
Obsługa SWI I 1 coreswihandler 2 STMFD sp!, { r0 r12, r14 } ; s a v e c o n t e x t 3 LDR r10, [ r14,# 4] ; l o a d SWI i n s t r u c t i o n 4 BIC r10, r10,#0 x f f 0 0 0 0 0 0 ; mask o f f the MSB 8 b i t s 5 MOV r1, r13 ; copy r13_svc to r1 6 MRS r2, s p s r ; copy s p s r to r2 7 STMFD r13!, { r2 } ; s a v e r2 onto the s t a c k 8 BL swi_jumptable ; branch to the swi_jumptable 1 LDMFD r13!, { r2 } ; r e s t o r e the r2 ( s p s r ) 2 MSR s p s r _ c x s f, r2 ; copy r2 back to s p s r 3 LDMFD r13!, { r0 r12, pc }^ ; r e s t o r e c o n t e x t and r e t u r n Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 13 / 30
Obsługa SWI II 1 swi_jumptable 2 MOV r0, r10 ; move the SWI number to r0 3 B eventsswihandler ; branch to SWI h a n d l e r 1 v o i d eventsswihandler ( i n t swi_number, SwiRegs r ) 2 { 3 i f ( swi_number==slos) 4 { 5 i f ( r >r [0]== E v e n t _ I O D e v i c e I n i t ) 6 { 7 / do not e n a b l e IRQ i n t e r r u p t s.... / 8 i o _ i n i t i a l i z e _ d r i v e r s ( ) ; 9 } 10 e l s e Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 14 / 30
Obsługa SWI III 11 { 12 / i f not i n i t i a l i z i n g change to system mode 13 and e n a b l e IRQs / 14 i f (STATE!=1) { modifycontrolcpsr (SYSTEM IRQoN ) ; } 15 s w i t c h ( r >r [ 0 ] ) 16 { 17 c a s e / SWI / Event_ IODeviceOpen : 18 r >r [ 0 ] = 19 ( u n s i g n e d i n t ) i o _ o p e n _ d r i v e r 20 ( 21 / i n t ID / ( UID ) r >r [ 1 ], 22 / u n s i g n e d major_device / r >r [ 2 ], 23 / u n s i g n e d minor_device / r >r [ 3 ] 24 ) ; 25 break ; Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 15 / 30
Obsługa SWI IV 26 c a s e / SWI / Event_IODeviceClose : 27 / c a l l i o _ o p e n _ d r i v e r / 28 break ; 29 c a s e / SWI / Event_IODeviceWriteByte : 30 / c a l l i o _ w r i t e b y t e _ d r i v e r / 31 break ; 32 c a s e / SWI / Event_IODeviceReadByte : 33 / c a l l i o _ r e a d b y t e _ d r i v e r / 34 break ; 35 c a s e / SWI / Event_IODeviceWriteBit : 36 / c a l l i o _ w r i t e b i t _ d r i v e r / 37 break ; 38 c a s e / SWI / Event_IODeviceReadBit : 39 / c a l l i o _ r e a d b i t _ d r i v e r / 40 break ; Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 16 / 30
Obsługa SWI V 41 c a s e / SWI / Event_IODeviceWriteBlock : 42 / c a l l i o _ w r i t e b l o c k _ d r i v e r / 43 break ; 44 c a s e / SWI / Event_IODeviceReadBlock : 45 / c a l l i o _ r e a d b l o c k _ d r i v e r / 46 break ; 47 } 48 / i f not i n i t i a l i z i n g change back to s v c mode 49 and d i s a b l e IRQs / 50 i f (STATE!=1) { modifycontrolcpsr (SVC IRQoFF ) ; } 51 } 52 } 53 } Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 17 / 30
Obsługa IRQ I 1 TICKINT EQU 0 x400 2 BUTTONINT EQU 0 x001 3 eventsirqhandler 4 SUB r14, r14, #4 ; r14_irq =4 5 STMFD r13!, { r0 r3, r12, r14 } ; s a v e c o n t e x t 6 LDR r0, INTPND ; r0=i n t pending r e g 7 LDR r0, [ r0 ] ; r0=memory [ r0 ] 8 TST r0,#tickint ; i f t i c k i n t 9 BNE e v e n t s T i c k V e n e e r ; then t i c k ISR 10 TST r0,#buttonint ; i f button i n t e r r u p t 11 BNE e v e n t s B u t t o n V e n e e r ; then button ISR 12 LDMFD r13!, { r0 r3, r12, pc }^ ; r e t u r n to t a s k Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 18 / 30
Obsługa IRQ II 1 e v e n t s T i c k V e n e e r 2 BL e v e n t s T i c k S e r v i c e ; r e s e t t i c k hardware 3 B k e r n e l S c h e d u l e r ; branch to s c h e d u l e r Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 19 / 30
Planista I 1 t a s k t =0, t ; 2 s c h e d u l e r ( ) 3 { 4 t = t + 1 ; 5 i f t = MAX_NUMBER_OF_TASKS then 6 t = 0 // the f i r s t t a s k. 7 end ; 8 ContextSwitch ( t, t ) 9 } Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 20 / 30
Przełączanie zadań I 1 MaxNumTasks EQU 3 2 F i r s t T a s k EQU 0 3 CurrentTask 4 LDR r3,= PCB_CurrentTask ; [ 1 ] r 3=PCB_CurrentTask 5 LDR r0, [ r3 ] ; r0= c u r r e n t Task ID 6 LDR r1,=pcb_table ; [ 2 ] r1=pcb_table a d d r e s s 7 LDR r1, [ r1, r0, LSL#2] ; r1=mem32 [ r1+r0 << 2 ] 8 LDR r2,= PCB_ PtrCurrentTask ; [ 3 ] r 2=PCB_ PtrCurrentTask 9 STR r1, [ r2 ] ; mem32 [ r2 ]= r1 : t a s k addr 10 ; PCB_PtrCurrentTask updated with the addr o f the c u r r e n t t a s k 11 ; r2 = PCB_PtrCurrentTask a d d r e s s 12 ; r1 = c u r r e n t t a s k PCB a d d r e s s 13 ; r0 = c u r r e n t t a s k ID 14 NextTask 15 ADD r0, r0,#1 ; [ 4 ] r0 = ( CurrentTaskID )+1 Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 21 / 30
Przełączanie zadań II 16 CMP r0,#maxnumtasks ; i f r 0==MaxNumTasks 17 MOVEQ r0,# F i r s t T a s k ; then r0 = F i r s t T a s k ( 0 ) 18 STR r0, [ r3 ] ; [ 5 ] mem32 [ r3 ]= next Task ID 19 LDR r1,=pcb_table ; [ 6 ] r1=pcb_table addr 20 LDR r1, [ r1, r0, LSL#2] ; r1=memory [ r1+r0 << 2 ] 21 LDR r0,= PCB_PtrNextTask ; [ 7 ] r 0=PCB_PtrNextTask 22 STR r1, [ r0 ] ; memory [ r0 ]= next t a s k addr Rezultaty uruchomienia powyższego kodu: PCB_PtrCurrentTask wskazuje na adres aktualnie aktywnego PCB. PCB_PtrNextTask wskazuje na adres następnego aktywnego PCB. PCB_CurrentTask przechowuje wartość identyfikatora następnego zadania. Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 22 / 30
Przełączanie kontekstu I 1 O f f s e t 1 5 R e g s EQU 15 4 2 h a n d l e r _ c o n t e x t s w i t c h 3 LDMFD r13!, { r0 r3, r12, r14 } ; [ 1. 1 ] r e s t o r e r e g i s t e r s 4 LDR r13,= PCB_PtrCurrentTask ; [ 1. 2 ] 5 LDR r13, [ r13 ] ; r13=mem32 [ r13 ] 6 SUB r13, r13,# O f f s e t 1 5 R e g s ; r13 =15 Reg : p l a c e r13 7 STMIA r13, { r0 r14 }^ ; [ 1. 3 ] s a v e u s e r mode r e g i s t e r s 8 MRS r0, s p s r ; copy s p s r 9 STMDB r13, { r0, r14 } ; s a v e r0 ( s p s r ) & r14 ( l r ) Rezultaty zapisu aktualnego kontekstu jest: Stos IRQ jest resetowany i zapisany do PCB_IRQStack. Rejestr użytkownika dla zadania t jest zapisany do aktualnego PCB. Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 23 / 30
Wczytywanie kontekstu I 1 LDR r13,= PCB_PtrNextTask ; [ 2. 1 ] r 1 3=PCB_PtrNextTask 2 LDR r13, [ r13 ] ; r13=mem32 [ r13 ] : next PCB 3 SUB r13, r13,# O f f s e t 1 5 R e g s ; r13 =15 R e g i s t e r s 4 LDMDB r13, { r0, r14 } ; [ 2. 2 ] l o a d r0 & r14 5 MSR s p s r _ c x s f, r0 ; s p s r = r0 6 LDMIA r13, { r0 r14 }^ ; l o a d r0_user r14_user 7 LDR r13,=pcb_irqstack ; [ 2. 3 ] r13=irq s t a c k addr 8 LDR r13, [ r13 ] ; r13=mem32 [ r13 ] : r e s e t IRQ 9 MOVS pc, r14 ; [ 2. 4 ] r e t u r n to next t a s k Rezultaty uruchomienia powyższego kodu: Przełączanie kontekstu jest wykonane. Rejestry kolejnego zadania są wczytywane do rejestrów w trybie użytkownika. Stos IRQ jest przywrócony do stanu wejścia w obsługę przerwania. Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 24 / 30
Device Driver Framework I 1 d e v i c e _ t r e e s t r h o s t ; 2 UID s e r i a l ; 3 4 h o s t = eventiodeviceopen (& s e r i a l, DEVICE_SERIAL_E7T,COM1) ; 5 i f ( h o s t==0) 6 { 7 /... e r r o r d e v i c e d r i v e r not found... / 8 } 9 s w i t c h ( s e r i a l ) 10 { 11 c a s e DEVICE_IN_USE : 12 c a s e DEVICE_UNKNOWN: 13 /... problem with d e v i c e... / 14 } Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 25 / 30
Device Driver Framework II 1 PRE r0 = Event_IODeviceOpen ( u n s i g n e d i n t ) 2 r1 = & s e r i a l ( UID u ) 3 r2 = DEVICE_SERIAL_E7T ( u n s i g n e d i n t major ) 4 r3 = COM1 ( u n s i g n e d i n t minor ) 5 SWI 5075 6 POST r1 = The data p o i n t e d to by the UID p o i n t e r i s updated Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 26 / 30
Przełączanie kontekstu I Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 27 / 30
Podsumowanie I Podstawowe komponenty występujące systemach operacyjnych uruchamianych na procesorach ARM są następujące: Inicjalizacja ustawiająca wszystkie wewnętrzne zmienne, struktury danych oraz urządzenia używane przez system operacyjny. Obsługa pamięci organizuje przestrzeń dla kernela oraz innych wykonywanych aplikacji. Wszystkie przerwania i wyjątki wymagają funkcji obsługujących je. Nieużywane przerwania i wyjątki muszą posiadać zainstalowane pozorowane funkcje obsługujące. Zegar okresowy jest wymagana w systemach przełączających zadania. Zegar produkuje przerwanie wywołujące funkcje planisty. Planista jest algorytmem, który określa nowe zadania mające być uruchomione. Przełączanie kontekstu zapisuje stan aktualnego zadania i wczytuje stan następnego zadania. Powyższe komponenty są przykładowo zrealizowane w Simple Little Operating System(SLOS): Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 28 / 30
Podsumowanie II Initialization-Inicjalizacja ustawoa wszystkie funkcje systemu SLOS, włączając w to tryby pracy stosu, proces kontroli bloków (PCB) dla każdej aplikacji, sterowniki, itd. Memory model- Jądro SLOS jest umieszczone w niskiej pamięci, każda aplikacja ma swoją własną przestrzeń pamięci oraz stos. Rejestry systemowe mikrokontrolera są umieszczone daleko od pamięci ROM i RAM. Interrupts and exceptions-slos korzysta tylko z trzech zdarzeń. Tymi zdarzeniami są Reset, SWI i IRQ. Pozostałej nieużywane przerwania i wyjątki mają zainstalowane prowizoryczne funkcje obsługi. Scheduler-SLOS implenentuje prosty algorytm round-robin w planiście. Context switch-aktulany kontekst jest zapisywane w PCB, następnie kontekst następnego zadania jest odczytywany z PCB. Device driver framework-ochrania system operacyjny przed bezpośrednim dostęp z aplikacji do sprzętu. Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 29 / 30
References Andrew Sloss, Dominic Symes, and Chris Wright. ARM System Developer s Guide: Designing and Optimizing System Software. Morgan Kaufmann Publishers Inc., San Francisco, CA, USA, 2004. Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 30 / 30