LED индикатор уровня

Тема в разделе "Глядите, что я сделал", создана пользователем nepekyp, 21 фев 2012.

  1. Unixon

    Unixon Оракул Модератор

    Т.е. вы хотите сказать, что avrgcc слишком хреново разбирается где ему переменную разместить - в регистре, на стеке или в каком-то другом месте SRAM, и его обязательно нужно носом тыкать?
     
  2. Корней

    Корней Гик

    Судя по ассемблерным файлам на выходе компилятора и рекомендациям по кодированию на C для AVR от разработчиков МК и avrgcc не удивлюсь ничему. Один совет вычитать переменную цикла, а не увеличивать, уже должен восприниматься как призыв обратить внимание на то, что для "мелких" МК программирование на С/C++ это скорее программирование на макрорасширении ассемблера, чем программирование на машинно-независимом языке.
    Но даже если avrgcc будет "семи пядей во лбу" он в любом случае:
    Не прочтет ваши мысли и не поймет целей, которые вы пытаетесь достигнуть тем или иным кодом- вам придется расставлять приоритеты, например, используя модификаторы;
    Когда у него кончатся регистры, а это произойдет быстро - не поймет, например, что вот эту переменную нужно сохранить как регистровую, а вот эту таки можно адресовать через индексный регистр.
    Отвечая непосредственно на вопрос: если вас интересует максимальное использование ресурсов AVR, то avrgcc нужно тыкать носом.
     
  3. nailxx

    nailxx Официальный Нерд Администратор

    Premature optimization is the root of all evil.
     
  4. Корней

    Корней Гик

    Computer programming is an art, because it applies accumulated knowledge to the world, because it requires skill and ingenuity, and especially because it produces objects of beauty. A programmer who subconsciously views himself as an artist will enjoy what he does and will do it better.
     
  5. nailxx

    nailxx Официальный Нерд Администратор

    Что на это скажет Корней?!

    Popcorn_Cat.gif
     
  6. Unixon

    Unixon Оракул Модератор

    (1) инициализация внутри for
    Код (Text):

    00000be2 <loop>:
     
    void loop()
    {
         be2:   af 92         push  r10
         be4:   bf 92         push  r11
         be6:   cf 92         push  r12
         be8:   df 92         push  r13
         bea:   ef 92         push  r14
         bec:   ff 92         push  r15
         bee:   0f 93         push  r16
         bf0:   1f 93         push  r17
         bf2:   df 93         push  r29
         bf4:   cf 93         push  r28
         bf6:   cd b7         in    r28, 0x3d   ; 61
         bf8:   de b7         in    r29, 0x3e   ; 62
         bfa:   28 97         sbiw  r28, 0x08   ; 8
         bfc:   0f b6         in    r0, 0x3f    ; 63
         bfe:   f8 94         cli
         c00:   de bf         out   0x3e, r29   ; 62
         c02:   0f be         out   0x3f, r0    ; 63
         c04:   cd bf         out   0x3d, r28   ; 61
        int val = analogRead(potPin);
         c06:   80 91 4b 01  lds    r24, 0x014B
         c0a:   90 91 4c 01  lds    r25, 0x014C
         c0e:   0e 94 5d 02  call   0x4ba   ; 0x4ba <analogRead>
         c12:   9e 83         std   Y+6, r25    ; 0x06
         c14:   8d 83         std   Y+5, r24    ; 0x05
        int count = map(val, 0, 1023, 0, 12);
         c16:   8d 81         ldd   r24, Y+5    ; 0x05
         c18:   9e 81         ldd   r25, Y+6    ; 0x06
         c1a:   9c 01         movw  r18, r24
         c1c:   44 27         eor   r20, r20
         c1e:   37 fd         sbrc  r19, 7
         c20:   40 95         com   r20
         c22:   54 2f         mov   r21, r20
         c24:   00 d0         rcall .+0       ; 0xc26 <loop+0x44>
         c26:   00 d0         rcall .+0       ; 0xc28 <loop+0x46>
         c28:   ed b7         in    r30, 0x3d   ; 61
         c2a:   fe b7         in    r31, 0x3e   ; 62
         c2c:   31 96         adiw  r30, 0x01   ; 1
         c2e:   8c e0         ldi   r24, 0x0C   ; 12
         c30:   90 e0         ldi   r25, 0x00   ; 0
         c32:   a0 e0         ldi   r26, 0x00   ; 0
         c34:   b0 e0         ldi   r27, 0x00   ; 0
         c36:   80 83         st    Z, r24
         c38:   91 83         std   Z+1, r25    ; 0x01
         c3a:   a2 83         std   Z+2, r26    ; 0x02
         c3c:   b3 83         std   Z+3, r27    ; 0x03
         c3e:   ca 01         movw  r24, r20
         c40:   b9 01         movw  r22, r18
         c42:   20 e0         ldi   r18, 0x00   ; 0
         c44:   30 e0         ldi   r19, 0x00   ; 0
         c46:   40 e0         ldi   r20, 0x00   ; 0
         c48:   50 e0         ldi   r21, 0x00   ; 0
         c4a:   0f 2e         mov   r0, r31
         c4c:   ff ef         ldi   r31, 0xFF   ; 255
         c4e:   ef 2e         mov   r14, r31
         c50:   f3 e0         ldi   r31, 0x03   ; 3
         c52:   ff 2e         mov   r15, r31
         c54:   f0 e0         ldi   r31, 0x00   ; 0
         c56:   0f 2f         mov   r16, r31
         c58:   f0 e0         ldi   r31, 0x00   ; 0
         c5a:   1f 2f         mov   r17, r31
         c5c:   f0 2d         mov   r31, r0
         c5e:   aa 24         eor   r10, r10
         c60:   bb 24         eor   r11, r11
         c62:   65 01         movw  r12, r10
         c64:   0e 94 5f 05  call   0xabe   ; 0xabe <map>
         c68:   0f 90         pop   r0
         c6a:   0f 90         pop   r0
         c6c:   0f 90         pop   r0
         c6e:   0f 90         pop   r0
         c70:   dc 01         movw  r26, r24
         c72:   cb 01         movw  r24, r22
         c74:   9c 83         std   Y+4, r25    ; 0x04
         c76:   8b 83         std   Y+3, r24    ; 0x03
        //int i = 0;
        for (int i = 1; i<=12; i++)
         c78:   81 e0         ldi   r24, 0x01   ; 1
         c7a:   90 e0         ldi   r25, 0x00   ; 0
         c7c:   9a 83         std   Y+2, r25    ; 0x02
         c7e:   89 83         std   Y+1, r24    ; 0x01
         c80:   15 c0         rjmp  .+42         ; 0xcac <loop+0xca>
            digitalWrite(i, i <= count);
         c82:   89 81         ldd   r24, Y+1    ; 0x01
         c84:   88 87         std   Y+8, r24    ; 0x08
         c86:   1f 82         std   Y+7, r1 ; 0x07
         c88:   29 81         ldd   r18, Y+1    ; 0x01
         c8a:   3a 81         ldd   r19, Y+2    ; 0x02
         c8c:   8b 81         ldd   r24, Y+3    ; 0x03
         c8e:   9c 81         ldd   r25, Y+4    ; 0x04
         c90:   82 17         cp    r24, r18
         c92:   93 07         cpc   r25, r19
         c94:   14 f0         brlt  .+4       ; 0xc9a <loop+0xb8>
         c96:   81 e0         ldi   r24, 0x01   ; 1
         c98:   8f 83         std   Y+7, r24    ; 0x07
         c9a:   88 85         ldd   r24, Y+8    ; 0x08
         c9c:   6f 81         ldd   r22, Y+7    ; 0x07
         c9e:   0e 94 7a 04  call   0x8f4   ; 0x8f4 <digitalWrite>
    void loop()
    {
        int val = analogRead(potPin);
        int count = map(val, 0, 1023, 0, 12);
        //int i = 0;
        for (int i = 1; i<=12; i++)
         ca2:   89 81         ldd   r24, Y+1    ; 0x01
         ca4:   9a 81         ldd   r25, Y+2    ; 0x02
         ca6:   01 96         adiw  r24, 0x01   ; 1
         ca8:   9a 83         std   Y+2, r25    ; 0x02
         caa:   89 83         std   Y+1, r24    ; 0x01
         cac:   89 81         ldd   r24, Y+1    ; 0x01
         cae:   9a 81         ldd   r25, Y+2    ; 0x02
         cb0:   8d 30         cpi   r24, 0x0D   ; 13
         cb2:   91 05         cpc   r25, r1
         cb4:   34 f3         brlt  .-52         ; 0xc82 <loop+0xa0>
            digitalWrite(i, i <= count);
    }
         cb6:   28 96         adiw  r28, 0x08   ; 8
         cb8:   0f b6         in    r0, 0x3f    ; 63
         cba:   f8 94         cli
         cbc:   de bf         out   0x3e, r29   ; 62
         cbe:   0f be         out   0x3f, r0    ; 63
         cc0:   cd bf         out   0x3d, r28   ; 61
         cc2:   cf 91         pop   r28
         cc4:   df 91         pop   r29
         cc6:   1f 91         pop   r17
         cc8:   0f 91         pop   r16
         cca:   ff 90         pop   r15
         ccc:   ef 90         pop   r14
         cce:   df 90         pop   r13
         cd0:   cf 90         pop   r12
         cd2:   bf 90         pop   r11
         cd4:   af 90         pop   r10
         cd6:   08 95         ret
     
     
  7. Unixon

    Unixon Оракул Модератор

    (2) локальная переменная перед for
    Код (Text):
    00000be2 <loop>:
     
    void loop()
    {
        be2:    af 92         push  r10
        be4:    bf 92         push  r11
        be6:    cf 92         push  r12
        be8:    df 92         push  r13
        bea:    ef 92         push  r14
        bec:    ff 92         push  r15
        bee:    0f 93         push  r16
        bf0:    1f 93         push  r17
        bf2:    df 93         push  r29
        bf4:    cf 93         push  r28
        bf6:    cd b7         in    r28, 0x3d   ; 61
        bf8:    de b7         in    r29, 0x3e   ; 62
        bfa:    28 97         sbiw  r28, 0x08   ; 8
        bfc:    0f b6         in    r0, 0x3f    ; 63
        bfe:    f8 94         cli
        c00:    de bf         out   0x3e, r29   ; 62
        c02:    0f be         out   0x3f, r0    ; 63
        c04:    cd bf         out   0x3d, r28   ; 61
        int val = analogRead(potPin);
        c06:    80 91 4b 01 lds r24, 0x014B
        c0a:    90 91 4c 01 lds r25, 0x014C
        c0e:    0e 94 5d 02 call    0x4ba   ; 0x4ba <analogRead>
        c12:    9e 83         std   Y+6, r25    ; 0x06
        c14:    8d 83         std   Y+5, r24    ; 0x05
        int count = map(val, 0, 1023, 0, 12);
        c16:    8d 81         ldd   r24, Y+5    ; 0x05
        c18:    9e 81         ldd   r25, Y+6    ; 0x06
        c1a:    9c 01         movw  r18, r24
        c1c:    44 27         eor   r20, r20
        c1e:    37 fd         sbrc  r19, 7
        c20:    40 95         com   r20
        c22:    54 2f         mov   r21, r20
        c24:    00 d0         rcall .+0       ; 0xc26 <loop+0x44>
        c26:    00 d0         rcall .+0       ; 0xc28 <loop+0x46>
        c28:    ed b7         in    r30, 0x3d   ; 61
        c2a:    fe b7         in    r31, 0x3e   ; 62
        c2c:    31 96         adiw  r30, 0x01   ; 1
        c2e:    8c e0         ldi   r24, 0x0C   ; 12
        c30:    90 e0         ldi   r25, 0x00   ; 0
        c32:    a0 e0         ldi   r26, 0x00   ; 0
        c34:    b0 e0         ldi   r27, 0x00   ; 0
        c36:    80 83         st    Z, r24
        c38:    91 83         std   Z+1, r25    ; 0x01
        c3a:    a2 83         std   Z+2, r26    ; 0x02
        c3c:    b3 83         std   Z+3, r27    ; 0x03
        c3e:    ca 01         movw  r24, r20
        c40:    b9 01         movw  r22, r18
        c42:    20 e0         ldi   r18, 0x00   ; 0
        c44:    30 e0         ldi   r19, 0x00   ; 0
        c46:    40 e0         ldi   r20, 0x00   ; 0
        c48:    50 e0         ldi   r21, 0x00   ; 0
        c4a:    0f 2e         mov   r0, r31
        c4c:    ff ef         ldi   r31, 0xFF   ; 255
        c4e:    ef 2e         mov   r14, r31
        c50:    f3 e0         ldi   r31, 0x03   ; 3
        c52:    ff 2e         mov   r15, r31
        c54:    f0 e0         ldi   r31, 0x00   ; 0
        c56:    0f 2f         mov   r16, r31
        c58:    f0 e0         ldi   r31, 0x00   ; 0
        c5a:    1f 2f         mov   r17, r31
        c5c:    f0 2d         mov   r31, r0
        c5e:    aa 24         eor   r10, r10
        c60:    bb 24         eor   r11, r11
        c62:    65 01         movw  r12, r10
        c64:    0e 94 5f 05 call    0xabe   ; 0xabe <map>
        c68:    0f 90         pop   r0
        c6a:    0f 90         pop   r0
        c6c:    0f 90         pop   r0
        c6e:    0f 90         pop   r0
        c70:    dc 01         movw  r26, r24
        c72:    cb 01         movw  r24, r22
        c74:    9c 83         std   Y+4, r25    ; 0x04
        c76:    8b 83         std   Y+3, r24    ; 0x03
        int i = 0;
        c78:    1a 82         std   Y+2, r1 ; 0x02
        c7a:    19 82         std   Y+1, r1 ; 0x01
        for (i = 1; i<=12; i++)
        c7c:    81 e0         ldi   r24, 0x01   ; 1
        c7e:    90 e0         ldi   r25, 0x00   ; 0
        c80:    9a 83         std   Y+2, r25    ; 0x02
        c82:    89 83         std   Y+1, r24    ; 0x01
        c84:    15 c0         rjmp  .+42        ; 0xcb0 <loop+0xce>
            digitalWrite(i, i <= count);
        c86:    89 81         ldd   r24, Y+1    ; 0x01
        c88:    88 87         std   Y+8, r24    ; 0x08
        c8a:    1f 82         std   Y+7, r1 ; 0x07
        c8c:    29 81         ldd   r18, Y+1    ; 0x01
        c8e:    3a 81         ldd   r19, Y+2    ; 0x02
        c90:    8b 81         ldd   r24, Y+3    ; 0x03
        c92:    9c 81         ldd   r25, Y+4    ; 0x04
        c94:    82 17         cp    r24, r18
        c96:    93 07         cpc   r25, r19
        c98:    14 f0         brlt  .+4       ; 0xc9e <loop+0xbc>
        c9a:    81 e0         ldi   r24, 0x01   ; 1
        c9c:    8f 83         std   Y+7, r24    ; 0x07
        c9e:    88 85         ldd   r24, Y+8    ; 0x08
        ca0:    6f 81         ldd   r22, Y+7    ; 0x07
        ca2:    0e 94 7a 04 call    0x8f4   ; 0x8f4 <digitalWrite>
    void loop()
    {
        int val = analogRead(potPin);
        int count = map(val, 0, 1023, 0, 12);
        int i = 0;
        for (i = 1; i<=12; i++)
        ca6:    89 81         ldd   r24, Y+1    ; 0x01
        ca8:    9a 81         ldd   r25, Y+2    ; 0x02
        caa:    01 96         adiw  r24, 0x01   ; 1
        cac:    9a 83         std   Y+2, r25    ; 0x02
        cae:    89 83         std   Y+1, r24    ; 0x01
        cb0:    89 81         ldd   r24, Y+1    ; 0x01
        cb2:    9a 81         ldd   r25, Y+2    ; 0x02
        cb4:    8d 30         cpi   r24, 0x0D   ; 13
        cb6:    91 05         cpc   r25, r1
        cb8:    34 f3         brlt  .-52        ; 0xc86 <loop+0xa4>
            digitalWrite(i, i <= count);
    }
        cba:    28 96         adiw  r28, 0x08   ; 8
        cbc:    0f b6         in    r0, 0x3f    ; 63
        cbe:    f8 94         cli
        cc0:    de bf         out   0x3e, r29   ; 62
        cc2:    0f be         out   0x3f, r0    ; 63
        cc4:    cd bf         out   0x3d, r28   ; 61
        cc6:    cf 91         pop   r28
        cc8:    df 91         pop   r29
        cca:    1f 91         pop   r17
        ccc:    0f 91         pop   r16
        cce:    ff 90         pop   r15
        cd0:    ef 90         pop   r14
        cd2:    df 90         pop   r13
        cd4:    cf 90         pop   r12
        cd6:    bf 90         pop   r11
        cd8:    af 90         pop   r10
        cda:    08 95         ret
     
  8. Unixon

    Unixon Оракул Модератор

    (3) глобальная переменная
    Код (Text):
    00000be2 <loop>:
     
    void loop()
    {
        be2:    af 92         push  r10
        be4:    bf 92         push  r11
        be6:    cf 92         push  r12
        be8:    df 92         push  r13
        bea:    ef 92         push  r14
        bec:    ff 92         push  r15
        bee:    0f 93         push  r16
        bf0:    1f 93         push  r17
        bf2:    df 93         push  r29
        bf4:    cf 93         push  r28
        bf6:    00 d0         rcall .+0       ; 0xbf8 <loop+0x16>
        bf8:    00 d0         rcall .+0       ; 0xbfa <loop+0x18>
        bfa:    00 d0         rcall .+0       ; 0xbfc <loop+0x1a>
        bfc:    cd b7         in    r28, 0x3d   ; 61
        bfe:    de b7         in    r29, 0x3e   ; 62
        int val = analogRead(potPin);
        c00:    80 91 4b 01 lds r24, 0x014B
        c04:    90 91 4c 01 lds r25, 0x014C
        c08:    0e 94 5d 02 call    0x4ba   ; 0x4ba <analogRead>
        c0c:    9c 83         std   Y+4, r25    ; 0x04
        c0e:    8b 83         std   Y+3, r24    ; 0x03
        int count = map(val, 0, 1023, 0, 12);
        c10:    8b 81         ldd   r24, Y+3    ; 0x03
        c12:    9c 81         ldd   r25, Y+4    ; 0x04
        c14:    9c 01         movw  r18, r24
        c16:    44 27         eor   r20, r20
        c18:    37 fd         sbrc  r19, 7
        c1a:    40 95         com   r20
        c1c:    54 2f         mov   r21, r20
        c1e:    00 d0         rcall .+0       ; 0xc20 <loop+0x3e>
        c20:    00 d0         rcall .+0       ; 0xc22 <loop+0x40>
        c22:    ed b7         in    r30, 0x3d   ; 61
        c24:    fe b7         in    r31, 0x3e   ; 62
        c26:    31 96         adiw  r30, 0x01   ; 1
        c28:    8c e0         ldi   r24, 0x0C   ; 12
        c2a:    90 e0         ldi   r25, 0x00   ; 0
        c2c:    a0 e0         ldi   r26, 0x00   ; 0
        c2e:    b0 e0         ldi   r27, 0x00   ; 0
        c30:    80 83         st    Z, r24
        c32:    91 83         std   Z+1, r25    ; 0x01
        c34:    a2 83         std   Z+2, r26    ; 0x02
        c36:    b3 83         std   Z+3, r27    ; 0x03
        c38:    ca 01         movw  r24, r20
        c3a:    b9 01         movw  r22, r18
        c3c:    20 e0         ldi   r18, 0x00   ; 0
        c3e:    30 e0         ldi   r19, 0x00   ; 0
        c40:    40 e0         ldi   r20, 0x00   ; 0
        c42:    50 e0         ldi   r21, 0x00   ; 0
        c44:    0f 2e         mov   r0, r31
        c46:    ff ef         ldi   r31, 0xFF   ; 255
        c48:    ef 2e         mov   r14, r31
        c4a:    f3 e0         ldi   r31, 0x03   ; 3
        c4c:    ff 2e         mov   r15, r31
        c4e:    f0 e0         ldi   r31, 0x00   ; 0
        c50:    0f 2f         mov   r16, r31
        c52:    f0 e0         ldi   r31, 0x00   ; 0
        c54:    1f 2f         mov   r17, r31
        c56:    f0 2d         mov   r31, r0
        c58:    aa 24         eor   r10, r10
        c5a:    bb 24         eor   r11, r11
        c5c:    65 01         movw  r12, r10
        c5e:    0e 94 5f 05 call    0xabe   ; 0xabe <map>
        c62:    0f 90         pop   r0
        c64:    0f 90         pop   r0
        c66:    0f 90         pop   r0
        c68:    0f 90         pop   r0
        c6a:    dc 01         movw  r26, r24
        c6c:    cb 01         movw  r24, r22
        c6e:    9a 83         std   Y+2, r25    ; 0x02
        c70:    89 83         std   Y+1, r24    ; 0x01
        //int i = 0;
        for (i = 1; i<=12; i++)
        c72:    81 e0         ldi   r24, 0x01   ; 1
        c74:    90 e0         ldi   r25, 0x00   ; 0
        c76:    90 93 4e 01 sts 0x014E, r25
        c7a:    80 93 4d 01 sts 0x014D, r24
        c7e:    1e c0         rjmp  .+60        ; 0xcbc <loop+0xda>
            digitalWrite(i, i <= count);
        c80:    80 91 4d 01 lds r24, 0x014D
        c84:    90 91 4e 01 lds r25, 0x014E
        c88:    8e 83         std   Y+6, r24    ; 0x06
        c8a:    20 91 4d 01 lds r18, 0x014D
        c8e:    30 91 4e 01 lds r19, 0x014E
        c92:    1d 82         std   Y+5, r1 ; 0x05
        c94:    89 81         ldd   r24, Y+1    ; 0x01
        c96:    9a 81         ldd   r25, Y+2    ; 0x02
        c98:    82 17         cp    r24, r18
        c9a:    93 07         cpc   r25, r19
        c9c:    14 f0         brlt  .+4       ; 0xca2 <loop+0xc0>
        c9e:    81 e0         ldi   r24, 0x01   ; 1
        ca0:    8d 83         std   Y+5, r24    ; 0x05
        ca2:    8e 81         ldd   r24, Y+6    ; 0x06
        ca4:    6d 81         ldd   r22, Y+5    ; 0x05
        ca6:    0e 94 7a 04 call    0x8f4   ; 0x8f4 <digitalWrite>
    void loop()
    {
        int val = analogRead(potPin);
        int count = map(val, 0, 1023, 0, 12);
        //int i = 0;
        for (i = 1; i<=12; i++)
        caa:    80 91 4d 01 lds r24, 0x014D
        cae:    90 91 4e 01 lds r25, 0x014E
        cb2:    01 96         adiw  r24, 0x01   ; 1
        cb4:    90 93 4e 01 sts 0x014E, r25
        cb8:    80 93 4d 01 sts 0x014D, r24
        cbc:    80 91 4d 01 lds r24, 0x014D
        cc0:    90 91 4e 01 lds r25, 0x014E
        cc4:    8d 30         cpi   r24, 0x0D   ; 13
        cc6:    91 05         cpc   r25, r1
        cc8:    dc f2         brlt  .-74        ; 0xc80 <loop+0x9e>
            digitalWrite(i, i <= count);
    }
        cca:    26 96         adiw  r28, 0x06   ; 6
        ccc:    0f b6         in    r0, 0x3f    ; 63
        cce:    f8 94         cli
        cd0:    de bf         out   0x3e, r29   ; 62
        cd2:    0f be         out   0x3f, r0    ; 63
        cd4:    cd bf         out   0x3d, r28   ; 61
        cd6:    cf 91         pop   r28
        cd8:    df 91         pop   r29
        cda:    1f 91         pop   r17
        cdc:    0f 91         pop   r16
        cde:    ff 90         pop   r15
        ce0:    ef 90         pop   r14
        ce2:    df 90         pop   r13
        ce4:    cf 90         pop   r12
        ce6:    bf 90         pop   r11
        ce8:    af 90         pop   r10
        cea:    08 95         ret
     
  9. Корней

    Корней Гик

    На что именно?
    Что avgcc генерит отвратительный код?
    Или мне ставится в вину утверждение что код с глобальной переменной лучше, чем с локальной?
     
  10. Unixon

    Unixon Оракул Модератор

    Код примерно одинаковый, а ошибок в большой программе наделать легче с глобальными итераторами.
     
  11. Корней

    Корней Гик

    Кто-то доказывал обратное?

    PS. Раз уж взялись - сравните код если i регистровая.