-schumi-
26.06.2011, 23:58
Hallo zusammen,
was passiert wenn einem Attiny der Ram überläuft? Bleibt er dann stehen oder macht er undefinierte Sachen?
In meinem Fall ist das konkret so, dass ich u.a. Strings über den UART an den PC sende. Allerdings kommt am PC, wenn die Strings zu lang sind, ab einer bestimmten Stelle nur noch Müll an. Das Phänomen gibts aber erst seit dem der Code gewachsen ist.
Außerdem macht der komische Sachen, die ich so noch nicht gesehen hab, z.B.
1 ....
2 while(true_false)
3 {
4 UART_STRING("Sending: "); ### 1
5 UART_SEND(text);
6 UART_STRING(" ");
7 _delay_ms(2);
8 RF12_TXDATA(data,6);
9 if(RF12_READY_TIMEOUT_RX(300000)) ### 2
10 {
11 UART_STRING("reaction: YES "); ### 3
12 //RF12_RXDATA(cksm,6);
13 if(cksm_false_OK(cksm[1]))
14 {
15 UART_STRING("checksum: OK ");
16 true_false=0;
17 }
18 else
19 UART_STRING("cksm: FALSE\n");
20
21 }
22 else
23 UART_STRING("reaction: NO\n"); ### 4
24 }
25 ....
Wenn ich bei ###2 "if(1) " reinschreibe, dann erhalte ich am UART wie erwartet "reaction: YES " (###3)
Wenn ich bei ##2 "if(0) " reinschreibe, dann erhalte ich am UART wie erwartet "reaction: NO\n" (###4)
Wenn ich aber bei ###2 wie jetzt im Qellcode "if(RF12_READY_TIMEOUT_RX(300000))" reinschreibe, dann erhalte ich immer nur "Sending: " (###1), wobei die IF-Anweisung doch nicht einfach so übersprungen werden darf?!? (RF12_READY_TIMEOUT_RX(300000) gibt char zurück)
Ist das ein eindeutiger Hinweis dafür, dass der Arbeitsspeicher ausgeht? Währ doof :|
(Flash geht aber schön langsam auch zuneige: avrdude: 1704 bytes of flash verified und 2048 hat er soweit ich weis)
Gruß
-schumi-
was passiert wenn einem Attiny der Ram überläuft? Bleibt er dann stehen oder macht er undefinierte Sachen?
In meinem Fall ist das konkret so, dass ich u.a. Strings über den UART an den PC sende. Allerdings kommt am PC, wenn die Strings zu lang sind, ab einer bestimmten Stelle nur noch Müll an. Das Phänomen gibts aber erst seit dem der Code gewachsen ist.
Außerdem macht der komische Sachen, die ich so noch nicht gesehen hab, z.B.
1 ....
2 while(true_false)
3 {
4 UART_STRING("Sending: "); ### 1
5 UART_SEND(text);
6 UART_STRING(" ");
7 _delay_ms(2);
8 RF12_TXDATA(data,6);
9 if(RF12_READY_TIMEOUT_RX(300000)) ### 2
10 {
11 UART_STRING("reaction: YES "); ### 3
12 //RF12_RXDATA(cksm,6);
13 if(cksm_false_OK(cksm[1]))
14 {
15 UART_STRING("checksum: OK ");
16 true_false=0;
17 }
18 else
19 UART_STRING("cksm: FALSE\n");
20
21 }
22 else
23 UART_STRING("reaction: NO\n"); ### 4
24 }
25 ....
Wenn ich bei ###2 "if(1) " reinschreibe, dann erhalte ich am UART wie erwartet "reaction: YES " (###3)
Wenn ich bei ##2 "if(0) " reinschreibe, dann erhalte ich am UART wie erwartet "reaction: NO\n" (###4)
Wenn ich aber bei ###2 wie jetzt im Qellcode "if(RF12_READY_TIMEOUT_RX(300000))" reinschreibe, dann erhalte ich immer nur "Sending: " (###1), wobei die IF-Anweisung doch nicht einfach so übersprungen werden darf?!? (RF12_READY_TIMEOUT_RX(300000) gibt char zurück)
Ist das ein eindeutiger Hinweis dafür, dass der Arbeitsspeicher ausgeht? Währ doof :|
(Flash geht aber schön langsam auch zuneige: avrdude: 1704 bytes of flash verified und 2048 hat er soweit ich weis)
Gruß
-schumi-