Hi,my mcu is MC9S12X,ide is CodeWarrior V5.1.
Codes like:
float gf_e_a, gf_e_b, gf_e_c;
void test(void)
{
word va, vb, vc;
va = 3000;
vb = 89;
vc = 2000;
gf_e_a = 0;
gf_e_b = 0;
gf_e_c = 0;
while(1)
{
gf_e_a = va;
gf_e_b = vb;
gf_e_c = vc;
if(gf_e_c <= (gf_e_a * (1.0 - ((100 - gf_e_b)/20.0))))
{
gf_e_c = gf_e_c - 0.01;
}
else
{
gf_e_c = (gf_e_a * (1.0 - ((100 - gf_e_b)/20.0)));
}
}
}
I suppose it should goto 'else' and gf_e_c should be equal to (3000 * (1.0 - ((100 - 89)/20.0)) = 1350.
But the result is gf_e_c equal to 2006.
Then i check the assambly code:
330: float gf_e_a, gf_e_b, gf_e_c;
331: void test(void)
332: {
0000 1b98 [2] LEAS -8,SP
333: word va, vb, vc;
334: float res;
335:
336: va = 3000;
0002 cc0bb8 [2] LDD #3000
0005 6c86 [2] STD 6,SP
337: vb = 89;
0007 ce0059 [2] LDX #89
000a 6e84 [2] STX 4,SP
338: vc = 2000;
000c cd07d0 [2] LDY #2000
000f 6d82 [2] STY 2,SP
339:
340: gf_e_a = 0;
0011 c7 [1] CLRB
0012 87 [1] CLRA
0013 7c0000 [3] STD gf_e_a:2
341: gf_e_b = 0;
0016 7c0000 [3] STD gf_e_b:2
342: gf_e_c = 0;
0019 7c0000 [3] STD gf_e_c:2
343:
344: while(1)
345: {
346: gf_e_a = va;
001c ec86 [3] LDD 6,SP
001e 1887 [2] CLRX
0020 160000 [4] JSR _FUFLOAT
0023 7c0000 [3] STD gf_e_a:2
0026 7e0000 [3] STX gf_e_a
347: gf_e_b = vb;
0029 ec84 [3] LDD 4,SP
002b b705 [1] SEX A,X
002d 160000 [4] JSR _FUFLOAT
0030 7c0000 [3] STD gf_e_b:2
0033 7e0000 [3] STX gf_e_b
348: gf_e_c = vc;
0036 ec82 [3] LDD 2,SP
0038 1887 [2] CLRX
003a 160000 [4] JSR _FUFLOAT
003d 7c0000 [3] STD gf_e_c:2
0040 7e0000 [3] STX gf_e_c
349:
350: if(gf_e_c <= (gf_e_a * (1.0 - ((100 - gf_e_b)/20.0))))
0043 fd0000 [3] LDY gf_e_b:2
0046 35 [2] PSHY
0047 fd0000 [3] LDY gf_e_b
004a 35 [2] PSHY
004b c7 [1] CLRB
004c 87 [1] CLRA
004d ce42c8 [2] LDX #17096
0050 160000 [4] JSR _FSUB
0053 18c7 [2] CLRY
0055 6da1 [2] STY 2,+SP
0057 6c82 [2] STD 2,SP
0059 cc41a0 [2] LDD #16800
005c 3b [2] PSHD
005d ec84 [3] LDD 4,SP
005f 160000 [4] JSR _FDIV
0062 6ca1 [2] STD 2,+SP
0064 34 [2] PSHX
0065 ce3f80 [2] LDX #16256
0068 b764 [1] TFR Y,D
006a 160000 [4] JSR _FSUB
006d fd0000 [3] LDY gf_e_a:2
0070 6da1 [2] STY 2,+SP
0072 fd0000 [3] LDY gf_e_a
0075 35 [2] PSHY
0076 160000 [4] JSR _FMUL
0079 6ca1 [2] STD 2,+SP
007b 34 [2] PSHX
007c b746 [1] TFR D,Y
007e fc0000 [3] LDD gf_e_c:2
0081 fe0000 [3] LDX gf_e_c
0084 160000 [4] JSR _FCMP
0087 1b84 [2] LEAS 4,SP
0089 2e16 [3/1] BGT *+24 ;abs = 00a1
351: {
352: gf_e_c = gf_e_c - 0.01;
008b ccd70a [2] LDD #55050
008e 3b [2] PSHD
008f cebc23 [2] LDX #48163
0092 34 [2] PSHX
0093 fc0000 [3] LDD gf_e_c:2
0096 fe0000 [3] LDX gf_e_c
0099 160000 [4] JSR _FADD
009c 1b84 [2] LEAS 4,SP
353: }
009e 060000 [3] JMP test:0x0019
354: else
355: {
356: gf_e_c = (gf_e_a * (1.0 - ((100 - gf_e_b)/20.0)));
00a1 7d0000 [3] STY gf_e_c:2
00a4 060000 [3] JMP test:0x001c
357: }
358: }
359:
360: while(1);
361: }
There is something wrong in 'else'!
If i use key word 'volatile' to define the gf_e_xxx,it works.
But i want to know how to solve it officially.