Och för att klargöra lite till
så funkar det på följande sätt med trådar:
När roboten är inaktiv så är
endast följande trådar igång: ”huvudtråden” i init.c som sköter uppstart och
nerstänging av andra trådar, en signalhanterignstråd i init.c som hanterar
siganler så som SIGINT och SIGUSR1 samt buttons_loop i dio.c som ser till att
roboten regarerar och t.ex. kan bli aktiv vid knapptryckning.
Medans roboten sedan är inaktiv
ligger huvudtråden och blockerar i väntan på att den ska få ett event att
roboten bytt till att vara aktiv. Om så sker så tar den drar igång alla
nödvändiga trådar och tar sedan och lägger sig och blockerar igen i väntan på
att roboten ska byta till att vara inaktiv igen och när den får signal om det
tar den och väntar på att trådar som självstänger stängs ner samt tar död på
ett par trådar som i nuläget annars kan ligga i blockerande systemanrop och därmed
inte kommer komma ut och dö av sig själva.
Därefter börjar allt om med att
den återigen inväntar nytt byte till aktiv.
//Joakim Tosteberg
From:
kmm09-3-bounces@lists.lysator.liu.se
[mailto:kmm09-3-bounces@lists.lysator.liu.se] On Behalf Of Joakim
Tosteberg
Sent: den 15 november 2009 18:32
To: 'KMM projekt'
Subject: [Kmm09-3] VIKTIGT: Trådar och start av robot
Hej
Noterade precis de commits som precis gjorts mot framförallt
laser.c och dio.c och en del av de ändringarna kommer att göra att saker går
sönder med avseende på hur trådar startas/stoppas.
Först och främst en liten sak bara så att ingen är förvirrad
över det, roboten startar numera i ett inaktivt state och för att starta den
måste man sedan trycka på start/stopp knappen (eller skicka SIGUSR1 signalen
till programmet).
För att sedan stoppa (d.v.s. stoppa som i att roboten ska
stanna, stänger ner en del av trådarna och tar och väntar på ny knap/signal)
den så gör man samma sak igen.
Till problemen då.
Det är ändrat så att got_shot_loop kommer att fortsätta att
köras även efter stop. Men vid stop så väntar roboten på att denna tråd stänger
av sig och vid start så startar den upp en ny sådan tråd. Så med ändringen som
det ser ut nu kommer roboten att när den stoppas hänga och vänta på den tråden
i all evighet och aldrig komma ur stop fasen utan att man manuellt dödar och
startar programmet igen.
Sedan funderar jag också över motveringen till ändringarna i
laser_start, här kommer saker iaf inte att gå sönder eftersom tråden explicit
dödas med pthread_cancel för tillfället (eftersom tråden med största
sannolikhet kommer att ligga och blockera på shoot_mutex när roboten stoppas).
Och ingen av ändringarna kommer troligen att göra något
”säkrare” på något sätt vad jag kan se i vilket fall som helst.
Och nu ser jag att ännu fler trådar håller på att bli av med
sina stopvillkor så nu skickar jag iväg mailet innan mer saker blir trasiga…
Noterade en bugg i hjulstyr_disable nu också, felet är _INTE_
att SPEED_ZERO var fel, denna ska vara 0. Felet var att det i
hjulstyr_disable borde stått SPEED_ZERO + SPEED_OFFSET.
//Joakim Tosteberg