arm-gcc Problem mit -Os

Gast #3232281
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
Gast #3233746
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.
Gast #3233990
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.

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