slides 11 ucos
TRANSCRIPT
-
8/3/2019 Slides 11 Ucos
1/51
C/OS-II
Micro-Controller Operating
ys emCore: v2.52Port: Atmel AVR-GCC v270603
(Julius Luukko)
Naszly Gbor
BME MIT ver.: 2010a.opre2
-
8/3/2019 Slides 11 Ucos
2/51
1. A C/OS trtnete
Fejlesztje: Jean J. Labrosse Motivci: egyik alkalmazshoz RT kernel
A kernel: mr ismertk, megbzhat, de tldrga volt
B kernel: ismeretlen, de olcsbb volt vgl ezt vettk meg 2 hnapjuk ment r, hogy pr egyszer taszkot el
tudjanak indtani mint utbb kiderlt, k voltak az egyik els vev, s a
kernel mg nem volt normlisan tesztelve
-
8/3/2019 Slides 11 Ucos
3/51
1. A C/OS trtnete
ezek utn megvettk az A kernelt is ezt 2 nap alatt mkdsre brtk azonban 3 hnap utn talltak egy bug-ot
viszont a 90 napos garancia lejrt ennek ellenre prbltk rvenni a gyrtt, hogy javtsa
ki ingyen, hisz voltakpp a hiba bejelentsvelszvessget tesznek nekik
de a gyrt hajthatatlan volt, gy fizettek a hibajavtsrt,ami 6 hnapig tartott!
termszetesen iszonyatosan idegesek lettek,radsul a termket is nagy ksssel szlltottk
le
-
8/3/2019 Slides 11 Ucos
4/51
1. A C/OS trtnete
Well, it cant be that difficult to write a kernel. All
Jean J. Labrosse
estnknt s htvgenknt dolgozva elkszlt
egy j kernel kb. egy v alatt rt el az A kernel szintjre j cget azonban nem akart alaptani, mert mr
volt vagy 50 kernel a piacon akkoriban
t nee s to o s save an restore processorregisters.
-
8/3/2019 Slides 11 Ucos
5/51
1. A C/OS trtnete
helyette inkbb meg szeretett volna jelentetni egycikket a C Users Journal-ban. De elutastottk azalbbi indokokkal: tl hossz volt a cikk Another kernel article?
prblkozott az Embedded Systems
Programming magazinnl is: az elejn hasonl indokokkal utastottk itt is el azonban heti hromszori gyakorisggal rgva a
szerkeszt flt, vgl sikerlt megjelentetnie a cikket
akkoriban (1992) lltlag ez volt a magazinlegolvasottabb cikke
-
8/3/2019 Slides 11 Ucos
6/51
1. A C/OS trtnete
nem sokra r Dr. Bernard Williams, aki tbbekkztt a C Journal kiadja is, felhvta, hogyrdekeln a cikk:
Jean J. Labrosse: Dont you think you are a little bitlate with this? The article is being published inESP.
Dr. Bernard Williams: No, No, you dontunderstand, because the article is so long, I wantto make a book out of it.
knyv: C/OS, The Real-Time Kernel konferencik siker cg
-
8/3/2019 Slides 11 Ucos
7/51
2. A C/OS tulajdonsgai
forrskdban rendelkezsre ll hordozhat (processzor fgg rszek kln) sklzhat multi-tasking preemptv temez determinisztikus futsi id minden taszknak klnbz mret lehet a stack-je rendszer szolgltatsok: mailbox, queue, semaphore,
fix mret memria partci, id szolgltatsok stb. interrupt management (255 szint
egymsbagyazhatsg) robusztus s megbzhat
-
8/3/2019 Slides 11 Ucos
8/51
2. A C/OS tulajdonsgai
nagyon jl dokumentlt (C/OS-II, The Real-Time Kernelknyv 300 oldalon elemzi a kdot)
oktatsi clra a kernel ingyenesen hozzfrhet
kiegszt csomagok: TCP-IP (Protocol Stack) FS (Embedded File System) GUI (Embedded Graphical User Interface) USB Device (Universal Serial Bus Device Stack) USB Host (Universal Serial Bus Host Stack) FL (Flash Loader) Modbus (Embedded Modbus Stack) CAN (CAN Protocol Stack)
BuildingBlocks (Embedded Software Components) Probe (Real-Time Monitoring)
-
8/3/2019 Slides 11 Ucos
9/51
3. A C/OS felptseApplication software
C/OS-II(Processor Independent Code)
OS_CORE.C OS_TASK.C
C/OS-II Configuration(Application Specific)
OS_CFG.H
Hardware
Software
CPU Timer
C/OS-II Port(Processor Specific Code)
OS_CPU.H OS_CPU.C OS_CPU_A.ASM
_ . _ .OS_MEM.COS_Q.C uCOS_II.COS_SEM.C uCOS_II.H
.
-
8/3/2019 Slides 11 Ucos
10/51
4. A C/OS konfigurlsa (OS_CFG.H)
/* ---------------------- Miscellaneous ----------------------- */
#Define OS_ARG_CHK_EN 1 /* enable (1) or disable (0) argument checking */
#Define OS_CPU_HOOKS_EN 0 /* uc/os-ii hooks are found in the processor port files */
* *
A sklzs #define sorokkal trtnik a konfigurcis header fjlban.
_ _
#Define OS_MAX_EVENTS 20 /* max. Number of event control blocks in your application */#Define OS_MAX_FLAGS 5 /* max. Number of event flag groups in your Application */
#Define OS_MAX_MEM_PART 10 /* max. Number of memory partitions */
#Define OS_MAX_QS 5 /* max. Number of queue control blocks in your Application */
#Define OS_MAX_TASKS 32 /* max. Number of tasks in your application */
#Define OS_SCHED_LOCK_EN 1 /* include code for osschedlock() and Osschedunlock() */
#Define OS_TASK_IDLE_STK_SIZE 512 /* idle task stack size */
#Define OS_TASK_STAT_EN 1 /* enable (1) or disable(0) the statistics task */
#Define OS_TASK_STAT_STK_SIZE 512 /* statistics task stack size */
#Define OS_TICKS_PER_SEC 200 /* set the number of ticks in one second */
-
8/3/2019 Slides 11 Ucos
11/51
4. A C/OS konfigurlsa (OS_CFG.H)/* ----------------------- EVENT FLAGS ------------------------ *#define OS_FLAG_EN 0 /* Enable (1) or Disable (0) code generation for EVENT FLAGS */
#define OS_FLAG_WAIT_CLR_EN 1 /* Include code for Wait on Clear EVENT LAGS */
#define OS_FLAG_ACCEPT_EN 1 /* Include code for OSFlagAccept() */
#define OS_FLAG_DEL_EN 1 /* Include code for OSFlagDel() */#define OS_FLAG_QUERY_EN 1 /* Include code for OSFlagQuery() */
/* ------------------------ SEMAPHORES ------------------------ */
e ne _ _ na e or sa e co e genera on or
#define OS_SEM_ACCEPT_EN 1 /* Include code for OSSemAccept() */#define OS_SEM_DEL_EN 1 /* Include code for OSSemDel() */
#define OS_SEM_QUERY_EN 1 /* Include code for OSSemQuery() */
/* ---------------- MUTUAL EXCLUSION SEMAPHORES --------------- */#define OS_MUTEX_EN 0 /* Enable (1) or Disable (0) code generation for MUTEX */
#define OS_MUTEX_ACCEPT_EN 1 /* Include code for OSMutexAccept() */
#define OS_MUTEX_DEL_EN 1 /* Include code for OSMutexDel() */
#define OS_MUTEX_QUERY_EN 1 /* Include code for OSMutexQuery() */
-
8/3/2019 Slides 11 Ucos
12/51
4. A C/OS konfigurlsa (OS_CFG.H)/* -------------------- MESSAGE MAILBOXES --------------------- */#define OS_MBOX_EN 1 /* Enable (1) or Disable (0) code generation for MAILBOXES */
#define OS_MBOX_ACCEPT_EN 1 /* Include code for OSMboxAccept() */
#define OS_MBOX_DEL_EN 0 /* Include code for OSMboxDel() */
#define OS_MBOX_POST_EN 1 /* Include code for OSMboxPost() */#define OS_MBOX_POST_OPT_EN 0 /* Include code for OSMboxPostOpt() */
#define OS_MBOX_QUERY_EN 0 /* Include code for OSMboxQuery() */
* ---------------------- ---------------------- *
#define OS_Q_EN 1 /* Enable (1) or Disable (0) code generation for QUEUES */#define OS_Q_ACCEPT_EN 1 /* Include code for OSQAccept() */
#define OS_Q_DEL_EN 1 /* Include code for OSQDel() */
#define OS_Q_FLUSH_EN 1 /* Include code for OSQFlush() */
#define OS_Q_POST_EN 1 /* Include code for OSQPost() */
#define OS_Q_POST_FRONT_EN 1 /* Include code for OSQPostFront() */#define OS_Q_POST_OPT_EN 1 /* Include code for OSQPostOpt() */
#define OS_Q_QUERY_EN 1 /* Include code for OSQQuery() */
/* --------------------- MEMORY MANAGEMENT -------------------- */
#define OS_MEM_EN 0 /* Enable (1) or Disable (0) code gen.for MEM.MANAGER */#define OS_MEM_QUERY_EN 1 /* Include code for OSMemQuery() */
-
8/3/2019 Slides 11 Ucos
13/51
4. A C/OS konfigurlsa (OS_CFG.H)/* --------------------- TASK MANAGEMENT ---------------------- */
#define OS_TASK_CHANGE_PRIO_EN 0 /* Include code for OSTaskChangePrio() */
#define OS_TASK_CREATE_EN 0 /* Include code for OSTaskCreate() */
#define OS_TASK_CREATE_EXT_EN 1 /* Include code for OSTaskCreateExt() */
#define OS_TASK_DEL_EN 0 /* Include code for OSTaskDel() */
#define OS_TASK_SUSPEND_EN 0 /* Include code for OSTaskSuspend() and OSTaskResume() */
#define OS_TASK_QUERY_EN 0 /* Include code for OSTaskQuery() */
/* --------------------- TIME MANAGEMENT ---------------------- */
#define OS_TIME_DLY_HMSM_EN 1 /* Include code for OSTimeDlyHMSM() */
#define OS_TIME_DLY_RESUME_EN 0 /* Include code for OSTimeDlyResume() */
#define OS_TIME_GET_SET_EN 0 /* Include code for OSTimeGet() and OSTimeSet() */
typedefINT16U OS_FLAGS; /* Date type for event flag bits (8, 16 or 32 bits) */
-
8/3/2019 Slides 11 Ucos
14/51
4. A C/OS konfigurlsa (OS_CFG.H)#if OS_SEM_ACCEPT_EN > 0
INT16U OSSemAccept (OS_EVENT *pevent) {
INT16U cnt;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
A forrskd a #define sorokra plten tartalmaz feltteles fordtsi direktvkat.
en
#if OS_ARG_CHK_EN > 0
if(pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
return (0);
}
#endif
}
#endif
-
8/3/2019 Slides 11 Ucos
15/51
5. A
C/OS taszk llapotai
WAITING
READY RUNNING
OSIntExit()
*
*
-
8/3/2019 Slides 11 Ucos
16/51
5. A C/OS taszk llapotai
Kt specilis llapot: DORMANT: szunnyad, akkor van ebben az llapotban a
taszk, amikor a memriban ugyan megtallhat, de az
temez hatskrben nincs benne (nem hoztk mg ltreOSTaskCreate(), vagy trltk OSTaskDel())
ISR: a taszkot megszaktotta egy interrupt rutin. Ha a rutinmellkhatsaknt egy magasabb priorits taszk vlik futsra
kssz, akkor a rutin vgeztvel az kerl a RUNNIG llapotba,s a megszaktott taszk pedig a WAITING-be
Ha nincs egy futsra ksz taszk sem, akkor egyspecilis taszk, az OSTaskIdle() fut.
-
8/3/2019 Slides 11 Ucos
17/51
6. A C/OS temezje
A futsra ksz taszkok egy 2D bitmapstruktrban troldnak, ahol az egyes bitek
ep eze a asz o a . a egy , ahozz tartoz taszk futsra ksz. A bitekprioritst is jelentenek (az egyik sarokban alegmagasabb, a msikban a legalacsonyabbpriorits taszkhoz tartoz bit tallhat).
-
8/3/2019 Slides 11 Ucos
18/51
6. A C/OS temezje
+ Gyors beszrs, ami fggetlen a futsra ksztaszkok szmtl. Csupn pr egyszer mvelet kella megfelel bit belltshoz. Tovbb a
legmagasabb futsra ksz taszkot is gyorsan meglehet tallni lookup-table segtsgvel. A taszkoknak egyedi prioritssal kell rendelkeznik
(azaz a round-robin / time slice temezs nem
lehetsges) Szksg van egy lookup tblzatra elre szmtottrtkekkel a bitminta legmagasabb prioritsfutsra ksz taszkmegfeleltetshez
-
8/3/2019 Slides 11 Ucos
19/51
-
8/3/2019 Slides 11 Ucos
20/51
6. A C/OS temezje
ptkockk temezshez:1. taszk kivtele a futsra kszek kzl
.
3. a legmagasabb priorits, futsra ksz taszk megtallsa4. kontextus vlts
-
8/3/2019 Slides 11 Ucos
21/51
6. A C/OS temezje
Kik hasznljk az imnt ismertetettptkockkat?
1.
asz v te e a ut sra sze z :vrakoz rendszerhvsok (pl. OSSemPend(),OSMBoxPend(), OSTimeDly()). Elszrelvgzik a rjuk jellemz mveletet (pl. szemafor
lefoglalsa), majd kiveszik a futsra ksz taszkokhalmazbl az ket meghv taszkot. A vgnpedig meghvjk az temezt.
-
8/3/2019 Slides 11 Ucos
22/51
6. A C/OS temezje
2. Taszk futsra kssz ttele: elengedrendszerhvsok (pl. OSSemPost(),OSMBoxPost va adott id letelte. Elszr
elvgzik a rjuk jellemz mveletet (pl. szemaforfelszabadtsa), majd futsra kssz teszik amegfelel taszkot, taszkokat. A vgn pedigmeghvjk az temezt.
-
8/3/2019 Slides 11 Ucos
23/51
6. A C/OS temezje
3. A legmagasabb priorits, futsra ksz taszkmegtallsa: az temez feladata. Ha ale ma asabb riorits futsra ksz taszk
prioritsa nem egyezik meg az ppen futval,elvgzi a taszk vltst.
4. Kontextus vlts: szintn az temez feladata.
-
8/3/2019 Slides 11 Ucos
24/51
6. A C/OS temezje
OSRdyGrp |= OSMapTbl[prio >> 3];
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
2. Taszk futsra kssz tteleA taszk prioritsa ltal kijellt biteket 1-be kell billenteniaz OSRdyGrp-ben s az OSRdyTbl-ben.
Index Bit mask (binary)0 000000011 00000010
2 000001003 000010004 00010000
5 00100000
6 010000007 10000000
OSMapTbl:
prio: a taszk prioritsaprio >> 3: YYYprio & 0x07: XXX
0 0 Y Y Y X X XPriorits:
bit pozci OSRdyTbl egyik sorn bell
kijelli OSRdyTbl egyik sort illetveaz ehhez a sorhoz tartoz OSRdyGrp bitet
-
8/3/2019 Slides 11 Ucos
25/51
6. A C/OS temezje
1. Taszk kivtele a futsra kszek kzlA taszk prioritsa ltal kijellt bitet trlni kell a megfelelOSRdyTbl sorbl. Ha ezzel nem marad egy futsra ksztaszk sem az adott sorban, a sornak megfelel bitet azOSRdyGrp-bl is trlni kell.
if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0)OSRdyGrp &= ~OSMapTbl[prio >> 3];
-
8/3/2019 Slides 11 Ucos
26/51
6. A C/OS temezje
3. A legmagasabb priorits futsra ksz taszk megtallsa
Erre a clra egy segdtblzatot hasznlnak, aminek az afeladata, hogy egy adott 8 bites szmrl megmondja, melyikaz a legalacsonyabb bitpozci (azaz legmagasabb priorits),ahol 1-es tallhat.
Pldul:
0 0 1 0 1 1 0 0
7. 6. 5. 4. 3. 2. 1. 0.
0x2C 2.
Hexa Binris Legalacsonyabb 1-es
-
8/3/2019 Slides 11 Ucos
27/51
6. A C/OS temezjeINT8U const OSUnMapTbl[256] = {
0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0x00 to 0x0F */
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0x10 to 0x1F */
5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0x20 to 0x2F */
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0x30 to 0x3F */
6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0x40 to 0x4F */
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0x50 to 0x5F */
, , , , , , , , , , , , , , , ,
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0x70 to 0x7F */7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0x80 to 0x8F */
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0x90 to 0x9F */
5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0xA0 to 0xAF */
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0xB0 to 0xBF */6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0xC0 to 0xCF */
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0xD0 to 0xDF */
5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, /* 0xE0 to 0xEF */
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 /* 0xF0 to 0xFF */
};
-
8/3/2019 Slides 11 Ucos
28/51
6. A C/OS temezje
Elszr meg kell hatrozni azt a sort (csoportot, YYYrtket), ami a legmagasabb priorits 1-es tartalmazza,majd a soron bell is meg kell keresni a legmagasabbprioritst azonost 1-est (XXX). Ezt kveten alegmagasabb priorits mr szmolhat: YYY * 8 + XXX.
y = OSUnMapTbl[OSRdyGrp];x = OSUnMapTbl[OSRdyTbl[y]];
prio = (y
-
8/3/2019 Slides 11 Ucos
29/51
6. A C/OS temezje
4. Kontextus vlts
1.az aktulis krnyezet mentse: regiszterek mentse veremmutat mentse
A kontextus vlts platform fgg!
2.az j krnyezet visszalltsa: veremmutat visszalltsa regiszterek visszalltsa
-
8/3/2019 Slides 11 Ucos
30/51
6. A C/OS temezje
Az temez egy fggvny, amelyet msOS fggvnyek hvhatnak meg. Pl.: ha leakarunk foglalni egy szemafort, de az mgnem szabad, akkor az OSSemPend()
v s vesz a u sra sze z azaktulis taszkot, s meghvja az temezt,ami eldnti, hogy a megmaradt futsra
ksz taszkok kzl melyiknek van alegmagasabb a prioritsa, s vgrehajtja akontextus vltst.
-
8/3/2019 Slides 11 Ucos
31/51
6. A C/OS temezjevoid OSSched (void)
{
INT8U y;
OS_ENTER_CRITICAL();
if ((OSLockNesting | OSIntNesting) == 0) {y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((y
-
8/3/2019 Slides 11 Ucos
32/51
6. A C/OS temezje
if (OSPrioHighRdy != OSPrioCur) {
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++;
OS_TASK_SW();}
A kontextusvlts azzal kezddik, hogy kikeressk a legmagasabb prioritsfutsra ksz taszk TCB-jre (Task Control Block) mutat pointert. (A TCB troljaa taszkra jellemz adatokat mint priorits, sttusz, verem mutat stb. Mskrnyezetben PCB-nek nevezik (Process Control Block).) Ezutn egy, akontextusvltsokat statisztikai okokbl szmol szmll rtkt nveljkeggyel. A tnyleges krnyezetvltst (regiszterek, stack pointer mentse,visszalltsa) pedig processzor fgg assembly kd vgzi.
-
8/3/2019 Slides 11 Ucos
33/51
6. A C/OS temezje
typedef struct os_tcb {
OS_STK *OSTCBStkPtr; // Pointer to top of stack
...
INT16U OSTCBDly; // Ticks to delay task or timeout wait
Fontosabb mezk a Task Control Block struktrban:
INT8U OSTCBStat; Task status
INT8U OSTCBPrio; // Task priority
...
} OS_TCB;
-
8/3/2019 Slides 11 Ucos
34/51
6. A C/OS temezje
OS_TASK_SW()
1. az aktulis krnyezet mentse: regiszterek mentse veremmutat mentse
2. az j krnyezet visszalltsa:
PUSHRS
PUSHSREG
LDS R30,OSTCBCur
LDS R31,OSTCBCur+1
in r28,_SFR_IO_ADDR(SPL)
ST Z+,R28
in r29,_SFR_IO_ADDR(SPH)ST Z+,R29
CALL OSTaskSwHook
LDS R16 OSPrioHi hRd
veremmutat visszalltsa regiszterek visszalltsa
STS OSPrioCur,R16
LDS R30,OSTCBHighRdy
LDS R31,OSTCBHighRdy+1
STS OSTCBCur,R30
STS OSTCBCur+1,R31
LD R28,Z+out _SFR_IO_ADDR(SPL),R28
LD R29,Z+
out _SFR_IO_ADDR(SPH),R29
POPSREG
POPRS
A kontextus vlts platform fgg!A bemutatott kdrszlet AVR ATmega128mikrovezrlre vonatkozik.
-
8/3/2019 Slides 11 Ucos
35/51
7. Idzt (timer)
klnfle okokbl szksg lehet az idmlsnak kvetsre, pldul:
t me-s c ng temez s ez - a att n ncs taszk futsnak adott ideig trtn felfggesztse timeoutos OS hvsok fggvny adott id mlva trtn meghvshoz fggvny adott idkznknt trtn periodikus
meghvshoz az id mrsre
-
8/3/2019 Slides 11 Ucos
36/51
7. Idzt (timer)
ezen a clokra az OS felhz egy hardvertimert (heartbeat timer), ami aztnpe o us egsza so a ge eticks)
Mekkora legyen egy rats? minl kisebb, annl pontosabbak lesznek az
idztn alapul szolgltatsok minl nagyobb, annl kevesebb overheadet jelent
a timer megszakts
-
8/3/2019 Slides 11 Ucos
37/51
7. Idzt (timer)
Erre a megszaktsra az OS felfz nmikdot sajt magbl. Ez biztostja pldulaz , ogy a egy asz a o e e emagt vrakoz llapotba, akkor az idletelte utn futsra ksz lehessen.
Tovbb ha felbredse esetn alegnagyobb priorits, akkor a timer ISR utnaz OS erre a taszkra adja a futs jogt.Megvalstva a preempcit.
-
8/3/2019 Slides 11 Ucos
38/51
7. Idzt (timer)
taskDelay (4) taskDelay (4)
Pontossg: 1 rats Minimum n rats ksleltetshez n+1-et kell megadni
Time
System ticks3.93 ticks 3.16 ticks
-
8/3/2019 Slides 11 Ucos
39/51
8. Egyb OS szolgltatsok
Taszk kezelsLtrehozsMegszntets
Id kezelsasz u s na a o ve r n
ksleltetseRendszer id lekrdezs
Memria partcik kezelseLefoglalsFelszabadts
-
8/3/2019 Slides 11 Ucos
40/51
8. Egyb OS szolgltatsok
Szinkronizci / kommunikciSzemafor (szmll)Mailbox (~ szemafor + void*)Queue (~ n*mailbox)
Mutex (szemafor priorits inverzi ellenivdelemmel: priorits rkls protokoll)Event flags (8, 16, 32 bites vltoz; bitek
tetszleges S, VAGY kombincijra lehetvrni)
-
8/3/2019 Slides 11 Ucos
41/51
9. A C/OS alkalmazs tipikus szerkezetevoid YourTask (void *pdata){
for (;;) {
/* USER CODE */
!! Call one of uC/OS-IIs
!! services: OSMboxPend(),
!! OSQPend(),OSSemPend(),
!! OSTaskDel(OS_PRIO_SELF),
!! OSTaskSuspend(OS_PRIO_SELF),
void YourTask (void *pdata)
vagy
Vgtelen ciklus taszk szervezs
Single shot taszk szervezs
void main (void){
OSInit(); /* Initialize uC/OS-II */
...
!! Create at least 1 task using either OSTaskCreate() or
!! OSTaskCreateExt(). And maybe other OS objects (MBox, ...).
...
OSStart(); /* Start multitasking! OSStart() will not return */}
,
/* USER CODE */}
}
/* USER CODE */OSTaskDel(OS_PRIO_SELF);
}
-
8/3/2019 Slides 11 Ucos
42/51
10. Egyszer pldaprogram
A kvetkezkben egy egyszer pldaprogramsegtsgvel szemlltetjk a C/OS mkdst.
A program tartalmaz egy inicializl taszkot, melynekfeladata az idzt megszakts belltsa (ami az OSidkezel szolgltatsaihoz kell), valamint ltrehoz msik
,
a hagyomnyos vgtelen ciklus taszk szervezstleltr, egyszeri lefuts taszk struktrra). A msik kt taszk mindegyike 4ms hossz hasznos kd
futst szimullja (szoftveres vrakoz hurkokkal). Eztkveten mindkett elkldi magt OS rtelemben vett(idre) vrakoz llapotba. A magasabb priorits 4, azalacsonyabb 2 ra tsig (1 ra ts = 10 ms). (Mindkt
taszk vgtelen ciklus szervezs.)
-
8/3/2019 Slides 11 Ucos
43/51
10. Egyszer pldaprogram (kd 1/4)#include "includes.h"
// Prioritsok (kisebb szm -> nagyobb priorits):
#define TASK_INIT_PRIO 24
#define TASK_HIGH_PRIO 37
#define TASK_LOW_PRIO 50
Vermek lefo lalsa:
#define STACK_SIZE 128
OS_STK TaskInitStk[STACK_SIZE];
OS_STK TaskHighStk[STACK_SIZE];
OS_STK TaskLowStk[STACK_SIZE];
// Fggvny deklarcik:void TaskInit(void *data);
void TaskHigh(void *data);
void TaskLow(void *data);
...
-
8/3/2019 Slides 11 Ucos
44/51
10. Egyszer pldaprogram (kd 2/4)...
void main (void)
{
OSInit(); // Az OS inicializcija
// TaskInit ltrehozsa:
OSTaskCreate(
// A taszk kdjt tartalmaz fggvny:
TaskInit,
// Opcionlis paramter:NULL,
// A taszk vermnek teteje:
&TaskInitStk[STACK_SIZE - 1],
// A taszkhoz rendelt priorits:
TASK_INIT_PRIO);
OSStart(); // Multitaszking indtsa
}
...
-
8/3/2019 Slides 11 Ucos
45/51
10. Egyszer pldaprogram (kd 3/4)...
void TaskInit (void *data) {
// Timer interrupt inicializls (1 OS tick = 10ms):
INIT_TIMER();
// TaskHigh s TaskLow ltrehozsa:
OSTaskCreate(
TaskHigh, NULL, &TaskHighStk[STACK_SIZE - 1],
TASK_HIGH_PRIO);
OSTaskCreate(
TaskLow, NULL, &TaskLowStk[STACK_SIZE - 1],
TASK_LOW_PRIO);
// Sajt magunk trlse -> plda egyszer lefut taszkra:
OSTaskDel(OS_PRIO_SELF);
}
...
-
8/3/2019 Slides 11 Ucos
46/51
10. Egyszer pldaprogram (kd 4/4)...
void TaskHigh(void *data) {
while(1) {
// 4ms hasznos kd szimullsa:
_delay_ms(4);// Vrakoz llapotba klds, breds 4 OS tick mlva:
OSTimeDly(4);
}
}
void TaskLow(void *data) {
while(1) {
// 4ms hasznos kd szimullsa:
_delay_ms(4);
// Vrakoz llapotba klds, breds 2 OS tick mlva:
OSTimeDly(2);
}
}
-
8/3/2019 Slides 11 Ucos
47/51
10. Egyszer pldaprogram (futs)
Amennyiben az adott fejlesztpanelrendelkezik analg kimenettel, a program
futsnak szemlltetsre egy bevltgyakorlat, hogy az ppen fut taszkpr or s va ar nyos esz s g sz n eadunk ki. (Tovbb rdemes lehet mg azidzt megszaktshoz is rendelni egy
szintet.)
-
8/3/2019 Slides 11 Ucos
48/51
10. Egyszer pldaprogram (futs)
Bizonyos opercis rendszerekhez (pl.FreeRTOS) ltezik ilyen kiegszt modul.
A C/OS itt alkalmazott verzijt nmikiegszts, mdosts segtsgvele e e a a mass enn a e a a ra.
-
8/3/2019 Slides 11 Ucos
49/51
10. Egyszer pldaprogram (futs)
TaskInit
TimerISR
10ms4ms
1
2
TaskHigh
TaskLow TaskIdle
4ms1
2
A futs szemlltetse a taszkokhoz s az idzt megszaktshozrendelt feszltsg szintek kiadsval.
-
8/3/2019 Slides 11 Ucos
50/51
10. Egyszer pldaprogram (futs)
A program futsa az elz brn jlkvethet. A teljessgre trtn magyarzat
helyett kt fontosabb szrevtel a szmokkaljellt idpontokra:
(1): ezekben a pontokban mind a magas, mindaz alacsony priorits taszk futsra ksz.Lthat, hogy az OS temezje ilyen esetbenelszr a magas priorits taszkot temezi.
(2): ezen esetekben pedig azt rdemesszrevenni, hogy egy megszakts utn NEMfelttlen a megszaktott taszk folytatja a futst!
-
8/3/2019 Slides 11 Ucos
51/51
10. jdonsgok v2.52 ta Vrakozs egyszerre tbb esemnyre:
szemafor, mailbox, queue mutex, event
flag mg nem tmogatott (v2.86) Idztk: fggvny adott id mlva vagyeriodikus hvsra v2.81
255 taszk tmogatsa (v2.80) C/OS-IIITetszleges szm taszk s egyb OS
objektumEgy prioritsi szinten lehet tbb taszk is (
round-robin vagy time-slicing temezs)Nulla kzeli megszakts tilts id