A Parallax Propeller, terméknevén P8X32A, egy többmagos párhuzamos architektúrájú mikrovezérlő integrált áramkör, amely nyolc függetlenül működő 32 bites csökkentett utasításkészletű (RISC) mikroprocesszor (CPU) maggal rendelkezik. A Parallax, Inc. tervezte, 2006-ban mutatták be, és jelenleg is ez a cég forgalmazza.
A Propeller mikrovezérlőt, a Propeller assembly nyelvet és a Spin interpretert maga Chip Gracey, a Parallax társalapítója és elnöke tervezte. A Spin programozási nyelvet és a Propeller Tool integrált fejlesztői környezetet (IDE) Chip Gracey és Jeff Martin, a Parallax szoftvermérnöke tervezte.
2014. augusztus 6-án a Parallax Inc. az összes Propeller 1-es P8X32A hardvert és eszközt nyílt forráskódú licenc alá helyezte, nyílt forráskódú hardverként és szoftverként a GNU General Public License (GPL) 3.0 változatú licenc alatt. Ezek körébe beletartozik a hardver Verilog forráskódja, a felső szintű HDL fájlok, a Spin értelmező, a PropellerIDE és SimpleIDE programozási eszközök és fordítóprogramok.
2020-ban jelent meg a Parallax Propeller 2 (P2X8C4M64P) többmagos mikrovezérlő, amely egy közös hubhoz kapcsolódó 8 azonos 32 bites processzort tartalmaz.
Többmagos architektúra
Az eszköz központi megosztott memóriája méretű közvetlen hozzáférésű memória (RAM) és csak olvasható memória (ROM). Az osztott memóriához történő hozzáférést egy belső, hub-nak nevezett sínvezérlő felügyeli, körforgásos (round-robin) rendszerben – a hub jelentése kerékagy, itt központ, elosztó, koncentrátor jelentéssel értendő. Az eszközben nyolc 32 bites mag található, amelyeket cog-nak, (fogas)kerékfognak neveztek el. Ezek mindegyike rendelkezik egy processzorral, és 512 32 bites szó, azaz 2 KiB méretű memóriával, az utasítások és adatok tárolásához. A cogok Propeller assembly (PASM, alacsony szintű) és Spin nyelven programozhatók. A Spin egy objektumalapú magas szintű nyelv, melyben a forráskódot a nyelv fordítóprogramjával bájtkódra fordítják, és ezt a kódot dolgozza fel és hajtja végre az eszközben a Spin interpreter. A Spin nyelvű programokban szubrutinok és beágyazott assembly nyelvű kódrészletek használhatók. Az önmódosító kód lehetséges és belsőleg használja is a rendszer, például amikor a boot loader (rendszerbetöltő program) felülírja magát a Spin interpreterrel. A Spin szubrutinok a szokásos hívás-visszatérés technikával hívhatók, amihez egy hívási verem szükséges. Az assembly kódnak nincs szüksége hívási veremre. Minden cog hozzáfér két dedikált hardveres számlálóhoz és egy speciális videógenerátorhoz, amelyek PAL, NTSC, VGA, szervómechanizmus-vezérlés/irányítás, és más időzítőjelek előállítására használhatók.
Sebesség és energiagazdálkodás
A Propeller különböző órajelekkel vezérelhető, amit szolgáltathat egy belső, lapkára integrált oszcillátor (ez alacsonyabb alkatrészszámot biztosít, viszont a pontossága és termális stabilitása kisebb), vagy külső kristályoszcillátor vagy kerámiarezonátor, ami nagyobb maximális sebességet és nagyobb pontosságot biztosít, de magasabb összköltséggel jár. Csak a külső oszcillátor futtatható a lapkára integrált fáziszárt hurok (PLL) órajelszorzón keresztül, amely 1x, 2x, 4x, 8x vagy 16x értékre állítható be.
Mind a kártyára szerelt oszcillátor frekvenciája, mind a PLL szorzó értéke futás közben változtatható. Helyes használat mellett ez javíthatja az energiahatékonyságot; például a PLL szorzó csökkenthető egy hosszú, időzítéshez szükséges, művelet nélküli várakozás előtt, majd utána visszaállítható, ezzel a processzor energiafogyasztása is csökken. Ennek a technikának a hasznossága viszont csak azokra a helyzetekre korlátozódik, amikor más cog nem hajt végre időzítésfüggő kódot (vagy gondosan úgy van megtervezve, hogy megbirkózzon a változással), mivel az effektív órajel-frekvencia minden cog számára közös.
Az effektív órajelfrekvencia -től a maximális -es órajelig terjed (a pontos értékek a dinamikus vezérléshez a használt konfigurációtól függenek). -es sebességen, a Spin programnyelv interpretált végrehajtása közel utasítástokent hajt végre másodpercenként minden magon, ami összesen 8-szor , azaz magas szintű utasítás másodpercenként. A legtöbb gépi nyelvű utasítás végrehajtása 4 órajelciklust igényel, ami végül 20 millió utasítás másodpercenként (MIPS) egy magon (cog), vagy a teljes 8 magos Propelleren.
Az energiafogyasztás csökkenthető az órajel-frekvencia csökkentésével, a felesleges cogok kikapcsolásával (amelyek ezután kevés energiát használnak) és a szükségtelen be/kimeneti kivezetések átkonfigurálásával, vagy biztonságosan áthelyezhetők egy nagy impedanciájú állapotba (háromállapotú) bemenetként. A kivezetések dinamikusan átkonfigurálhatók, de itt is érvényes az elv, hogy a változás az összes cogra vonatkozik, így bizonyos kialakításokban szükség lehet szinkronizálásra. Bizonyos védelem rendelkezésre áll olyan helyzetekre, mikor az egyik mag kimenetként próbál használni egy tűt, míg egy másik bemenetként próbálja használni ugyanazt; a Parallax műszaki referencia-kézikönyv kifejti ezt az esetet.
Beépített perifériák
Mindegyik cog hozzáfér néhány dedikált számláló-időzítő hardverhez, valamint egy speciális időzítő jelgenerátorhoz, amelynek célja, hogy egyszerűsítse a videókimeneti fokozatok kialakítását, mint például a kompozit PAL vagy NTSC kijelzők (beleértve a sugárzáshoz szükséges modulációt) vagy a VGA monitorok. A Parallaxtól elérhető olyan mintakód, ami képes videójeleket generálni (szöveg és kissé alacsony felbontású grafika) minimális alkatrészhasználattal, amely mindössze a Propeller csipből, egy kristályoszcillátorból, és néhány ellenállásból áll, egy egyszerű digitális-analóg átalakító (DAC) kialakítására. Az oszcillátorfrekvencia ilyenkor lényeges, mivel a videóidőzítő hardver korrekciós képességét az órajel-frekvencia korlátozza. Egy videójel előállításához akár több cog is használható párhuzamosan. Általánosabban, az időzítő hardver különböző impulzusszélesség-modulációjú (PWM) időzítő jelek előállítására használható.
ROM kiterjesztések
A beépített ROM-ban a Spin interpreter és a boot loader (rendszerbetöltő program) mellett található néhány táblázat, amelyek hasznosak lehetnek bizonyos hang-, videó- vagy matematikai alkalmazásokban:
egy bittérképes betűtípus karakterei, amely alkalmas tipikus karaktergeneráló alkalmazások számára (de nem testreszabható); egy logaritmustáblázat (2-es alapú, 2048 bejegyzéssel); egy antilogaritmus táblázat (2-es alapú, 2048 bejegyzéssel); és egy szinusztáblázat (16 bites, 2049 bejegyzéses, az első körnegyed szögeihez, 0-tól π/2-ig terjedő szögekkel; a másik három negyedbe eső szögek függvényei ugyanebből a táblázatból számíthatók).
A matematikai kiterjesztések célja, hogy kompenzálják a lebegőpontos egység hiányát, valamint az olyan egyszerűbb hiányzó műveleteket, mint a szorzás és az osztás (ezt a Spin program elfedi, de az assembly nyelvű rutinokban korlátozó tényező). A Propeller 32 bites processzor, és ezek a táblázatok nem nyújtanak elegendő pontosságot a precízebb számításokhoz.
Beépített Spin bájtkód-interpreter
A Spin egy többfeladatos, magas szintű számítógépes programozási nyelv, amely a Propeller mikrovezérlőkön futó programok fejlesztésére szolgál.
A Pythonhoz hasonlóan a Spin is szóközökkel történő behúzásos szintaxist használ, nem pedig kapcsos zárójeleket vagy kulcsszavakat a blokkok elválasztására.
A Spin kód fejlesztése a Propeller Tool nevű szoftverrel történhet, amely egy eredetileg Windows XP-re készült GUI-orientált szoftverfejlesztő platform. Ez a szoftver a Spin nyelvű forráskódot bájtkódra fordítja, amely ugyanezzel a fejlesztőeszközzel feltölthető a Propeller csip fő RAM-jába, és opcionálisan az I²C soros sín boot- (rendszerindító) EEPROM-jába is.
A Propeller indulása (boot) után a beépített ROM-ból egy bájtkód-értelmező másolódik az elsődleges cog méretű RAM területére, felülírva a boot loadert. Ezután ez a cog elkezdi értelmezni ill. végrehajtani a fő -os RAM-ban elhelyezkedő bájtkódot. Az értelmező dekódolja az utasítássorozatokat, egy utasítást bájtonként. A bájtkód-értelmezőnek más példányai is futhatnak ugyanekkor más cogokban, így több Spin kódú szál futhat egyszerre. A Spin kódú programokba assembly kódú programrészeket is be lehet illeszteni „inline” módon. Ezek az assembler programrészek ezután a saját cogjaikon futnak.
Mivel a Spin szoftveresen értelmezett nyelv, lassabban fut, mint a tiszta Propeller gépi kód, de a helykihasználása jobb lehet: a Propeller assembly opkódok 32 bit hosszúak; a Spin direktívák 8 bitesek, és ezeket további 8 bites bájtok követhetik, amelyek meghatározzák az adott direktíva működését.
Indításkor a bájtkód értelmező egy (kevesebb mint méretű) példánya bemásolódik egy cog dedikált RAM-jába és elkezdi feldolgozni a bájtkódot, amely a fő RAM-ban helyezkedik el. További cogok indíthatók ezen a ponton, az értelmező egy különálló példányát/másolatát betöltve az új cog dedikált RAM-jába – így összesen nyolc értelmező szál futhat egyszerre. Ez azt jelenti, hogy minden Propeller alkalmazás esetében legalább egy minimális mennyiségű indító kódnak Spin kód formájában kell jelen lennie.
Szintaxis A Spin szintaxisában a programot különböző típusú blokkok alkotják, amelyek a következőket tartalmazzák: VAR – globális változók CON – programállandók PUB – nyilvános szubrutin kódja (egy blokkban egy szubrutin, a programban több ilyen blokk szerepelhet) PRI – privát szubrutin kódja OBJ – objektumok kódja DAT – előre definiált adatok, memóriafoglalások és assembly kód
Példák a kulcsszavakra reboot : újraindítja a mikrovezérlőt (rendszer-újraindítás) waitcnt: várakozik, amíg a rendszer számlálója eléri vagy meghaladja a megadott értéket waitvid: várakozik egy (videó) időzítési eseményre, mielőtt kiküldené a (videó) adatokat a be-/kimeneti vonalakra coginit: elindít egy processzort egy új feladattal
Példaprogram
Egy példaprogram (ahogyan az a Propeller Tool szerkesztőprogramban megjelenne), amely minden ciklus után kiírja egy portra az aktuális rendszerszámlálót, és ciklus után leállítja egy másik cog:
Tokozás és perifériás kapcsolatok Az eszköz P8X32A jelű kezdeti verziója egy 32 bites portot biztosít a 40 tűs DIP, 44 tűs LQFP vagy QFN (lapos vezetékmentes felületre szerelhető) tokozáson. A 40 rendelkezésre álló érintkezőből 32 a bemeneti/kimeneti vonalakhoz csatlakozik, négy a tápellátás és földelés számára, kettő külső kristály csatlakoztatására (ha használják), egy áramkimaradás és feszültségcsökkenés észlelésére, és egy a reset/alaphelyzetbe állítás céljaira szolgál.
Mind a nyolc mag hozzáférhet egyidejűleg a 32 bites porthoz (amelyet „A”-val jelölnek; jelenleg nincs „B”). A rendszer egy speciális szabályozó mechanizmust alkalmaz a bemeneti/kimeneti konfliktusok elkerülésére, ha az egyik mag kimenetként, míg a másik bemenetként próbálja használni az I/O csatlakozót. A be-/kimeneti csatlakozók közül bármelyik használható a fent említett időzítési vagy impulzusszélesség-modulációs kimeneti technikákhoz.
A Parallax közölte, hogy a Propeller későbbi verziói várhatóan több be-/kimeneti csatlakozóval és/vagy több memóriával rendelkeznek majd.
Virtuális be-/kimeneti eszközök
A Propellert a „virtuális be/kimeneti eszközök” koncepciója alapján tervezték. Például a HYDRA Game Development Kit (egy amatőröknek tervezett számítógépes rendszer, retró stílusú videójátékok fejlesztésének támogatására) a beépített karaktergenerátort és videótámogató logikát használja egy virtuális grafikai processzor-generátor létrehozásához, amely színes VGA képet, PAL/NTSC kompatibilis színes kimenetet állít elő, vagy RF video+audio folyamot küld ki szoftverből.
Szoftverkönyvtárak állnak rendelkezésre számos be-/kimeneti eszköz megvalósításához, melyekben megtalálhatók az egyszerű UART-ok és soros be-/kimeneti interfészek, mint például SPI, I²C, továbbá PS/2 kompatibilis soros egér és billentyűzet interfészek, motor meghajtók, robotikai rendszerek, MIDI interfészek és LCD vezérlők.
Dedikált magok megszakítások helyett