Het uC/OS-II RTOS.

Slides:



Advertisements
Verwante presentaties
KWALITEITSZORG november 2012
Advertisements


PROS2 Les 13 Programmeren en Software Engineering 2.
De elektronische verzamelaanvraag Ruben Fontaine Markt- en Inkomensbeheer – dienst Aangiftes.
‘SMS’ Studeren met Succes deel 1
Hoe werkt een rekenmachine?
NEDERLANDS WOORD BEELD IN & IN Klik met de muis
WAAROM? Onderzoek naar het meest geschikte traject voor de verlenging tot in Sint-Niklaas van het bestaande fietspad naast de Stekense Vaart en de Molenbeek.

Embedded systemen Embedded software.
November 2013 Opinieonderzoek Vlaanderen – oktober 2013 Opiniepeiling Vlaanderen uitgevoerd op het iVOXpanel.
Uitgaven aan zorg per financieringsbron / /Hoofdstuk 2 Zorg in perspectief /pagina 1.
1 COVER: Selecteer het grijze vlak hiernaast met rechtsklik & kies ‘change picture’ voor een ander beeld of verwijder deze slide & kies in de menubalk.
Global e-Society Complex België - Regio Vlaanderen e-Regio Provincie Limburg Stad Hasselt Percelen.
STAPPENPLAN GRAMMATICUS.
Ronde (Sport & Spel) Quiz Night !
BESTURINGS SYSTEMEN Vincent Naessens.
Een Concert van het Nederlands Philharmonisch Orkest LES 4 1.
1 Device driver. 2 Hardware Operating Systeem Prog1Prog2 System calls/ API Device drivers Gebruiker afschermen van de hardware.
Auteursomgeving voor Digitale Componenten
Een optimale benutting van vierkante meters Breda, 6 juni 2007.
GESPRG Les 14 Gestructureerd programmeren in C. 174 Details! The devil is in the details.
Kb.1 Ik leer op een goede manier optellen en aftrekken
C programma int main(){ } Compilatie met devc++ in file main.c Gecompileerd programma in file FirstProgram.exe Mov R1, 120 Mov R2, 160 ADD R1, R2.

Nooit meer onnodig groen? Luuk Misdom, IT&T
Hoofdstuk 6: Controle structuren
1 SOCS Hoofdstuk 1 Computerarchitectuur. 2 Overzicht Eenvoudig C Arrays Functies Records Dynamische gegevenstructuren Macro’s C.
FOD VOLKSGEZONDHEID, VEILIGHEID VAN DE VOEDSELKETEN EN LEEFMILIEU 1 Kwaliteit en Patiëntveiligheid in de Belgische ziekenhuizen anno 2008 Rapportage over.
Elke 7 seconden een nieuw getal
Softwarepakket voor het catalogeren en determineren van fruitsoorten
1 introductie 3'46” …………… normaal hart hond 1'41” ……..
Oefeningen F-toetsen ANOVA.
1/1/ / faculty of Computer Science eindhoven university of technology 5B040:Computerarchitectuur 2M200:Inleiding Computersystemen Sessie 7(1): Flow of.
1Ben Bruidegom Hoe werkt een rekenmachine? Ben Bruidegom AMSTEL Instituut Universiteit van Amsterdam.
Wat levert de tweede pensioenpijler op voor het personeelslid? 1 Enkele simulaties op basis van de weddeschaal B1-B3.
GESPRG Les 7 Gestructureerd programmeren in C. 92 Verwisselen Schrijf een functie waarmee twee int variabelen verwisseld kunnen worden. void wissel(int.
13 maart 2014 Bodegraven 1. 1Korinthe Want gelijk het lichaam één is en vele leden heeft, en al de leden van het lichaam, hoe vele ook, een lichaam.
Optuigen van datastructuren
User management voor ondernemingen en organisaties
2009 Tevredenheidsenquête Resultaten Opleidingsinstellingen.
Hoe werkt een rekenmachine?
1Ben Bruidegom 1 De Harvard Machine Van rekenmachine met “loopjes” naar processor.
Ben Bruidegom 1 Sequentiële schakelingen Toestand uitgang bepaald door:  ingangen;  vorige toestand uitgang.
1 Van Harvard naar MIPS. 2 3 Van Harvard naar MIPS Microprocessor without Interlocked Pipeline Stages Verschillen met de Harvard machine: - 32 Registers.
1 Datastructuren Introductie tot de programmeeropgaven in C++ Jan van Rijn
Deel I: Programmeertaal C 6. Arrays en Pointers
1 ICT Infrastructuren 19 november 2007 David N. Jansen.
Power PC Assembler. Assembler toolkit bevat Assembler zelf Linkerlibrarian.
Event Handling in Embedded Systems.  Wat is een event?  Welke events zijn het meest “time-critical”?  Welke toestand wordt door de CPU opgeslagen?
ECHT ONGELOOFLIJK. Lees alle getallen. langzaam en rij voor rij
Seminarie programmeren Het geheugen. Menu Memory 1.About 2.Mem Mgmt/del 3.Clear entries 4.clrAllLists 5.Archive 6.Unarchive 7.Reset 8.group →Sec mem.
17/08/2014 | pag. 1 Fractale en Wavelet Beeldcompressie Les 5.
17/08/2014 | pag. 1 Fractale en Wavelet Beeldcompressie Les 3.
23 september 2014 Niels Vanmarcke
1 Zie ook identiteit.pdf willen denkenvoelen 5 Zie ook identiteit.pdf.
Tircms02-p les 4 Preprocessor In- en uitvoer Diversen.
1 Week /03/ is gestart in mineur De voorspellingen van alle groten der aarden dat de beurzen zouden stijgen is omgekeerd uitgedraaid.
Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving
Tircms03-p les 2 Hfdst 3,4 Meer operatoren Functies.
Hoofdstuk 3 - Conditionele logica
Computertechniek 2 – ARM assembler Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1  programma draaien vanuit ROM.
Tircms02-p les 3 Functies Strings Structuren. Functies 1. main() 2. { int k; k = 10 ; printf(“%d\n”,fac(k)); } 3. int fac(n) int n; 4. { int f; f= 1;
Tircms02-p les 2 Meer operatoren Arrays en pointers Types en conversie.
tircms02-p les 1 Operating Systems practicum
Les 1: Zaterdag 10 mei 2014 Wim Peeters
1 XSLT processing & control Datamodellering 2006.
PEMSY1http:// 1  Herhaling nieuwe instructies van vorige week  nieuw: combineren van assembler en C  oefeningen: assembler.
Wat gaan we doen? Herhaling ARM assembler instructies
Transcript van de presentatie:

Het uC/OS-II RTOS

Embedded systeem

Programma voorgrond/achtergrond systeem

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.

Het microCOS-II operating systeem

Plaats van het operating systeem

MicroC/OS-II Kenmerken: Multitasking (max. 64 taken) Prioriteit Preemptive Deterministisch Execution time of all mC/OS-II functions and service are deterministic portable ROMable, scalable

MicroC/OS-II Kenmerken: Services : Mailboxes, Queues, Semaphores, fixedsized memory partitions, time-related functions Interrupt Management: geneste Interrupt Robuust en betrouwbaar Tekortkomingen: Elke taak heeft een unieke prioriteit. Geen priority inherintance

MicroC/OS-II architectuur

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

Non –preemptive taak scheduling

Preemptive Taak scheduling

Voorbeeld taken. void taak1(void* pdata) { while(1) print a; } int main() { initialiseer; creëer taak1; creëer taak2; start scheduling; } void taak2(void* pdata) { while(1) print b; }

Task context switch Specify  the priority of the task to be deleted or pass in OS_PRIO_SELF if priority of task is unknown. This task's code is not actually removed but the task is placed in the dormant state and can be recreated and made active by calling OSTaskCreate or OSTaskCreateExt.

Task context switch

Datastructuur van de ready-list

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

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 switch

Task context switch

Task context switch voor een taak wisseling stack taak 2 Stack pointer stack taak 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 running is ready

Task context switch tijdens 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 switch na een taak wisseling Loacale variabele taak 2 Stack pointer Return adres Taak 2 running return adres CPU registers bij het switchen Taak 1 lokale variabele bij het switchen Taak 1 code adres bij het switchen Taak 1 wordt running is ready

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

Memory management

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. Membase naar Memblk grootte van elk blok NBlks = totaal aantal mem blokken per partition MemFree hoeveel mem blocks zijn beschikbaar van de patitie

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.

Data structuur na een geslaagde OSMemCreate()

Aanmaken van taken INT8U OSTaskCreate ( ) { } void (*task)(void *pd), void *pdata, OS_STK *ptos , INT8U prio 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

Interproces communicatie message box

Interproces communicatie message queue

Message Queue Management

Een Message Queue als een circulare buffer van pointers

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. typedef struct { char c; 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. typedef struct { char c; 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( );

Porting uC/OS-II

Er moet een C compiler voor de microcontroller zijn. 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. eigenschap van een routine of subroutine die, na eenmaal te zijn geladen, door verschillende programma`s kan worden gebruikt 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)

OS_CPU.H #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #endif /* ********************************************************************************************************* * DATA TYPES * (Compiler Specific) */ typedef unsigned char BOOLEAN; typedef unsigned char INT8U; /* Unsigned 8 bit quantity */ (1) typedef signed char INT8S; /* Signed 8 bit quantity */ typedef unsigned int INT16U; /* Unsigned 16 bit quantity */ typedef signed int INT16S; /* Signed 16 bit quantity */ typedef unsigned long INT32U; /* Unsigned 32 bit quantity */ typedef signed long INT32S; /* Signed 32 bit quantity */ typedef float FP32; /* Single precision floating point */ (2) typedef double FP64; /* Double precision floating point */ typedef unsigned int OS_STK; /* Each stack entry is 16-bit wide */ * Processor Specifics #define OS_ENTER_CRITICAL() ??? /* Disable interrupts */ (3) #define OS_EXIT_CRITICAL() ??? /* Enable interrupts */ #define OS_STK_GROWTH 1 /* Define stack growth: 1 = Down, 0 = Up */ (4) 1 #define #define OS_TASK_SW() ??? (5)

OS_Enter_Critical() and OS_Exit_Critical() Os_Enter_Critcal(); //uC/OS-II kritische code sectie Os_Exit_Critcal(); Macros voor enable en disable interrupt #define Os_Enter_Critcal() DI #define Os_Exit_Critcal() SEI #define Os_Enter_Critcal() \ asm(“ PUSH PSW”); \ asm(“DI”); #define Os_Exit_Critcal() DI asm(“ POP PSW”); \ asm(“EI”);

Voor een uC/OS-II port zullen een aantal eenvoudige C functies moeten worden herschreven OSTaskStkInit() Deze functie wordt aangeroepen door o.a. OSTaskCreate() om de stack van een taak te initialiseren. OS_STK *OSTaskStkInit() (void (*task)(void *pd),void *pdata, OS_STK *ptos, INIT16U opt); { simulate call to function with an argument(i.e. pdata); Simulate ISR vector; Setup stack frame to contain desired initial values of all registers; Return new top-of-stack pointer to caller; } void MyTask (void *pdata) /* Do something with argument pdata’ */ for (;;) { /* Task code */

OSTaskStkInit() OS_STK *OSTaskStkInit() (void (*task)(void *pd), void *pdata, OS_STK *ptos, INIT16U opt); { simulate call to function with an argument (i.e. pdata); Simulate ISR vector; Setup stack frame to contain desired initial values of all registers; Return new top-of-stack pointer to caller; } Waar stackpointer naar verwijst is processor afhankelijk

Stackframe geinitialiseerd met pdata.

Context Switch Om een ready task running te maken moeten alle processor registers van de task’s stack terug gezet worden en een “return from interrupt” terug gezet worden. OS_TASk_SW(): is een macro welke altijd wordt aangeroepen van task-level code. De OS_TASK_SW() moet een interrupt simuleren.Het maakt een software interrupt (in assembler code) en zet de interrupt vector naar de OSCtxSw() (assembler programma) OSIntExit() wordt gebruikt bij een context switch wanneer bij een ISR die een taak met een hogere prioriteit laat uitvoeren.

Context Switch OS_CPU_A.ASM OSStartHighRdy() OSCtxSw() OSIntCtxSw() OSTickISR() OSStartHighRdy() wordt aangeroepen door OSStart() om de taak met de hoogste prioriteit te laten starten. OSCtxSw is called on every context switch. Initialize the table before doing anything else. The context switching function OSCtxSw() is located in file src/uC/os_cpu_a.s. This is given to you. DO NOT modify the code that moves the Trap location into the vector table. Voordat OSStart() aangeroepen kan worden moet minimaal 1 taak gecreëerd zijn.

OSTickISR() uC/OS-II eist een periodieke tijd voor het bijhouden van delays en time-outs Een ”ticker interrupts” moet geenabled worden nadat de multitasking is gestart, dat gebeurd na het aanroepen van OSStart(). Wanneer de ticker interrupt wordt geenabled voor de aanroeping van OSStart(), kan het systeem crashen. void main(void) { . OSInit(); /* Initialize µC/OS-II */ /* Application initialization code ... */ /* ... Create at least on task by calling OSTaskCreate() */ Enable TICKER interrupts; /* DO NOT DO THIS HERE!!! */ OSStart(); /* Start multitasking */ }

Pseudocode for tick ISR Aangeven dat je in een interrupt zit void OSTickISR(void) { Save processor registers; Call OSIntEnter() or increment OSIntNesting; if (OSIntNexting == 1){ OSTCBCur->OSTCBStkPtr = Stack Pointer; } clear interrupting device; Call OSTimeTick(); Call OSIntExit(); Restore processor registers; Execute a return from interrupt instruction; Save sp in huidige taak Verantwoordelijk voor de interne timers Call OSIntEnter() or increment OSIntNesting; =>Aangeven dat je in een interrupt routine zit OSIntNexting == 1 => save de inhoud van de stack pointer into de huidige taak. .