Цитата(_Pasha @ Feb 25 2009, 17:30)

Экономия при дефайне получается, когда например
Код
int16 temp;
temp = WREG; // что-то откуда-то прочли
if(temp > VoltageMax) temp = VoltageMax;
Мне переприсваивать не надо. У меня читается АЦП
Цитата
temp = WREG; // что-то откуда-то прочли)
И затем сравнивается со значениями Max и Min. То есть с константами, которые никоим образом не меняются при работе программы.
Понимаю, что проблема яйца выеденного не стоит, тем более работают оба варианта одинаково, просто хочется разобраться с логикой работы компилятора, чтобы потом глупых вопросов не задавать.
Вот это код:
Код
#define VoltageMax (2.5/(4.18/1024))
volatile unsigned int16 ChargeMax = VoltageMax;
преобразовался в:
Код
0160: MOVLW 64
0161: MOVWF 2E
0162: MOVLW 02
0163: MOVWF 2F
Зато в случае с константой значения выплыли только при сравнении:
Код
value>ChargeMax
превратилось в
Код
00E7: MOVF 34,W
00E8: SUBLW 01
00E9: BTFSC 03.0
00EA: GOTO 0F2
00EB: XORLW FF
00EC: BTFSS 03.2
00ED: GOTO 0C3
00EE: MOVF 33,W
00EF: SUBLW 64
00F0: BTFSS 03.0
00F1: GOTO 0C3
В предидущем случае в том же кусочку вместо movlw шли movf и размер кода рос.
Так что определение значений :
Код
const unsigned int16 ChargeMax = (unsigned int16)(1024 * 2.5/4.18);
Оказалось самым правильным.