Är while-loopar så speciallt bra egentligen

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46989
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Är while-loopar så speciallt bra egentligen

Inlägg av TomasL »

Konstig ämnesnamn, har en liten fundering och det skulle vara intressant att höra vad ni andra tycker.

EN väldigt vanlig sak är att använda en while-loop när man skall kolla en flagga för att se om en resurs är ledig.
Till exempel, om man skall skicka en byte via uarten, så är det ju inte helt ovanligt att man använder

Kod: Markera allt

while (!TRMT);
(PICs flagga för att kontroller om bufferten är tom)

Problemet som jag ser det är att om nått går snett, så kommer programmet att fastna i denna loop och inte komma ur den om inte watchdogen återstartar processorn.

Är detta sätt att skriva egentligen förenligt med god kodstandard.
Vore det inte lämpligare att expandera loopen och införliva en räknare också, så man hoppar efter en viss tid.

Vad tror ni om detta.
Gimbal
Inlägg: 8685
Blev medlem: 20 april 2005, 15:43:53

Re: Är while-loopar så speciallt bra egentligen

Inlägg av Gimbal »

"Vore det inte lämpligare att expandera loopen och införliva en räknare också, så man hoppar efter en viss tid."

Jo, om fallet är sådant att flaggan kanske inte kommer så har jag alltid någon form av timeout räknare inblandad.
(och som alla vet så ska den försiktige programmeraren alltid förvänta sig det oförväntade.)
Användarvisningsbild
jesper
Inlägg: 722
Blev medlem: 12 juni 2006, 16:04:08
Ort: Laem Mae Phim, Thailand

Re: Är while-loopar så speciallt bra egentligen

Inlägg av jesper »

Det är väl inget fel med att använda while looper som sådan. Men det kanske är fel på tänket när man gör en sån om men inte har en plan B.
Om det är ett problem att programmet hänger sig i loopen (vilket det ju oftast är), så måste man självklart ha en timeout med i loopen, t.ex:

Kod: Markera allt

uint timeout = 1000;
while (!TRMT) {
  if (timeout == 0)
    releash_hell();
  timeout--;
}
eller

Kod: Markera allt

uint timeout = 1000;
while (!TRMT) {
  if (timeout == 0)
    break;
  timeout--;
}

if (timeout)
  good();
else
 bad();

Användarvisningsbild
Icecap
Inlägg: 26652
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Är while-loopar så speciallt bra egentligen

Inlägg av Icecap »

Det beror på vad hela projektet ska göra, hur kritisk det är.

Jag använder extremt sällan detta sätt alls, helt enkelt av den anledning du anger: om det aldrig blir klart låser allt sig.

Men en motfråga:
Om man lägger till en time-out och den utlösas - vad ska då göras?

Tänk ett projekt som mäter en sak och skickar data om detta via en seriell länk, exakt som du ger som exempel. Något är fel så att serieporten inte sänder och den blir alltså aldrig klar till nästa och nästa osv. Man lägger till en time-out så man kan knäcka detta onda tillstånd - men vad ska göras då?
* Sluta sända helt? Vilken nytta har man då av enheten?
* Återstarta UART'en? Men vad om initieringen är skit och det är orsaken till att det inte vill sig?
* Har det kanske hänt en grey-out? Är detta då rätt lösning? Eller ville det vara bättre med ett grey-out skydd?

Det går såklart inte att ge ett enda generellt svar på dessa frågor, de rätta svar beror ju på det specifika projekt men det är ju säkert att man ska tänka mer på varför det (UART) plötsligt inte fungerar och vad som kan orsaka detta. I slutändan är det helt beroende på slarvig progranmmering och/eller dåligt design och det kan ingen time-out i världen lösa...
Gimbal
Inlägg: 8685
Blev medlem: 20 april 2005, 15:43:53

Re: Är while-loopar så speciallt bra egentligen

Inlägg av Gimbal »

Jag försöker oftast skriva så att programmet aldrig står och väntar på någonting, har flaggan inte kommit så går vi vidare i programmet och fixar med annat så länge. Lite av multitasking, nästan åt round robin hållet, ingen process får ensamt hänga hela programmet någon längre stund.
Jonas L
Inlägg: 432
Blev medlem: 14 juli 2009, 14:28:41
Ort: Karlshamn

Re: Är while-loopar så speciallt bra egentligen

Inlägg av Jonas L »

Det kanske är lite annat på jobbet, men om jag programmerar hemma har jag inget emot en konstruktion utan timeout. Flera anledningar:
* Man behöver lämpliga värden till alla timeouter. Att bara "sätta en sekunder" slutar alltid med att man måste förlänga ibland.
* Man måste hantera felet rätt. Jespers variant är väl den jag har använt, men då blir det oftast omstart på hela skiten för det är svårt att återvända till programflödet. Om man vågar får man väl börja använda throw().
* All felhantering gör koden komplexare och mer oöverskådlig, och ökar därmed sannolikheten för andra fel.
* Det är oftast lättare att diagnostisera grundproblemet om programmet fastnar på ett ställe som man kan hitta än att det börjar göra recovery-försök.

Sen får man ju naturligtvis sätta in såna timeouter där det visar sig behövas, men det är ju en helt annan femma.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Är while-loopar så speciallt bra egentligen

Inlägg av jesse »

Jag brukar alltid lägga till en timeout på sådana loopar, om det inte är en intern flagga som man med säkerhet vet kommer att ändras inom kort (såvida inte processorn slutar snurra).

Jag ersätter while med for(...) ... och inne i denna for-sats kollar jag flaggan och gör en break om den är satt.

Om for-loopen tar slut innan flaggan satts kommer loop-variabeln skvallra då den stannar på maxvärdet. Då returnerar jag en felkod eller sätter en felflagga.

Jag håller med om att det där att hantera fel kan bli komplext, men det minsta man kan göra är ju att göra användaren uppmärksam på att något inte står rätt till. Man måste givetvis även göra eventuella inkommande data ogiltiga om det t.ex handlar om en inläsning. Annars kan det gå riktigt fel... Hur viktigt det är att alltid få rätt data beror ju helt på vad man ska göra.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46989
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Är while-loopar så speciallt bra egentligen

Inlägg av TomasL »

En sak är ju hur man gör själv, dock har jag noterat att en hel del bibliotekskod är skriven på detta sätt, framförallt HW-bibliotek, vilket uppenbarligen kan skapa problem.
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Är while-loopar så speciallt bra egentligen

Inlägg av Pajn »

Allt beror ju på vad man ska göra.
Man får fundera på

Kod: Markera allt

Kan det ta lång tid?
    Om Ja
        Vad händer om det tar tid?
            Om det inte gör nått
                Ha det så
            Om det kan hänga hela eller en stor del av funktionen
                Gör något åt det, tex. timeout.
        Har du något annat viktigt att göra?
            Gör det medan du väntar. Kanske kan du t.o.m. använda en interrupt?
    Om Nej
        Ha det så
"lång tid" är självklart i förhållande till vad du ska göra före, efter och samtidigt.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Är while-loopar så speciallt bra egentligen

Inlägg av jesse »

Jag brukar undvika I/O-funktioner i bibliotek av delvis sådana anledningar (men mest för att de ofta är dåligt skrivna, i alla fall Atmel's) ... Däremot läser och skriver jag till interna EEPROM med bibliotekets funktioner - där finns ju en "vänta"-loop på att EEPROMet ska bli klart. Men där anser jag att man får lita på att processorn fungerar - det kommer aldrig att hända att EEPROMet aldrig blir klart.
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

Re: Är while-loopar så speciallt bra egentligen

Inlägg av labmaster »

Om applikationen är sådan att den absolut inte skall göra något annat än att vänta på att villkoret för loopen while (!TRMT) skal bli falsk så är det ok att göra denna typ av konstruktion.

Under de 30 år som jag sysslat med maskinnära programutveckling är det dock ytterst sällan jag stött på en sådan situation.
Skriv svar