WebElektronika

A FreeRTOS alapjai I.

person access_time 2015.05.29.
Hát igen.... Elérkeztünk a 100. cikkhez. Köszönjük az érdeklődést, a visszajelzéseket. Ezért valami érdekessel, nem annyira ismert témával ünnepeljük ezt a kerek fordulót. A választás a FreeRTOS-ra, egy valósidejű operációs rendszerre esett. Ezt a beágyazott rendszerekben használják. A következő két-három hétben a FreeRTOS kerül a középpontba, megnézzük (alap)szinten néhány tulajdonságát, illetve egy-két példát is átnézünk. Nos.... Kalandra fel!!!


Ahogyan növeljük az adott mikrokontroller sebességét, a rajta futó alkalmazásunk bonyolultsága úgy csökken, ha nem használunk a mikrovezérlőn futó operációs rendszert. Ezért a fejlesztők bizonyos működési sebességnél (és bonyolultságnál) már valamilyen operációs rendszer használata mellett döntenek. Az egyik lehetséges választás a FreeRTOS.

Ahhoz, hogy a FreeRTOS-t megismerjük, szükséges először átnéznük az operációs rendszerek alapjait, azután a következő cikkben a FreeRTOS néhány tulajdonságát tekintjük át, hogy ezt követően a közölt példák érthetők legyenek. Nem törekszünk az operációs rendszer tulajdonságainak a részletes ismertetésére, célunk az alapfogalmak tisztázása.

A kernel intézi a task-ok (folyamatok) meghívását, menedzselését. A taszkok egymást nem "zavarják", viszont a folyamatok futtatásához operációs rendszer kell. Ilyen operációs rendszer például a FreeRTOS.

 

Operációs rendszerek feladatai

  • task-ok (az op.rendszerek egyik legfontosabb alapfogalma)
    • task létrehozása
      • TCB-t (Task Control Block) hoz létre (task.kal kapcsolatos adatok tárolása), dinamikus memóriakezelés
      • taskváltáskor el kell menteni az esetleges változókat
    • task futtatása
      • a task futhat (övé  a CPU)
      • a task várakozhat
      • a task blokkolva van
    • adat tehető be/ki egy adott memóriaterületen
      • a task "fogyasztó", ha adatot vesz ki
      • a task "termelő", ha adatot tesz be erre a memóriaterületre
    • a sorok a task-ok közötti kommunikációra szolgál, a területe rögzített
      • blokkolhat a sor task-ot, ha a sor üres, vagy tele van
  • kommunikáció biztosítása a task-ok között
  • hardverfüggetlenség
  • erőforrások kezelése
  • memóriamanagment

 

Ütemező (CPU scheduling) feladata

Az ütemező feladata a processzor "odaadása" a futásra kész task-ok egyikének. A task-okat általában sorokban tároljuk. Minden task-nak van prioritása, ennek segítségével dönti el az ütemező, hogy ki kapja meg a futási jogot. Ez a prioritás változhat dinamikusan, sőt le is kérhető. Előfordulhat, hogy a két tasknak a prioritása megegyezik, ekkor az ütemezőtől egyforma időt kapva egymás után kapnak futási jogot (feltéve, ha más task-nak nem lesz nagyobb a prioritása).

Ütemezési algoritmusok
  • prioritásos ütemezők
    • a taskok érkezési sorrendben kapják meg a futási jogot, azaz a processzort (First Come First Served, FCFS)
      • egyszerű
      • sok múlik az érkezési sorrendtől
    • amikor egy task befejezi a feladatát, a futási jogot a legrövidebb futásidejű task kapja (Shortest Job First, SJF)
      • legrövidebb a várakozási idő
      • nem preemptív
      • előre tudni kell az adott futtatni kívánt folyamat idejét (becslés) Lehet a becslés rossz is.
    • a legrövidebb hátralévő idejű task kapja meg a futási jogot (Shortest Remaining Time First, SRTF)
      • az előző (SJF) preemptív megfelelője
      • melyik tasknak a löketideje kisebb?
      • becsülni kell a löketidőt
  • a taskok "körbe-körbe" kapnak futási jogot (Round Robin (RR))
    • egyszerű
    • nincs kiéheztetés
    • a taskok előre meghatározott időre kapják meg a processzort (adott időnként vált, a tasktól függetlenül)
    • ha az időszelet véget ér, a task állapotát elmentik, a task a sor végére kerül

A prioritásos ütemezők nem fair-ek, hiszen előfordulhatnak kiéheztetések is.

Érdemes itt megjegyezni azt, hogy mi történik akkor, amikor nincs olyan task, amely futhat. Tehát mi fut, ha semmi sem futhat? Ekkor ún. "Idle" fut, amely különböző feladatokat takarhat. Ilyen lehet például valamilyen háttérfolyamat, amelynek alacsony a prioritása. Látni fogjuk a FreeRTOS-nál, hogy erre a célra van a void vApplicationIdleHook(void)

 

FreeRTOS bevezető

Ez az operációs rendszer nyílt forráskódú, "C" nyelven készült. Alapvetően 16 és 32 bites mikrovezérlőknél használható, de megkötésekkel PIC18F családon is alkalmazható. De természetesen nem csak a Microchip által gyártott mikrovezérlőkön használható ez az operációs rendszer, hanem az ARM-októl kezdve a Cortex-eken át a MicroBlaze-en keresztül az NiosII-ig elég nagy a felhasználható architektúrák száma.

Fontos megjegyezni, hogy a fejlesztő kódjával együtt fordul le hex file-ba az operációs rendszer. A FreeRTOS a következő file-okból áll :

  • "fejléc" file-ok
    • tasks.h
    • list.h
    • queue.h
    • croutine.h
  • fejlécállomány
    • FreeRTOS.h
  • rendszermag
    • tasks.c
    • list.c
    • queue.c
    • croutine.c
  • hardverabsztrakciós réteg
    • port.c
    • portmacro.c
  • memóriamenedzsment (configTOTAL_HEAP_SIZE makró)
    • heap_1.c
    • heap_2.c
    • heap_3.c
  • konfigurációs "fejléc" file
    • FreeRTOSConfig.h

Ha letöltjük a FreeRTOS aktuális verzióját, a kicsomagolás után különböző alkönyvtárakban találjuk meg az adott mikrovezérlőre elkészített demot. A PIC32MX_MPLAB könyvtárban található demoprojektnek a felépítését mutatja a következő ábra. 

kep
1. ábra   FreeRTOS projekt felépítése PIC32 mikrovezérlőnél
 

A Source Files mappában nincs minden file-ra szükségünk, és a később közölt példáknál is új main.c-t fogunk készíteni. Érdemes megjegyezni még azt is, hogy a függvények nevei mindig a visszatérési értékkel kezdődnek.

példa : vTaskDelete()   :   void-ot ad vissza  (töröljük az adott task-ot)


A FreeRTOS-nál is egyszerre csak egy szál futhat, azaz, egy szál vagy fut, vagy nem fut állapotban van (2. ábra). A nem fut állapot több részre is bontható, erről később.

kep
2. ábra   Fut, nem fut állapotok (Nicolas Melot, Study of an operating system: FreeRTOS)
 

Egyszerre tehát csak egy szál futhat, ez mutatja meg a 3. ábra.

kep
3. ábra   Taskok futása, állapotváltások  (Richard Barry, FreeRTOS Manual, 2003-2005)
 

Először az első task (Task1) kap futási jogot (1. állapot), a második állapotban a kernel felfüggeszti a Task1 futását, de a másik task (Task2) még nem kap jogot a futásra. A 2. és a 3. állapot között adminisztrációs idő lép fel. A 3. állapotban a kernel elindítja a Task2-t és ez a szál fut a 4. állapotban.

Különbség van azonban a nem futó szálak állapotai között. Megkülönböztetünk futásra kész szálat (futna, de nem elég nagy a prioritása), felfüggesztett szálat (nem versenyez a futási jogért), illetve blokkolt szálat is (4. ábra).

kep
4. ábra   Lehetséges állapotok (Nicolas Melot, Study of an operating system: FreeRTOS)
 

 

Folytatjuk sorozatunkat pár nap múlva a szálak létrehozásával, menedzselésével.