misyachniy (20.03.2017 16:01 - 16:26, просмотров: 2860)
Изучал как IAR оптимизирует код и нашел, что не очень хорошо. Есть два варианта присвоения одного и тогоже значения нескольким переменным
1)
PORTA_PIN1CTRL = 0x18; // KN3 PULLUP включить
PORTA_PIN2CTRL = 0x18; // KN2 PULLUP включить
PORTA_PIN3CTRL = 0x18; // KN1 PULLUP включить
PORTB_PIN0CTRL = 0x18; // KN4 PULLUP включить
PORTC_PIN2CTRL = 0x18; // Раскачка TX, PULLUP включить (PC2)
PORTC_PIN3CTRL = 0x18; // Раскачка TX, PULLUP включить (PC3)
2)
PORTA_PIN1CTRL = PORTA_PIN2CTRL = PORTA_PIN3CTRL = PORTB_PIN0CTRL = PORTC_PIN2CTRL = PORTC_PIN3CTRL = 0x18;
IAR при включенной оптимизации по скорости или объему кода компилирует первый вариант так:
109 PORTA_PIN1CTRL = 0x18; // KN3 PULLUP включить
\ 00000038 E108 LDI R16, 24
\ 0000003A 93000611 STS 1553, R16
110 PORTA_PIN2CTRL = 0x18; // KN2 PULLUP включить
\ 0000003E E108 LDI R16, 24
\ 00000040 93000612 STS 1554, R16
111 PORTA_PIN3CTRL = 0x18; // KN1 PULLUP включить
\ 00000044 E108 LDI R16, 24
\ 00000046 93000613 STS 1555, R16
112 PORTB_PIN0CTRL = 0x18; // KN4 PULLUP включить
\ 0000004A E108 LDI R16, 24
\ 0000004C 93000630 STS 1584, R16
113 PORTC_PIN2CTRL = 0x18; // Раскачка TX, PULLUP включить (PC2)
\ 00000050 E108 LDI R16, 24
\ 00000052 93000652 STS 1618, R16
114 PORTC_PIN3CTRL = 0x18; // Раскачка TX, PULLUP включить (PC3)
\ 00000056 E108 LDI R16, 24
\ 00000058 93000653 STS 1619, R16
А второй вариант даже без оптимизации получается экономнее:
117 PORTA_PIN1CTRL = PORTA_PIN2CTRL = PORTA_PIN3CTRL = PORTB_PIN0CTRL = PORTC_PIN2CTRL = PORTC_PIN3CTRL = 0x18;
\ 0000005C E108 LDI R16, 24
\ 0000005E 93000653 STS 1619, R16
\ 00000062 93000652 STS 1618, R16
\ 00000066 93000630 STS 1584, R16
\ 0000006A 93000613 STS 1555, R16
\ 0000006E 93000612 STS 1554, R16
\ 00000072 93000611 STS 1553, R16