C++ export proměné skrze hlavičkový soubor

Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

16. 1. 2024, 7:32

Ahojte,

snažím se udělat patch na jeden bug v halui MDI commands, který se za specifických situací náhodně objevuje. Zdrojáky ohledně této problematiky mám nastudované a vím co chci zkusit.

Pokládal jsem tento dotazi na EN fóru, ale zatím nikdo nereagoval.
https://forum.linuxcnc.org/38-general-l ... =20#290799

Kdyby byl hypoteticky celý LCNC v jednom souboru, tak by nebyl problém vyzkoušet to co potřebuji. Ovšem žijeme v reálném světě.

Potřebuji eportovat proměnou "int halui_sent_mdi" z halui.cc do emctaskmain.cc.

Udělal jsem hlavičkový soubor halui.hh:

Kód: Vybrat vše

#ifndef HALUI_HH
#define HALUI_HH

extern int halui_sent_mdi;

#endif                /* ifndef HALUI_HH */
V halui.cc:

Kód: Vybrat vše

#include "halui.hh"
...
int halui_sent_mdi = 0;
...
V emctaskmain.cc:

Kód: Vybrat vše

#include "../../halui.hh"
...
        printf("emc task: halui_sent_mdi = %i zz912\n", halui_sent_mdi);
...
Pokud deklaruji halui_sent_mdi v emctaskmain.cc mohu to zkopilovat, ale nefunguje to:

Kód: Vybrat vše

halui_sent_mdi[halui.cc] != halui_sent_mdi[emctaskmain.cc]
Pokud nedeklaruji halui_sent_mdi v emctaskmain.cc nedaří se mi to zkompilovat:

Kód: Vybrat vše

zdenek@cnc:~/linuxcnc/linuxcnc-2.9/src$ make
Reading 205/205 dependency files
Done reading dependencies
Reading 238/238 realtime dependency files
Done reading realtime dependencies
Linking milltask
c++ -std=gnu++17 -o ../bin/milltask objects/emc/motion/emcmotglb.o objects/emc/task/emctask.o objects/emc/task/emccanon.o objects/emc/task/emctaskmain.o objects/emc/motion/usrmotintf.o objects/emc/motion/emcmotutil.o objects/emc/task/taskintf.o objects/emc/motion/dbuf.o objects/emc/motion/stashf.o objects/emc/task/taskmodule.o objects/emc/task/taskclass.o objects/emc/task/backtrace.o ../lib/librs274.so.0 ../lib/liblinuxcnc.a ../lib/libnml.so.0 ../lib/liblinuxcncini.so.0 ../lib/libposemath.so.0 ../lib/liblinuxcnchal.so.0 ../lib/libpyplugin.so.0 ../lib/libtooldata.so.0 -L/home/zdenek/linuxcnc/linuxcnc-2.9/lib -Wl,-rpath,/home/zdenek/linuxcnc/linuxcnc-2.9/lib -ltirpc  -lgpiod -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions -lboost_python311 -L/usr/lib/x86_64-linux-gnu -lpython3.11 -ldl -lm
/usr/bin/ld: objects/emc/task/emctaskmain.o: warning: relocation against `halui_sent_mdi' in read-only section `.text'
/usr/bin/ld: objects/emc/task/emctaskmain.o: in function `mdi_execute_hook()':
/usr/include/x86_64-linux-gnu/bits/stdio2.h:86: undefined reference to `halui_sent_mdi'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status
make: *** [emc/task/Submakefile:39: ../bin/milltask] Chyba 1
Najde se tu nějaký C++ čkář ochotný pomoci pro lepší zítřky LCNC?

Zdeněk
LinuxCNC - MESA 7i96
zz912.webnode.cz
atlan
Příspěvky: 3346
Registrován: 7. 2. 2011, 9:12

16. 1. 2024, 8:14

Mas to nejako blbo. Extern patri k emctaskmain urcite nie k halui

Poskusaj este
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

16. 1. 2024, 8:18

atlan píše: 16. 1. 2024, 8:14 Mas to nejako blbo. Extern patri k emctaskmain urcite nie k halui

Poskusaj este
Tech variant jsem zkousel mraky a nic. Nevím ani jestli to ma fungovat takhle z principu, nebo jestli je nutne i nejak upravovat MAKEFILE.
LinuxCNC - MESA 7i96
zz912.webnode.cz
atlan
Příspěvky: 3346
Registrován: 7. 2. 2011, 9:12

16. 1. 2024, 8:52

Pokial vytvoris novy h alebo c ktory povodny make neobsahuje tak pravdepodobne ano, res mozno nie priamo make ale dalsi subor na ktory odkazuje. Skus nejake forum co je na to zamerane.
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

17. 1. 2024, 6:26

atlan píše: 16. 1. 2024, 8:52 Skus nejake forum co je na to zamerane.
Mas na mysli nejake konkretne? Mam tento dotaz na dvou forech zabyvajicim se LCNC. Tady a na EN LCNC fóru.
LinuxCNC - MESA 7i96
zz912.webnode.cz
atlan
Příspěvky: 3346
Registrován: 7. 2. 2011, 9:12

17. 1. 2024, 11:45

Hocijake kde maju rubriki c++
StoupaCZ
Příspěvky: 543
Registrován: 2. 6. 2017, 8:12

17. 1. 2024, 3:22

V tom logu linkeru není nikde ten halui, tudíž linker nemá k dispozici tu proměnnou (nikde nenajde její deklaraci), tudíž zahlásí chybu.

Problém nejspíš bude v tom, že ten halui je v jiné binárce než ten emctaskmain a tu proměnnou tudíž takto jednoduše sdílet nepůjde.
Sieg SX4, Interkrenn IKD-400, Vernier Minishape 28
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

17. 1. 2024, 6:18

StoupaCZ píše: 17. 1. 2024, 3:22 Problém nejspíš bude v tom, že ten halui je v jiné binárce než ten emctaskmain a tu proměnnou tudíž takto jednoduše sdílet nepůjde.
Mohl bych Te poprosit, jestli bys to více rozvedl, abych to pochopil i ja lajk?

Napada te jine reseni? Existuje nejaka knihovna na ukladani promenych nekde v pameti?

Jde o to, ze HAL componenta halui umí spoustet pomoci HAL pinu mdi_commands. Ovsem, aby je mohla spustit musi LCNC prepnout do rezimu MDI. Pokud je operator v MDI, zadny problem nenastane. Ovsem pokud je operator v rezimu napřiklad MANUAL, tak pred spustenim si komponenta halui zjisti ze byla v jinem rezimu nez MDI, zapamatuje si to a po vykonani sekvence mdi_command se nasledne vrati do puvodniho rezimu. To hezké chtěné a skoro v poradku.

Problem je v tom, ze kdyz behem vykonávání mdi_commands se pokusí GUI spustit také příkaz, tak aby se nevykonavali 2 mdi prikazy najednou, ceka GUI, az bude LCNC ve statusu IDLE (opak run, idle v cestine je neciny). Jakmile je LCNC v IDLE, mohou se spustit dalsí mdi_command. Vymysleny je to krásne, ale má to háček. Status IDLE se prepina po vykonani vsech mdi_commands (zjednodusene, tech podminek je tam více). Bohuzel mu tam chybí podmínka:

Kód: Vybrat vše

Můžeš být IDLE, jakmile jsou dokončeny všechny mdi_comands a zároveň, jakmile se halui vrátil do původního rezimu.
Náhodne nastává situace, ze halui dokonci commands, spusti se commands v GUI, halui prepne LCNC do rezimu MANUAL, GUI nemuze pokracovat ve vykonavani svých commands, protoze LCNC je v MANUAL a vyhodi to chybu.
Kdyz halui se stihne prepnout do MANUAL a az pote se spusti GUI commands, tak se nic nestane. GUI se prepne do MDI a vykona sve commands.

No snad to pisu pochopitelne, resim to uz rok, takze me prijde jasne.

Já umím:
V halui.cc pomoci int promene hlidat stav, kdy jsou vykonavany prikazy VCETNE prepinani rezimu.
V emctaskmain.cc umím na základe promene pozdrzet prepnuti se do IDLE.

Neumím to spojit. Myslím ze jsem kousek od cíle.
Provizorni reseni je ze mazu radky v halui, ktere prepinaji puvodni rezim. Jsem smirenym s tím, ze pokud spustim nejaky haluu mdi commands, tak vzdy skoncim v MDI. Bastl resení by bylo vyresit to pres HAL piny a pak to v HALu spojit. Myslím si ze by to fungovalo, ale Pull Request s podobným HAL bastlem uz mi zamitly. Zduvodnili to tim, ze spatne udelany HAL by nemel vyvolavat interni chybu LCNC. Mají pravdu.
LinuxCNC - MESA 7i96
zz912.webnode.cz
atlan
Příspěvky: 3346
Registrován: 7. 2. 2011, 9:12

17. 1. 2024, 7:21

StoupaCZ píše: 17. 1. 2024, 3:22 V tom logu linkeru není nikde ten halui, tudíž linker nemá k dispozici tu proměnnou (nikde nenajde její deklaraci), tudíž zahlásí chybu.

Problém nejspíš bude v tom, že ten halui je v jiné binárce než ten emctaskmain a tu proměnnou tudíž takto jednoduše sdílet nepůjde.
Po tom je tu este riesenie, upravis binarku tak aby si premenu ulozila niekde to ram pamete, nato treba priami pristup tj napr ju ulozis na adresu 0x90000, akurat musis zabezpecit aby ti ju nieco neprepisalo. Druha binarka precita adresu pamete a hotovo :D na uP to fungovat moze na linuxe neviem :D
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

17. 1. 2024, 7:29

atlan píše: 17. 1. 2024, 7:21
StoupaCZ píše: 17. 1. 2024, 3:22 V tom logu linkeru není nikde ten halui, tudíž linker nemá k dispozici tu proměnnou (nikde nenajde její deklaraci), tudíž zahlásí chybu.

Problém nejspíš bude v tom, že ten halui je v jiné binárce než ten emctaskmain a tu proměnnou tudíž takto jednoduše sdílet nepůjde.
Po tom je tu este riesenie, upravis binarku tak aby si premenu ulozila niekde to ram pamete, nato treba priami pristup tj napr ju ulozis na adresu 0x90000, akurat musis zabezpecit aby ti ju nieco neprepisalo. Druha binarka precita adresu pamete a hotovo :D na uP to fungovat moze na linuxe neviem :D
Myslim si, ze takhle natvrdo to asi nepujde. Mozna ale nejaka knihovna by umela neco takoveho obstarat a zaroven zajistit stabilitu systemu.
LinuxCNC - MESA 7i96
zz912.webnode.cz
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22399
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

17. 1. 2024, 7:59

Takhle natvrdo to urcite nepujde. Kernel to nedovoli. Programy nesmi zapisovat do cizi pameti.

To co se tu resi asi nebude mit uplne jednoduche reseni.
Jelikoz lze predpokladat prijeti dalsiho prikazu behem vykonavani predchoziho. Lze to resit dvema zpusoby.
Normalne linuxcnc kdyz v mdi vykonava treba pohyb co chvili trva tak cas ovladacich prvku zesedivi a je nedostupna. Zrejme nekdo nebyl dost dusledny a nechal neco aktivniho nebo zapomel blokovat i pro halui prikazy. Zahrnul bych to tam. Tim je kolize vyresena.

Druha moznost je dopsat frontu pro ty prikazy a vykonavat vse ve spravnem poradi. To mi prijde dost pracne.

Ale je mozne ze jsem to jen blbe pochopil.
Vsechna prava na chyby vyhrazena (E)
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

18. 1. 2024, 5:35

robokop píše: 17. 1. 2024, 7:59 Takhle natvrdo to urcite nepujde. Kernel to nedovoli. Programy nesmi zapisovat do cizi pameti.
Potřeboval bych popostrčit a vysvětlit s tím, že používáš slovo Programy (množné číslo) a StoupaCZ píše o jiné binárce. Já ale spuštím jen jeden program. Spuštím linuxcnc. Je možné se nějak podívat jestli halui.cc je v jiném podprogramu než emctaskmain.cc?
Situace je trochu jednodušší tím, že potřebuji aby halui.cc do proměné zapisovalo a emctaskmain z ní jen četlo.


robokop píše: 17. 1. 2024, 7:59 Jelikoz lze predpokladat prijeti dalsiho prikazu behem vykonavani predchoziho. Lze to resit dvema zpusoby.
Normalne linuxcnc kdyz v mdi vykonava treba pohyb co chvili trva tak cas ovladacich prvku zesedivi a je nedostupna. Zrejme nekdo nebyl dost dusledny a nechal neco aktivniho nebo zapomel blokovat i pro halui prikazy. Zahrnul bych to tam. Tim je kolize vyresena.
Ono to tak jednoduché není. Pokud v GUI v MDI přidáváš za sebou příkazy, tak tam už fronta vyřešená je a nenastávají problémy. Ovšem pokud spustíš halui mdi_command obsahující M6 ,tak Gmoocapy se snaží spustit G43, Bohužel,pokud jsi zrovna v režimu MANUAL, tak nikdo neví, že nastane proces "vracení se do MANUAL" a programátor GUI v současnosti nemá ani nástroje na to, aby počkal, než halui udělá proces "vracení se do MANUAL", takže nastatává situace,kdy halui se ve stejný okamžik snaží o proces "vracení se do MANUAL" a GUI se snaží o přepnutí se do MDI a vykonání svého commnds. Není to o nedůslednosti GUI programátora, je to hlubší.
LinuxCNC - MESA 7i96
zz912.webnode.cz
atlan
Příspěvky: 3346
Registrován: 7. 2. 2011, 9:12

18. 1. 2024, 6:11

Udělal jsem hlavičkový soubor halui.hh:

To znamena ze tam. Tie subory hh a cc stym. Nazvom neboli, preco si ich vyrabal?
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22399
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

18. 1. 2024, 7:02

Ano ty veci jsou zavedene jako samostatne moduly takze jsou to pro kernel ruzne programy
Tam se pak ty data sdili daleko sloziteji

Je zajimave ze mas s timhle problem
Ja na to nikdy nenarazil
Vsechna prava na chyby vyhrazena (E)
Uživatelský avatar
zz912
Příspěvky: 1357
Registrován: 25. 5. 2008, 7:16

18. 1. 2024, 7:04

Jinak robokop má pravdu v tom, že tenhle problém má více řešení. Každopádně buď se mi ty řešení nelíbí, nebo skončím na tom, že potřebuji přenést stav z halui.cc do jiného souboru.

atlan píše: 18. 1. 2024, 6:11 Udělal jsem hlavičkový soubor halui.hh:

To znamena ze tam. Tie subory hh a cc stym. Nazvom neboli, preco si ich vyrabal?
Soubory halui.cc a emctaskmain.cc jsou původní. Soubor halui.hh jsem vytvořil, protože je potřebuji propojit.
LinuxCNC - MESA 7i96
zz912.webnode.cz
Odpovědět

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