Programm doppelt so groß bei uart ausgabe anderer variable, gleichen types

Gast #5140028
Hallo,
ich habe mir ein Programm geschrieben, wo ich ein paar sachen berechnen 
möchte. Die Ergebnisse möchte ich mir am anfang noch über uart ausgeben, 
um zu kontrollieren, ob es richtig ist.
1
int main(void)
2
{
3
    setup();
4
    uint8_t n = 0; /* counter for loops */
5
    uint8_t m = 0; /* counter for loops */
6
    uint8_t input[4] = {1, 0, 0, 0};
7
    uint8_t output[4] = {0, 0, 0, 0};
8
    uint16_t netHidden[4] = {0, 0, 0, 0};
9
    uint16_t outHidden[4] = {0, 0, 0, 0};
10
    uint16_t netOut[4] = {0, 0, 0, 0};
11
    uint16_t outOut[4] = {0, 0, 0, 0};   
12
    uint16_t weightInputHidden[4][4] = {{755, 314, 245, 984},
13
                                        {233, 10, 1, 347},
14
                                        {645, 346, 642, 222},
15
                                        {987, 342, 234, 356},};
16
    uint16_t weightHiddenOut[4][4] = {{435, 536, 757, 72},
17
                                      {768, 357, 13, 3},
18
                                      {981, 234, 757, 452},
19
                                      {235, 10, 241, 342},};
20
    float tempValue = 0.0;
21

22
     
23
    sei(); /* enable Interrupt */
24
    
25
    uint8_t uartOutput = 1; /* usart output */
26
    while (1) 
27
    {
28
        if(state == STATE_TRAINING){
29
            /* calculate netHidden */
30
            for(n=0; n<4; n++){
31
                for(m=0; m<4; m++){
32
                    netHidden[n] = netHidden[n] + (input[m] * weightInputHidden[n][m]);
33
                }
34
            }
35
            /* calculate outHidden */
36
            for (n = 0; n < 4; n++) {
37
                tempValue = netHidden[n] / 1000.0;
38
                tempValue = 1 / (1 + exp(tempValue * (-1)));
39
                outHidden[n] = tempValue * 1000;
40
            }
41
...
42
...
43

44
            if(uartOutput ==1)
45
            {
46
                for (unsigned int n = 0; n < 4; n++) {
47
                    usartTransmit(netHidden[n]);
48
                    usartTransmit(0x0A);
49
                }
50
                uartOutput =2;
51
                usartTransmit(0x0A);
52
            }
53
...
54
}
55

56

57

58
void usartTransmit( uint16_t value  )
59
{
60
    if(0x0A == value){
61
        while ( !( UCSRA & (1<<UDRE)) );/* Wait for empty transmit buffer */
62
        UDR = value & 0xFF; /* Put data into buffer, sends the lower 8 bite */
63
    }
64
    else{
65
        while ( !( UCSRA & (1<<UDRE)) );/* Wait for empty transmit buffer */
66
        UDR = value>>8; /* Put data into buffer, sends the upper 8 bite */
67
        while ( !( UCSRA & (1<<UDRE)) );/* Wait for empty transmit buffer */
68
        UDR = value & 0xFF; /* Put data into buffer, sends the lower 8 bite */
69
    }
70
}


Es geht insbesondere um die Zeile
usartTransmit(netHidden[n]);

Wenn ich mir die Variable netHidden ausgebe, ist das Programm 938 bytes 
groß. Wenn ich allerdings die Variable outHidden an der stelle ausgeben 
lasse, ist das Programm 2518 bytes groß. Wieso ist das so? Ich berechne 
ja zwischendrinn
outHidden[n] = tempValue * 1000;
wobei tempValue ein float ist. Aber bleibt outHidden nicht trotzdem ein 
uint16_t und schneidet alles andere ab?

Wenn nicht, was muss ich machen, damit es ein uint16_t bleibt?


Johannes
Gast #5140046
Johannes schrieb:
> Wenn ich allerdings die Variable outHidden an der stelle ausgeben lasse,
> ist das Programm 2518 bytes groß. Wieso ist das so?

Am besten mal den Output angucken.

Vermutlich optimiert der Compiler die Berechnungen weg, wenn die 
Ergebnisse nicht verwendet werden.
Gast #5140048
Wenn ich dich richtig verstanden habe, verwendest du in der Version, die 
ein kurzes "Programm" erzeugt, outHidden nicht. Damit können die float 
operationen weg optimiert werden, weil tempValue auch nicht verwendet 
wird. Da wird der Compiler die Float Operationen nicht einbinden, was 
sehr viel Platz einspart.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.