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

Gast #5140028
Lesenswert?

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 #5140048
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren