Forum: Mikrocontroller und Digitale Elektronik Code Optimierung [ASM/C]


von Sebastian (Gast)


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

von Ulrich (Gast)


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).

von Peter D. (pdiener) Benutzerseite


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.