Forum: Mikrocontroller und Digitale Elektronik Programm doppelt so groß bei uart ausgabe anderer variable, gleichen types


von Johannes (Gast)


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

von Hmmm (Gast)


Lesenswert?

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.

von John (Gast)


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.

von Peter (Gast)


Lesenswert?

outHidden als volatile deklarieren, dann wird es nicht wegoptimiert.

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.