( asch | 2019. 09. 19., cs – 00:14 )

Az Arduino nem ad ilyet magától, neked kell megvalósítani. A HAL réteget én mindig ott húzom meg, ahol éppen adja magát :-). Átalálban nem érdemes periféria szinten szimulálni, hanem magasabb absztrakciós szinten érdemes.

Pl ha fordulatszámot mérsz úgy, hogy input capture-rel méred az impulzusok között eltelt időt, akkor nem érdemes ezeket szimulálni, hanem a mért fordulatszám legyen az absztrakt API-n, amit megvalósíthatsz szimulátorban. És akkor lehet egy csúszkád, amivel a fordulatszámot állíthatod pl. De a szimulátorban nincsenek tickek, meg input capture.

Például van egy kis OLED képernyőm, ott nem szimulálom az I2C üzeneteket PC-n, hanem van egy memória pufferem amibe rajzolok (1 bit 1 pixel), és az API az, hogy azt mondom: ezt a puffert jelenítsd meg. Aztán interruptokon át kitolja a datát a képernyőre, és mikor kész jelzi, hogy kész. PC-n meg átmásolom egy másik pufferbe, átalakítom RGB-re, és kidobom a képernyőre.

(Tipikusan amik interruptban történnek, azok a HAL-ban vannak, tehát interruptot sem kell szimulálni, viszont cserébe többszálúságra szükség lehet.)

De ha azt akarnám szimulálni, ahogy mennek a bitek az I2C-n, akkor ott kellene meghúzni a HAL layert.

Vagy van 4 fizikai gombom, ott az az API, hogy le tudom kérdezni az állapotukat, vagy hogy be van-e nyomva.

Ha az Arduino alatt az Arduino IDE-t értjük, akkor elég nehézkes ezt megcsinálni. Úgy lehet, hogy ezeket az API-kat library-kben valósítod meg, a főprogramot is library-ban valósítod meg, és az INO-ban csak annyi van kb, hogy setupprogram(); loopprogram();

(Mert INO-t nem tudsz gcc-vel fordítani, a libeket viszont rendes C-ben kell megírni. Persze az Arduino preprocesszort is használhatnánk, de én nem úgy csináltam meg.)

És ha van egy rakás forrásfájlod, akkor úgy szervezed a kódot, hogy külön fájlban legyen, ami HAL, és külön ami platformfüggetlen. És ha ez megvan, akkor a HAL-t megírod szimulálva is, és ahhoz is írsz buildet. Tehát a forrásaid nagyrésze ugyanaz a két rendszerben, és ami ugyanaz azt tudod próbálgatni, vagy rendesen tesztelni PC-n. Ezzel csomó időt spórolsz, mert mire a mikrovezérlőre égeted a kódod, addigra már alapfunkciókat nem kell validálnod, hogy működik-e egyáltalán, meg nem kell "business logic"-ot debuggolnod.

Lehet tehát sokmindent kifordítva Arduino IDE alatt is csinálni ilyet, vagy talán egyszerűbb is kézzel írt makefile-okkal megírni mindent, amit Arduino alatt csinálnál. Az Arduino libraryt használhatod Arduino-n kívülről is sima Makefile projektekben is. Én mindkét megközelítést kipróbáltam 1-1 projektben és még mindig nem vagyok biztos benne, hogy melyik a nagyobb szívás :-).

A források nagyrésze tehát teljesen ugyanaz PC-n és mikrovezérlőn. Hasonló a BSP Board Support Package megközelítéshez, amit itt ismerhetsz meg: http://www.state-machine.com/quickstart/ a Lesson 22-től kezdve van szó RTOS-okról, amikbe belecsempészi a BSP fogalmát is, ami lényegében egy HAL. Érdemes megnézni, amit láttam ebből a sorozatból, az zseniális.

Én tovább bonyolítom azzal, hogy a HAL-t JNI-vel Java alá teszem, de ez már csak a saját dilim: Java-ban írom meg a GUI-t és onnan futtatom a teszteket is. De ezt már tényleg nem kellene terjesztenem, mert kicsit perverz :-)