Forum: Mikrocontroller und Digitale Elektronik funktion in C überwachen/beenden


von Unbekannt (Gast)


Lesenswert?

hallo!

Angenommen, ich habe eine Funktion, die sich öfter "aufhängt" Wo sie 
sich aufhängt, weiß ich nicht genau. diese Funktion ruft nämlich einige 
andere Funktionen auf. Alle haben auch schleifen. Es gibt so viele 
Abzweige, dass ich nicht jede Codezeile einzeln debuggen kann.(ginge bei 
mir nur per Uart)


Ein Timerinterrupt kommt regelmäßig wie erwünscht. Ich habe mir gedacht, 
dass ich die Zeit überwache, die der Controller außerhalb der main-Loop 
verbringt.

Gibt es eine möglichkeit, die Funktion aus einer anderen heraus zu 
beenden?


AVRGCC Atmega 32

ps: es geht um die RX funktion der "bidirektionalen Funkbrücke RFM12"

von Alex W. (a20q90)


Lesenswert?

Ich würde in warscheinlichen Bereichen einfach einen String per UART 
senden. Z.B. wenn Du in der Main eine Sub aufrufst, setzt Du vor der Sub 
einen Sendecode hin, welcher Dir anzeigt das die Sub gestartet wurde, 
und am Ende das diese wieder verlassen wurde.

von Unbekannt (Gast)


Lesenswert?

Hier die aufger. Funktion:

1
unsigned char rf12_rxdata(unsigned char *data, unsigned char *status, unsigned char *id)
2
{  unsigned char i, number;
3
  unsigned short crc, crcref;
4
  LED_RX=1;
5
  *status=rf12_rxbyte();        // Status
6
  crc=_crc_ccitt_update (0, *status);
7
  number=rf12_rxbyte();        // Anzahl der zu empfangenden Bytes
8
  crc=_crc_ccitt_update (crc, number);
9
  if (number>MAX_BUF)
10
    number=MAX_BUF;
11
  if (number)
12
  {  
13
    uart_puts(s);
14
    *id=rf12_rxbyte();        // Paketnummer
15
    crc=_crc_ccitt_update (crc, *id);
16
    for (i=0; i<number; i++)
17
    {  *data=rf12_rxbyte();
18
      crc=_crc_ccitt_update (crc, *data);
19
      data++;
20
    }
21
  }
22
  crcref=rf12_rxbyte();        // CRC empfangen
23
  uart_puts("crc emp\r\n");
24
  crcref|=rf12_rxbyte()*256;      // CRC empfangen
25
  uart_puts("crc emp_2\r\n");
26
  rf12_trans(0xCA81);          // restart syncword detection:
27
  rf12_trans(0xCA83);          // enable FIFO
28
  LED_RX=0;
29
  if (crcref!=crc)
30
    return 255;            // checksum error
31
  else
32
    return number;          // data ok
33
}

von muh (Gast)


Lesenswert?

Unbekannt schrieb:
> if (number)
>   {
>     uart_puts(s);
>     *id=rf12_rxbyte();        // Paketnummer
>     crc=_crc_ccitt_update (crc, *id);
>     for (i=0; i<number; i++)
>     {  *data=rf12_rxbyte();
>       crc=_crc_ccitt_update (crc, *data);
>       data++;
>     }
>   }

endlosschleife in  uart_puts() ?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.