Code Optimierung [ASM/C]

Gast #2224990
Lesenswert?

Hallo Leute

Ich habe das Problem das ich für den unten gelisteten Code nur 48 Byte 
Speicher zu verfügung habe. So wie er jetzt ist benötigt er aber 52 
Byte.
Ich benutze einen ARM Cortex-M1 und den armcc Compiler. Die verschidenen 
Optimierungs Optionen wie -Ospace und -03 liefern alle den selben ASM 
Code.
Hat noch jemand eine Idee wie man den Code noch klein bekommen könnte?

Vielen Dank.

Sebastian

1
void reset_handler(void)
2
  {
3
  
4
/* bist is not executed if test pin is set HIGH */
5
  if(RReg32(SYS_CTRL)&SYS_CTRL__testmode) {}
6
  else {
7
    /* do start-up DMA/BIST if the according bit is set */
8
    if (RReg32(SYS_CONFIG)&SYS_CONFIG__bist_en_trim) { 
9
      do_start_up_dma();
10
    }
11
  }
12
  
13
  /* wait until shutdown bit gets cleared */
14
         while (RReg32(SYS_CTRL)&SYS_CTRL__shutdown) { }
15
     /* do start-up RAM_BIST if the according bit is set */
16
         if (RReg32(0x0000C7F7)&0x04000000) {
17
       do_start_up_ram_bist();
18
         }
19
  main();
20
}

1
; generated by ARM/Thumb C/C++ Compiler, RVCT3.1 [Build 794]
2
; commandline armcc [-c --asm -o../software/ram_bist/reset_handler.o --cpu=Cortex-M1 -O3 --data_reorder -Oautoinline -Oinline --diag_suppress=2874 -I../software/CMSIS/Core/CM0/ -I../software/include/ -I../software/drivers/ -I../software/ram_bist/ -DMSC_CLOCK -DITERATIONS=5 ../software/drivers/reset_handler.c]
3
        THUMB
4
        REQUIRE8
5
        PRESERVE8
6

7
        AREA ||.text||, CODE, READONLY, ALIGN=2
8

9
reset_handler PROC
10
        PUSH     {r4,lr}
11
        MOVS     r4,#1
12
        LSLS     r4,r4,#30
13
        LDR      r0,[r4,#0]
14
        LSLS     r0,r0,#27
15
        BMI      |L1.22|
16
        LDR      r0,[r4,#0x10]
17
        LSLS     r0,r0,#29
18
        BPL      |L1.22|
19
        BL       do_start_up_dma
20
|L1.22|
21
        LDR      r0,[r4,#0]
22
        LSLS     r0,r0,#30
23
        BMI      |L1.22|
24
        LDR      r0,|L1.48|
25
        LDR      r0,[r0,#0x34]
26
        LSLS     r0,r0,#5
27
        BPL      |L1.40|
28
        BL       do_start_up_ram_bist
29
|L1.40|
30
        BL       main
31
        POP      {r4,pc}
32
        ENDP
33

34
        DCW      0x0000
35
|L1.48|
36
        DCD      0x0000c7c3
37

38
        AREA ||.arm_vfe_header||, DATA, READONLY, NOALLOC, ALIGN=2
39

40
        DCD      0x00000000
41

42
        EXPORT reset_handler
43

44
        IMPORT ||Lib$$Request$$armlib|| [WEAK]
45
        IMPORT main
46
        IMPORT do_start_up_ram_bist
47
        IMPORT do_start_up_dma
48

49
        ASSERT {ENDIAN} = "little"
50
        ASSERT {INTER} = {TRUE}
51
        ASSERT {ROPI} = {FALSE}
52
        ASSERT {RWPI} = {FALSE}
53
        ASSERT {IEEE_FULL} = {FALSE}
54
        ASSERT {IEEE_PART} = {FALSE}
55
        ASSERT {IEEE_JAVA} = {FALSE}
56
        END
Gast #2225133
Lesenswert?

Da es nur um maximal 48 Bytes geht, wäre inline ASM ein Möglichkeit. 
Wenn es damit nicht geht, braucht man halt einen µC mit mehr 48 bytes 
Speicher (bzw. spart an einer anderen Stelle des Programms).
Persönliche Seite #2225245
Lesenswert?

Ich unterstelle mal, dass main() nie beendet wird.

Dann wäre
POP      {r4,pc}
unnötig.

Vermutlich ist in Register r4 am Anfang nichts Sinnvolles gespeichert, 
somit muss es auch nicht gerettet werden.
Damit ist
PUSH     {r4,lr}
vermutlich auch unnötig.

Damit man den Teil dazwischen vernünftig versteht, sollte man die 
Sourcezeilen mit in das listing schreiben lassen. Es ist schon möglich, 
dass man da noch was sparen kann.

Grüße,

Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren