Forum: Compiler & IDEs arm-gcc Problem mit -Os


von martin (Gast)


Lesenswert?

Also zuerst mal zu meinen Setup:
-) STM32F4DISCOVERY(STM42F407VG)
-) CoIDE 1.7.3
-) arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 
4.7.320121207 (release) [ARM/embedded-4_7-branch revision 194305]

Mein Programm sieht im Moment folgendermaßen aus:
1
#include "stm32f4xx.h"
2
3
void TIM1_UP_TIM10_IRQHandler(void) {
4
    TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
5
}
6
7
int main(void) {
8
    GPIO_InitTypeDef gpioInit;
9
    TIM_TimeBaseInitTypeDef timTimeBaseInit;
10
    NVIC_InitTypeDef nvicInit;
11
12
    // PD12, PD13, PD14, PD15 = LEDs
13
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
14
    gpioInit.GPIO_Pin   = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
15
    gpioInit.GPIO_Mode  = GPIO_Mode_OUT;
16
    gpioInit.GPIO_OType = GPIO_OType_PP;
17
    gpioInit.GPIO_PuPd  = GPIO_PuPd_NOPULL;
18
    gpioInit.GPIO_Speed = GPIO_Speed_100MHz;
19
    GPIO_Init(GPIOD, &gpioInit);
20
21
    // PA0 = button input
22
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
23
    gpioInit.GPIO_Pin   = GPIO_Pin_0;
24
    gpioInit.GPIO_Mode  = GPIO_Mode_IN;
25
    gpioInit.GPIO_OType = GPIO_OType_PP;
26
    gpioInit.GPIO_PuPd  = GPIO_PuPd_NOPULL;
27
    gpioInit.GPIO_Speed = GPIO_Speed_100MHz;
28
    GPIO_Init(GPIOA, &gpioInit);
29
30
31
    // TIM1 setup
32
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
33
    timTimeBaseInit.TIM_Prescaler           = 0;
34
    timTimeBaseInit.TIM_CounterMode         = TIM_CounterMode_Up;
35
    timTimeBaseInit.TIM_Period              = 2532;
36
    timTimeBaseInit.TIM_ClockDivision       = TIM_CKD_DIV1;
37
    timTimeBaseInit.TIM_RepetitionCounter   = 0;
38
39
40
    nvicInit.NVIC_IRQChannel                    = TIM1_UP_TIM10_IRQn;
41
    nvicInit.NVIC_IRQChannelCmd                 = ENABLE;
42
    nvicInit.NVIC_IRQChannelPreemptionPriority  = 0x0F;
43
    nvicInit.NVIC_IRQChannelSubPriority         = 0x0F;
44
45
    TIM_TimeBaseInit(TIM1, &timTimeBaseInit);
46
    NVIC_Init(&nvicInit);
47
48
    TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
49
    TIM_Cmd(TIM1, ENABLE);
50
51
52
    volatile uint32_t x = SystemCoreClock;
53
54
    while(1 > 0) {
55
        if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) {
56
            GPIO_SetBits(GPIOD, GPIO_Pin_13);
57
        } else {
58
            GPIO_ResetBits(GPIOD, GPIO_Pin_13);
59
        }
60
    }
61
62
63
}

Compiliert wird mit:
1
-mcpu=cortex-m4; -mfpu=fpv4-sp-d16; -mfloat-abi=hard; -mthumb; -Wall; -ffunction-sections; -g; -Os; -DSTM32F407VG; -DSTM32F4XX; -DHSE_VALUE=((uint32_t)8000000); -D__FPU_USED; -DUSE_STDPERIPH_DRIVER; -D__ASSEMBLY__; -I.;

Und gelinkt mit:
1
-mcpu=cortex-m4; -mthumb; -g; -nostartfiles; -Map=ARMSynth.map; -Os; --gc-sections; -L${linkdir}; -T${linkdir}/arm-gcc-link.ld;

Das Problem ist, dass ich nicht auf SystemCoreClock zugreifen kann, da 
komme ich dann anscheinend in eine Exception die aber im CoIDE Debugger 
keine Informationen liefert.
1
0x00000000 in ?? ()
2
tbreak main
3
Temporary breakpoint 1 at 0x80001f4: file C:\Users\...\Dokumente\Programmieren\ARM\ARMSynth\main.c, line 7.
4
continue

Dieses Problem tritt aber nur auf wenn ich das Projekt mit -Os baue und 
die Zeile mit TIM_ITConfig() gleichzeitig drinnen habe.

Bin, wie man wahrscheinlich schon gemerkt hat, was ARMs angeht noch 
blutiger Anfänger.


Martin

von Dr. Sommer (Gast)


Lesenswert?

martin schrieb:
> Temporary breakpoint 1 at 0x80001f4: file C:\Users\...
> \Dokumente\Programmieren\ARM\ARMSynth\main.c, line 7.
Das sieht eher nach einem Breakpoint als einer Exception aus. "bt", 
"info reg", "x/16xw $sp" im GDB eingeben, Ergebnis zeigen. Disassembly 
zeigen. ISR-Vektor zeigen. ARMSynth.map zeigen.

von martin (Gast)


Angehängte Dateien:

Lesenswert?

Also hier mal der GDB-Output:
http://pastebin.com/9t2Jqdiy

Mapfile:
http://pastebin.com/6tN6Kzfa

ISR-Vector:
http://pastebin.com/BRLvrieQ

Im Debugger wird mir kein Disassembly angezeigt aber ich habe mal im 
Archiv den vom Compiler generierten Assemblercode angehängt.

von Dr. Sommer (Gast)


Lesenswert?

Scheinbar doch eine Exception. Allerdings sind pc und sp komplett 
verbockt... Und der Compiler-Generierte Modul-Assemblycode ist nutzlos, 
wenn schon brauch man die Disassembly nach dem Linken; zu erzeugen mit 
"arm-none-eabi-objdump -d -t -C blubb.elf" - damit könnte man 
herausfinden wo nach Auftreten der Exception hingesprungen wurde, und 
warum danach der Programmablauf komplett durcheinander ging - und nach 
Reperatur des Fehlers und erneutem gdb-Debuggen, wo genau das Programm 
abgestürzt ist.

von Karl (Gast)


Lesenswert?

ART angeschaltet? Schau mal in die Errata...

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.