Psaní modulu pod RTAI

Odpovědět
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

29. 7. 2018, 7:07

Je tu prosím někdo, kdo má praktickou zkušenost s psaním kernelového modulu na Linuxu s RTAI?
Už se s tím drbu druhý den a pořád to nemůžu rozjet.

Kde je problém:
pokud v tom modulu nepoužiju žádné volání RT funkce, všechno funguje jak má. Modul se přeloží bez chyb, po natažení do paměti běží.
Pokud ale použiju nějakou RT funkci, např. zavolám rt_enable_irq (), tak překlad skončí s warningem, že tuhle funkci nezná. To by ale mělo být OK, protože je to volání systému, které by se mělo konkrétně přiřadit až při zavedení modulu.
Před zavedením svého modulu samozřejmě natáhnu modul rtai_hal.ko.

Ale když pak chci natáhnout ten svůj modul, tak to napíše, že daný symbol rt_enable_irq nezná a modul se nezavede.
Přitom při výpisu exportovaných symbolů tam ten rt_enable_irq je, poskytuje ho modul rtai_hal.ko.
Evidentně někde dělám nějakou základní chybu, proč se ten můj modul nedokáže navázat na symboly jádra.

Nemáte někdo prosím tip? Není třeba ten RTAI na LinuxCNC nějak upravený, že by se třeba moduly musely překládat nějak jinak?

Cpát ten zdroják sem zatím nebudu, pokud s tím nikdo nedělal, tak by to stejně bylo k ničemu a akorát bych to tady zasíral.
Díky.
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22387
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

29. 7. 2018, 7:16

co ten modul ma delat?

ja pouzivam toto: http://linuxcnc.org/docs/html/hal/comp.html
je to extreme jednoduche
Vsechna prava na chyby vyhrazena (E)
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

29. 7. 2018, 7:26

Zatím se snažím jen o triviální modul, v podstatě jen takové Hallo world, abych se naučil ty moduly psát.

Jak to vzniklo:
Na PC nejsou k dispozici žádné rozumné GPIO linky. Proto se používá LPT port, ale ten je připojený přes ISA subsystém, takže má své výkonové omezení.
Když jsem zkoumal datasheety k síťovým kartám (v rámci studia real-time driverů pro EtherCAT), tak jsem objevil docela zajímavou možnost jak jako GPIO využít BootRom socket na síťové kartě. Napsal jsem na to v user-space testovací program a dosáhl jsem času zápisu cca 880ns, tedy něco přes 1.1MHz. Je to sice dost, ale protože je to napojeno přímo na PCI sběrnici, tak bych skoro čekal víc.
Tak jsem to zkusil napsat jako kernelový driver, jestli nedosáhnu vyššího výkonu.
No a tady jsem narazil na problém s RT funkcemi.

Díky za odkaz na ten halcompile. Určitě to zkusím.
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22387
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

29. 7. 2018, 7:45

ten halcompile je super na psani jednoduchejch funkcnich modulu
nevim jak ten pristup k hardware ale nevidim duvod proc by to neslo
minimalne to muzes pouzit k tomu aby jsi ziskal hello world zdrojak kterej bude korektne chodit v realtime a pak uz do nej nabalil dalsi veci
Vsechna prava na chyby vyhrazena (E)
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

29. 7. 2018, 7:51

No to mě poser!

Ten halcompile umí přeložit i modul čistě v C, a to tak, že je funkční (teda minimálně se dá zavést do paměti) !
Netuším, jakým kouzlem to dokázal, ale je to tak.

Díky moc za tohle velmi praktické moudro.
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22387
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

29. 7. 2018, 8:19

muzes si vyjet meziprodukt
on si vezme jednoduchej kod v C s pouzitim HAL funkci
doplni tam includy kvuli realtime a cele to prekope
proste vyrobi korektni zdrojak v c ktery pujde zkompilovat
prelozi a soupne modul do spravneho adresare
pak uz jen pustis linuxcnc

doporucuju mrknout na ten prekopanej zdrojak
Vsechna prava na chyby vyhrazena (E)
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

29. 7. 2018, 9:07

Kdyby s tím někdo experimentoval, tak to kouzlo je skryto v nastaveních v souboru /usr/share/linuxcnc/Makefile.modinc.
Takže při překladu standardního RTAI modulu (bez nějaké závislosti na LinuxCNC a bez nutnosti použít halcompile) pak stačí, aby Makefile vypadal takhle (jen 2 řádky):

obj-m := jmeno_modulu.o
include /usr/share/linuxcnc/Makefile.modinc

Nebo se to dá udělat pomocí halcompile:
halcompile --compile jmeno_modulu.c

Což mě skoro utvrzuje v myšlence, že ten RTAI je na LinuxCNC nějaký cinknutý.
No ale takhle to funguje dobře, takže super.

Velký dík za výraznou pomoc, robokope.
:-)
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

30. 7. 2018, 8:00

Tak jsem si pohrál s tím RTAI. A jsem docela příjemně překvapený.
Linux s RTAI jádrem se opravdu dá použít jako docela dospělý Hard-Real-Time. Funguje tam plánování procesů, priority, časovače, semafory a všechno ostatní, co k RTOSu patří.
Jediná chyba je, že ten RTAI není až tak moc multiplatformní. Na PC to není problém, ale i když podporuje i nějaké ARMy, tak zrovna ty v RaspberryPi nebo OrangePi ne. Je to škoda, jinak by se takové děsně levné OrangePi dalo použít třeba jako výkonově docela nabušené PLC.
Jako základní platformu pro CNC to autoři LinuxCNC asi zvolili dobře.

Začal jsem se v tom hrabat kvůli pokusům s GPIO na PC. Takže poznatky: obsluha I/O z user-space a z kernelu se rychlostně neliší. Zdálo se mi to z user-space trochu pomalé, tak jsem si říkal, jestli to neprochází ještě přes nějaké dodatečné vrstvy. Ale zřejmě ne, z kernelového modulu to jede stejně rychle.

Naměřené výsledky:
- zápis na GPIO, tvořený síťovou kartou, je cca 850ns, tj. cca 1.2MHz
- zápis na LPT, integrovaný na desce Intel Atom, je cca 1410ns, tj. cca 0.7MHz
- zápis na LPT na PCI I/O kartě s chipem MC9865 je cca 850ns, tj. cca 1.2MHz

Takže nejpomaleji to jede přímo na mainboardu, kde to zřejmě prochází ISA subsystémem.
Je zajímavé, že obě PCI karty fungují stejně rychle. Takže by se zdálo, že to snad omezuje ta PCI sběrnice.
Ale jestli chápu správně časování PCI, tak asynchronní zápis by se měl dát stihnout za 7 taktů, takže při rychlosti sběrnice 33MHz by to mělo umět zapisovat kolem 4.7MHz, tedy skoro 4x rychleji, než mi to jede v reálu. Takže zřejmě ty karty nejedou na plnou rychlost PCI. Ale je zajímavé, že obě fungují stejně rychle.
Až bude čas, to to zkusím i na nějakém jiné základní desce.
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22387
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

30. 7. 2018, 8:27

Parada
Peone si hrajes
Dobre ti tak :D

A pak ze tu nejsou novy temata na urovni

Ja myslim ze veci kolem linuxcnc co se tu ted posledni dva roky resi jsou k...va na urovni a kdejaka renomovana firma se muze stydet.
Vsechna prava na chyby vyhrazena (E)
Odpovědět

Zpět na „LinuxCNC - drive pod nazvem EMC2“