590 likes | 833 Views
Het uC/OS-II RTOS. Embedded systeem. Programma voorgrond/achtergrond systeem. Operating systeem nodig ?.
E N D
Het uC/OS-II RTOS
Operating systeem nodig ? De meeste toepassingen (in het bijzonder 8-bit systemen) bestaan uit slechts een programma, en daarom geen behoefte aan een "traditionele" besturingssysteem. ROM monitoren vervangen door het besturingssysteem. Meer complexe systemen van vandaag vereisen meer complexe besturing en daarom behoefte aan een besturingssysteem van een soort.
Type operating systemen • monolithische kernel Desktop (windows,linux,…) • microkernel QNX, minix, symbian OS • kleine real-time OS Kernel in de vorm van een API.
MicroC/OS-II Kenmerken: • Multitasking (max. 64 taken) • Prioriteit • Preemptive • Deterministisch • portable • ROMable, scalable
Tekortkomingen: • Geen priority inherintance • Elke taak heeft een unieke prioriteit. MicroC/OS-II Kenmerken: • Services : Mailboxes, Queues, Semaphores, fixedsized memory partitions, time-related functions • Interrupt Management: geneste Interrupt • Robuust en betrouwbaar
Taken: • Kan 64 taken managen (2 taken voor eigen gebruik) • De 4 hoogste en de 4 laagste prioriteiten zijn voor eigen gebruik • 56 applicatie taken • Hoe lager de waarde van de prioriteit hoe hoger de prioriteit. • De taak prioriteit nummer dient ook als de taak identifier
Voorbeeld taken. voidtaak1(void* pdata) { while(1) print a; } int main() { initialiseer; creëer taak1; creëer taak2; start scheduling; } voidtaak2(void* pdata) { while(1) print b; }
Datastructuur van de ready-list Voordeel: • store/load in constante tijd. Nadeel: • Taken kunnen niet dezelfde prioriteit hebben’ • Aantal taken is gelimiteerd.
Datastructuur na de initialisatie 2 taken(Stat en Idle) die door het OS gebruikt worden
Suspended van een taak Link blijft bestaan Bit wordt gecleared
Running (2)Zoek hoogste prioriteit in groep (1)Zoek hoogste prioriteit groep (3)Zet state op running
Beheer van de taken • Wanneer een taak wordt gemaakt, wordt er een Task Control Block aangewezen, OS_TCB • OS_TCB is een data structuur die wordt gebruikt door UC/OS-II de state van een taak bij te behouden wanneer het preempted wordt • Alle OS_TCB staan in het RAM • Een OS_TCB wordt geïnitialiseerd wanneer een taak wordt gemaakt
Task context switch Elke taak heeft een stack waar de bijbehorende informatie wordt opgeslagen. Doel contex switch Om ervoor te zorgen dat de taak die gedwongen wordt de CPU op te geven, verder kan gaan zonder verlies van alle vitale informatie of gegevens
Task context switchvoor een taak wisseling stacktaak 2 Stack pointer stacktaak 1 CPU registers bij het switchen Lokale variabele taak 1 Taak 2 code adres bij het switchen Taak 2 lokale variabele bij het switchen return adres return adres Taak 1 is running Taak 2 wordt runningis ready
Task context switchtijdens een taak wisseling CPU registers bij het switchen Taak 2 code adres bij het switchen Taak 2 lokale variabele bij het switchen Lokale variabele Return adres Return adres Taak 1 stack Taak 2 stack Huidige program counter Huidige CPU registers Taak 1 TCB Taak 1 TCB Stack pointer Stack pointer huidige stackpointer
Task context switchna een taak wisseling Stack pointer CPU registers bij het switchen Loacale variabele taak 2 Taak 1 code adres bij het switchen Taak 1 lokale variabele bij het switchen Return adres return adres Taak 1 wordt running is ready Taak 2 running
Task context switch • Interrupt (hardware of software) van de context switch • Push return adres • Push FLAGS register • ISR (context switch routine) • Push alle registers • Sla SP op in TCB (task control block) • Select de ready taak met de hoogste prioriteit (Scheduler) • Restore de SP van de TCB van de geselecteerde taak • Pop alle registers • iret (return interrupt, pop FLAGS en return adres) • Switch to new task
Het aanvragen van geheugen. • Dynamic memory allocation kan verkregen worden door gebruik te maken van malloc() en de free() functies • Gebruik van malloc() en de free() in een embedded real-time system is gevaarlijk • Eventueel kan fragmentation plaatsvinden • Execution time van malloc() en free() zijn nondeterministic. • Het uC/OS-II kent geheugen blokken met een vaste grootte toe. • Geheugenblokken zijn afkomstig van een partitie die in het geheugen gedeclareerd is. • Het alloceren en dealloceren van geheugen gebeurt hierdoor in een continue tijd. • Geheugenblokken kunnen verschillende grootte hebben.
Het aanvragen van geheugen. geheugenblokken multiple memory partitions memory partition
Het aanvragen van geheugen. Memory Control Block • Het uC/OS-II houdt het geheugen bij d.m.v een Memory Control Block (MCB) • Elke partitie heeft zijn eigen MCB. • Initialisatie wordt gedaan door de functie OS_MemInit() die de gelinkte lijst creeerd.
Memory control block. typedef struct { void *OSMemAddr; //A void *OSMemFreeList; //B INT32U OSMemBlkSize; //C INT32U OSMemNBlks; //D INT32U OSMemNFree; //E } OS_MEM; Is een pointer naar het begin van de geheugenpartitie. Is een pointer naar het eerst volgende vrije geheugen ruimte. Is de grootte van elke geheugenblok in de partitie. Is het totaal aan geheugenblokken per partitie. Hoeveel geheugenblokken beschikbaar zijn.
Creëren van een partitie OSMemCreate() OS_MEM *CommTxBuf; INT8U CommTxPart[100][32]; void main (void) { INT8U err; OSInit(); . . CommTxBuf = OSMemCreate(CommTxPart, 100, 32, &err); . . OSStart(); } • Vier argumenten zijn vereist • Begin addres van de memory partition. • Het aantal blocken dat gealloceerd wordt van de partition. • De grootte (in bytes) van elk block. • Een pointer naar de variabele die de error code bevat.
Aanmaken van taken void (*task)(void *pd), void *pdata, INT8U OSTaskCreate ( ) { } , INT8U prio OS_STK *ptos void (*task)(void *pd) pointer naar de taak void *pdata pointer naar de argumenten van de taak OS_STK *ptos =>pointer naar de top van de stack int8U prio => prioriteit
Bewerken van taken OSTaskDel() OSTaskDelReq() OSTaskSuspend() OSTaskResume() Quick reference: http://sigpromu.org/brett/elec3730/quickref.html
C code Het creeeren van een message queue. OS_EVENT *OSQCreate(void **start, INT8U size); #define RIJGROOTTE 5 OS_EVENT *postrijev; void* postrij[RIJGROOTTE]; postrijev=OSQCreate(postrij,RIJGROOTTE);
C code Het schrijven in een message queue. INT8U OSQPost(OS_EVENT *pevent, void *msg); INT8U rt; OS_EVENT *postrijev; typedef struct { char c; int i; }dubbel; dubbel boodschap={1,’i’} rt=OSQPost(postrijev,&boodschap); if(rt==OS_NO_ERR)
C code Het lezen uit een message queue. void *OSQPend(OS_EVENT *pevent, INT16U timeout, INT8U *err); OS_EVENT *postrijev; typedef struct { char c; int i; }dubbel; INT8U fout; dubbel *p_ontv p_ontv=(dubbel*)OSQPend(postrijev,0,&fout); p_ontv= OSQPend( );
Een processor kan uC / OS-II draaien, indien aan de volgende eisen voldaan wordt Er moet een C compiler voor de microcontroller zijn. Interrupts moeten in C gedisabled en ge-enabled kunnen worden. De processor moet interrupt ondersteunen en ondersteunt intervallen tussen de 10 en de 100 Hz. De processor moet instructies hebben voor het laden en opslaan van de stack pointer en andere CPU-registers, hetzij op de stack of in het geheugen.
Setting the value of 2 #define constants (OS_CPU.H) Declaring 11 data types (OS_CPU.H) Declaring 2 #define macros (OS_CPU.H) Writing 10 simple functions in C (OS_CPU_C.C) Writing 4 assembly language functions (OS_CPU_A.ASM)