Hallo, ich habe mir ein Board mit einem Cortex M3 gebaut, auch externes
RAM angeschlossen.
Jetzt habe ich zwei Funktionen geschrieben, welche den Speicher
beschreiben und auslesen.
In der Hauptschleife rufe ich diese nun auf.
1 | i = 0;
|
2 |
|
3 | /* Infinite loop */
|
4 | while (1)
|
5 | {
|
6 | ExtRam_SetByte(i, 0x13);
|
7 | check = ExtRam_GetByte(i);
|
8 |
|
9 | i++;
|
10 |
|
11 | if(i >= 0x80000)
|
12 | i = 0x00000;
|
13 |
|
14 | }
|
15 | }
|
Der Optimierer macht allerdings voll den Kack daraus, hier mal ein
Assemblerlisting:
1 | /* Infinite loop */
|
2 | while (1)
|
3 | {
|
4 | ExtRam_SetByte(i, 0x13);
|
5 | 2113 movs r1, #0x13
|
6 | 2000 movs r0, #0x00
|
7 | F7FFFFB2 bl 0x08000684 <ExtRam_SetByte>
|
8 | check = ExtRam_GetByte(i);
|
9 | 2000 movs r0, #0x00
|
10 | F7FFFF87 bl 0x08000634 <ExtRam_GetByte>
|
11 | ExtRam_SetByte(i, 0x13);
|
12 | 2113 movs r1, #0x13
|
13 | 2001 movs r0, #0x01
|
14 | F7FFFFAB bl 0x08000684 <ExtRam_SetByte>
|
15 | check = ExtRam_GetByte(i);
|
16 | 2001 movs r0, #0x01
|
17 | F7FFFF80 bl 0x08000634 <ExtRam_GetByte>
|
18 | ExtRam_SetByte(i, 0x13);
|
19 | 2002 movs r0, #0x02
|
20 | 2113 movs r1, #0x13
|
21 | F7FFFFA4 bl 0x08000684 <ExtRam_SetByte>
|
22 | check = ExtRam_GetByte(i);
|
23 | 2002 movs r0, #0x02
|
24 | F7FFFF79 bl 0x08000634 <ExtRam_GetByte>
|
25 |
|
26 | i++;
|
27 | 2303 movs r3, #0x03
|
28 | E00B b 0x0800075E
|
29 | ExtRam_SetByte(i, 0x13);
|
30 | 4620 mov r0, r4
|
31 | 2113 movs r1, #0x13
|
32 | F7FFFF9B bl 0x08000684 <ExtRam_SetByte>
|
33 | check = ExtRam_GetByte(i);
|
34 | 4620 mov r0, r4
|
35 | F7FFFF70 bl 0x08000634 <ExtRam_GetByte>
|
36 |
|
37 | i++;
|
38 | 1C63 adds r3, r4, #0x1
|
39 | 2400 movs r4, #0x00
|
40 |
|
41 | if(i >= 0x80000)
|
42 | F5B32F00 cmp.w r3, #0x00080000
|
43 | D2F3 bcs 0x08000746
|
44 | 461C mov r4, r3
|
45 | E7F1 b 0x08000746
|
er ruft erst dreimal die Funktionen direkt auf und setzt dann 'i' auf 3.
Irgenwie blöd, oda?
Ich arbeite mit Rowley Crossworks und die Optimierung ist auf Size
gestellt.
Kann ich da was ändern?
Gruß, Martin