Forum: Compiler & IDEs GCC Ram Segmente


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von J. V. (janvi)


Bewertung
0 lesenswert
nicht lesenswert
Habe vom STM32 Cube erzeugte  Startup und Linker Script abgeguckt. Es 
gibt dort die (RAM) Segmente bss und data welche angeblich für nicht 
intialisierte und initialisierte RAM Variablen vorgesehen sind. Wenn ich 
eine (volatile) Variable anlege landet diese immer in bss unabhängig 
davon ob sie mit = Wert bei der Definition initialsiert wird. Im Startup 
werden übrigens beide Segment initialisiert, data mit 0 und bss mit 
Initialsierungswerten (Block Kopie). Wie muß ich eine Variable angeben 
damit sie ins data Segment gelinkt wird ?

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
J. V. schrieb:
> Wenn ich
> eine (volatile) Variable anlege landet diese immer in bss unabhängig
> davon ob sie mit = Wert bei der Definition initialsiert wird.

Dann zeig doch mal deren Definition. Wie stellst du fest dass sie in 
.bss landet?

Wie sieht das Linker-Script aus?

J. V. schrieb:
> Wie muß ich eine Variable angeben
> damit sie ins data Segment gelinkt wird ?

Sie muss global und/oder "static" sein, constant-initialisierbar sein 
und einen Initialisierungswert haben der nicht aus Nullen besteht.

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dazu empfehle ich immer mein Lieblings-Kurz-Tutorial.

https://blog.atollic.com/using-gnu-gcc-on-arm-cortex-devices-placing-code-and-data-on-special-memory-addresses-using-the-gnu-ld-linker

Wenn man das verstanden hat, kann man Konstanten und Variablen aller Art 
gezielt im Speicher ablegen und im Map File die Folgen seiner Bemühungen 
ansehen.

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
pegel schrieb:
> Wenn man das verstanden hat, kann man Konstanten und Variablen aller Art
> gezielt im Speicher ablegen und im Map File die Folgen seiner Bemühungen
> ansehen.

Das ist aber wahrscheinlich unnötig; solche Variablen sollten 
automatisch in .data landen und auch initialisiert werden, wenn man 
nicht gerade das Linkerscript verbastelt hat.

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
So oder so sollte man Variablen/Konstanten in allen möglichen Varianten 
in allen Bereichen initialisiert oder nicht, selbst einmal mit 
aussagekräftigen Namen anlegen und schauen was aus denen wird.

Das erspart vielleicht viele Fragen für die Zukunft.

von Bauform B. (bauformb)


Bewertung
0 lesenswert
nicht lesenswert
Die sections mit den Namen .text .data .bss haben eine feste Bedeutung 
seit es Linker gibt. Alle anderen mit einem Punkt am Anfang gehören der 
Toolchain, selbst definierte sections sollen mit einem Buchstaben 
beginnen. Im Namen sind viele Sonderzeichen erlaubt, aber dann brauchen 
die eine Sonderbehandlung.

Andererseits: ohne Sonderzeichen kann der Name einer section mit dem 
Namen einer Funktion verwechselt werden; anscheinend hat der Linker nur 
eine Symboltabelle für alles.

Das gibt ziemlich überraschende Fehler, nach so einem hab' ich gerade 
lange gesucht. Also probiere ich es mit einem '$' am Anfang. Gibt's zu 
dem Thema Erfahrungen?

von Janvi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ok, das _attribute_ section habe ich nicht gekannt und werde es mal 
probieren. Automatisch landet bei mir jedenfalls nichts im .data 
segement.

Soweit ich das mal gehört habe ist .text eben für den Code und .bss 
bedeute BaSeSegment und .daten sind eben für die Daten. Bei mir landen 
alle Daten im .bss und ich glaube mal irgendwo gehört zu haben, daß dies 
ein Relikt aus älteren Architekturen ist wo es eine Kurzadressierung 
fürs RAM gibt. Also z. Bsp. eine Seite 0 mit 256 byte die über einen 8 
bit Adresse gehen während das .data Segment dann für die restlichen 
Daten sein soll wo in die Seite 0 nicht mehr reingehen. Bei einem 32 bit 
Adressraum ist das aber definitiv nicht so und Banking wird man da bis 
auf Weiteres auch nie brauchen.

von Janvi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Wie stellst du fest dass sie in .bss landet?

ich habe Ozone und Segger J-Trace zum debuggen

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Janvi schrieb:
> und werde es mal
> probieren.

Das ist unnötig.

Janvi schrieb:
> Automatisch landet bei mir jedenfalls nichts im .data
> segement.

Dann ist dein Linkerscript kaputt.

Janvi schrieb:
> Bei mir landen
> alle Daten im .bss

Dito.

Janvi schrieb:
> und ich glaube mal irgendwo gehört zu haben, daß dies
> ein Relikt aus älteren Architekturen ist wo es eine Kurzadressierung
> fürs RAM gibt.

Das hat aber mit dem ARM-GCC nichts zu tun. Ich und viele andere haben 
schon Tausende Programme mit dem GCC für den STM32 geschrieben, bei 
denen Nicht-Null-Initialisierte Variablen ganz korrekt in .data landen 
und automatisch initialisiert wurden, ganz ohne _attribute_.

Aber ohne deinen Code, dein Linkerscript, deinen Startup-Code und deine 
Compiler & Linker-Aufrufe zu sehen kann man da nichts zu sagen,

Janvi schrieb:
> ich habe Ozone und Segger J-Trace zum debuggen

Und wo zeigt der an dass die Variable in ".bss" landet? Was sagt das 
Linker Map file?

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
Niklas G. schrieb:
> pegel schrieb:
>> Wenn man das verstanden hat, kann man Konstanten und Variablen aller Art
>> gezielt im Speicher ablegen und im Map File die Folgen seiner Bemühungen
>> ansehen.
>
> Das ist aber wahrscheinlich unnötig; solche Variablen sollten
> automatisch in .data landen und auch initialisiert werden, wenn man
> nicht gerade das Linkerscript verbastelt hat.

Eine volatile Variable kann sich per Definition jederzeit ändern. Das 
würde z.B. bedeuten, daß die Initialisierung (=123) erst zur Laufzeit 
vorgenommen werden kann. Damit sind sie zuerst mal uninitialisiert, also 
.bss.
Mag spitzfindig sein, aber durchaus korrekt.

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Carl D. schrieb:
> daß die Initialisierung (=123) erst zur Laufzeit
> vorgenommen werden kann.

Alle Variablen sind erstmal uninitialisiert. und werden dann zur 
Laufzeit vom Startup-Code beschrieben.

Carl D. schrieb:
> Damit sind sie zuerst mal uninitialisiert, also
> .bss.
> Mag spitzfindig sein, aber durchaus korrekt.

Der GCC packt auch volatile-Variablen nach .bss. Aber das ist hier alles 
Kaffee-Satz-Lesen ohne Code & Linker-Script.

Mit "nm test.elf" kann man feststellen, in welche Section die Symbole 
gepackt wurden. Wenn man also z.B.
volatile int foo = 42;
volatile int bar = 0;
kompiliert, kommt
00000000 d $d
00000000 b $d
00000000 B bar
00000000 D foo
heraus - das "D" gibt an, dass "foo" in ".data" ist, und das "B" zeigt 
dass "bar" in ".bss" ist.

Wenn jetzt im Linker-Script sowas total cleveres wie
.bss : {
  *(.data)
}
steht, würde man die .data-Variablen nach .bss schicken, was dann 
natürlich nicht funktioniert. Bislang gibt es aber überhaupt keinen 
Hinweis, dass hier wirklich was in ".bss" landet - vielleicht sind die 
Variablen einfach nur 0? Dann ist vielleicht im Startup-Code was falsch, 
der RAM nicht richtig initialisiert, oder der bekannte Fehler aus den 
ST-Linkerscripten mit dem falsch definierten Symbol wurde übernommen, 
oder oder oder... Kaffeesatz halt. Fakt ist nur, dass bei korrekt 
eingestelltem Drumherum Nicht-0-initialisierte Variablen auch ohne das 
section-Attribut in ".data" landen.

Bauform B. schrieb:
> selbst definierte sections sollen mit einem Buchstaben
> beginnen.

Hast du dafür eine Quelle?

von Janvi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Linkerskript mal hier. Der Debugger hat die Symbole _edata und _sdata 
über das ELF und da sieht man dass nix dazwischen liegt. Das Meiste im 
map file von ld verstehe ich zugegebenermassen nicht wirklich bzw. das 
was ich suche finde ich nicht. Vielleicht fehlen noch die passenden 
Schalter dazu. Diese sind für den Compiler:
-Wall -O0 -funsigned-char -xc -mlittle-endian -mthumb -c 
--function-sections -mcpu=cortex-m3 -gdwarf-2
und für den Linker
-gc-sections -M=map.txt -T./lscriptF107.txt

Volatile gibt nach meinem Wissen an, daß der Compiler nicht davon 
ausgehen kann das Gleiche zurückzulesen wie er zuletzt geschrieben hat 
und dafür darf er Schreibzugriffe (welche möglicherweise auch gar nicht 
mehr zurückgelesen werden) auch nicht wegoptimieren. Das sollte 
natürlich auch für die Initialisierung gelten.
/****************************************************************************
        Linker Script fuer STM32F107  auf arm-none-eabi-gcc
***************************************************************************/

/* Cortex  M0,1,        thumb/v6-m */
/* Cortex  M3           thumb/v7-m */
/* Cortex  M4 ohne FP   thumb/v7e-m */
/* Cortex  M4 Soft FP   thumb/v7e-m/fpv4-sp/softfp */
/* Cortex  M4 Hard FP   thumb/v7e-m/fpv4-sp/hard */
/* Cortex  M7 ohne FP   thumb/v7e-m */
/* Cortex  M7 Soft FP   thumb/v7e-m/fpv4-sp/softfp */
/* Cortex  M7 Hard FP   thumb/v7e-m/fpv4-sp/hard */
/* siehe auch newlib_nano readme.pdf */

SEARCH_DIR("/usr/lib/arm-none-eabi/newlib/thumb/v7-m/")
SEARCH_DIR("/usr/lib/gcc/arm-none-eabi/6.3.1/thumb/v7-m/")

ENTRY(Reset_Handler)                            /* Reset Symbol ins ELF fuer Segger Ozone */

__Stack_Size = 1024 ;
PROVIDE ( _Stack_Size = __Stack_Size ) ;        /* provide kann vom Objektfile ueberschrieben werden */
__Stack_Init = _estack  - __Stack_Size ;
PROVIDE ( _Stack_Init = __Stack_Init ) ;
_Minimum_Stack_Size = 0x100 ;

MEMORY
{
  RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
  FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 256K
}

_estack = 0x20010000;  /* bei 64k RAM ist oberstes Stack Byte 0x2000ffff */

SECTIONS
{
    .isr_vector :
    {
        . = ALIGN(4);
        KEEP(*(.isr_vector))            
        . = ALIGN(4);
    } >FLASH                            /* Vektor Tabelle ins Flash */
 
    .text :
    {
            . = ALIGN(4);
        *(.text)                   /* remaining code */
        *(.text.*)                 /* remaining code */
        *(.rodata)                 /* read-only data (constants) */
        *(.rodata*)
        *(.glue_7)
        *(.glue_7t)
            . = ALIGN(4);
         _etext = .;            /*  zur .data Initialisierung in Startup */
         _sidata = _etext;
    } >FLASH                    /* Programmcode ins Flash */
    
    .data  : AT ( _sidata )
    {
            . = ALIGN(4);
        _sdata = . ;
        *(.data)
        *(.data.*)
            . = ALIGN(4);
         _edata = . ;   /* zur .data Initialisierung in Startup */
    } >RAM              /* Initialsierte Daten ins RAM */
    
    .bss :
    {
            . = ALIGN(4);
        _sbss = .;
        
        *(.bss)
        *(COMMON)
        
            . = ALIGN(4);
         _ebss = . ;
    } >RAM              /* uninitialisierte Daten ins Ram */
    
    PROVIDE ( end = _ebss );
    PROVIDE ( _end = _ebss );
    
    ._usrstack :                /* User Stack Fehlermeldung */
    {
            . = ALIGN(4);
        _susrstack = . ;
        . = . + _Minimum_Stack_Size ;
            . = ALIGN(4);
        _eusrstack = . ;
    } >RAM
}

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Janvi schrieb:
> Das Meiste im
> map file von ld verstehe ich zugegebenermassen nicht wirklich

Dann zeig es doch mal...

Janvi schrieb:
> _sidata = _etext;

Das ist falsch. Das ist der erwähnte Fehler aus dem ST-Linkerscript. So 
geht es richtig:
    .text :
    {
            . = ALIGN(4);
        *(.text)                   /* remaining code */
        *(.text.*)                 /* remaining code */
        *(.rodata)                 /* read-only data (constants) */
        *(.rodata*)
        *(.glue_7)
        *(.glue_7t)
            . = ALIGN(4);
         _etext = .;            /*  zur .data Initialisierung in Startup */
    } >FLASH                    /* Programmcode ins Flash */
    . = ALIGN(4);
    .data : {
        _sdata = . ;
        *(.data)
        *(.data.*)
            . = ALIGN(4);
         _edata = . ;   /* zur .data Initialisierung in Startup */
    } >RAM AT >FLASH             /* Initialsierte Daten ins RAM */
    _sidata = LOADADDR(.data);

von Janvi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Dann zeig es doch mal...
Allocating common symbols
Common symbol       size              file

TIM_BDTRInitStructure
                    0xe               ./o/cpuinit.o
j                   0x4               ./o/main.o
TIM_TimeBaseStructure
                    0xa               ./o/cpuinit.o
dbg                 0x4               ./o/main.o
ToTimer             0x2               ./o/main.o
i                   0x4               ./o/main.o
DAC_InitStructure   0x10              ./o/cpuinit.o
GPIO_InitStructure  0x4               ./o/cpuinit.o
TIM_ICInitStructure
                    0xa               ./o/cpuinit.o
NVIC_InitStructure  0x4               ./o/cpuinit.o

Discarded input sections

 .text          0x0000000000000000        0x0 ./o/system_stm32f10x.o
 .data          0x0000000000000000       0x14 ./o/system_stm32f10x.o
 .bss           0x0000000000000000        0x0 ./o/system_stm32f10x.o
 .text.SystemInit
                0x0000000000000000       0x7c ./o/system_stm32f10x.o
 .text.SystemCoreClockUpdate
                0x0000000000000000      0x140 ./o/system_stm32f10x.o
 .text.SetSysClock
                0x0000000000000000        0xc ./o/system_stm32f10x.o
 .text.SetSysClockTo72
                0x0000000000000000      0x138 ./o/system_stm32f10x.o
 .debug_info    0x0000000000000000      0x513 ./o/system_stm32f10x.o
 .debug_abbrev  0x0000000000000000      0x19b ./o/system_stm32f10x.o
 .debug_loc     0x0000000000000000      0x110 ./o/system_stm32f10x.o
 .debug_aranges
                0x0000000000000000       0x38 ./o/system_stm32f10x.o
 .debug_ranges  0x0000000000000000       0x28 ./o/system_stm32f10x.o
 .debug_line    0x0000000000000000      0x179 ./o/system_stm32f10x.o
 .debug_str     0x0000000000000000      0x2ed ./o/system_stm32f10x.o
 .comment       0x0000000000000000       0x32 ./o/system_stm32f10x.o
 .debug_frame   0x0000000000000000       0x98 ./o/system_stm32f10x.o
 .ARM.attributes
                0x0000000000000000       0x33 ./o/system_stm32f10x.o
 .text          0x0000000000000000        0x0 ./o/stm32f10x_dac.o
 .data          0x0000000000000000        0x0 ./o/stm32f10x_dac.o
 .bss           0x0000000000000000        0x0 ./o/stm32f10x_dac.o
 .text.DAC_DeInit
                0x0000000000000000       0x1c ./o/stm32f10x_dac.o
 .text.DAC_StructInit
                0x0000000000000000       0x2a ./o/stm32f10x_dac.o
 .text.DAC_DMACmd
                0x0000000000000000       0x4c ./o/stm32f10x_dac.o
 .text.DAC_DualSoftwareTriggerCmd
                0x0000000000000000       0x38 ./o/stm32f10x_dac.o
 .text.DAC_WaveGenerationCmd
                0x0000000000000000       0x4c ./o/stm32f10x_dac.o
 .text.DAC_SetChannel2Data
                0x0000000000000000       0x34 ./o/stm32f10x_dac.o
 .text.DAC_SetDualChannelData
                0x0000000000000000       0x58 ./o/stm32f10x_dac.o
 .text.DAC_GetDataOutputValue
                0x0000000000000000       0x30 ./o/stm32f10x_dac.o
 .text          0x0000000000000000        0x0 ./o/stm32f10x_rcc.o
 .data          0x0000000000000000       0x14 ./o/stm32f10x_rcc.o
 .bss           0x0000000000000000        0x0 ./o/stm32f10x_rcc.o
 .text.RCC_AdjustHSICalibrationValue
                0x0000000000000000       0x3c ./o/stm32f10x_rcc.o
 .text.RCC_HSICmd
                0x0000000000000000       0x20 ./o/stm32f10x_rcc.o
 .text.RCC_PREDIV2Config
                0x0000000000000000       0x38 ./o/stm32f10x_rcc.o
 .text.RCC_PLL2Config
                0x0000000000000000       0x38 ./o/stm32f10x_rcc.o
 .text.RCC_PLL2Cmd
                0x0000000000000000       0x20 ./o/stm32f10x_rcc.o
 .text.RCC_PLL3Config
                0x0000000000000000       0x38 ./o/stm32f10x_rcc.o
 .text.RCC_PLL3Cmd
                0x0000000000000000       0x20 ./o/stm32f10x_rcc.o
 .text.RCC_ITConfig
                0x0000000000000000       0x4c ./o/stm32f10x_rcc.o
 .text.RCC_OTGFSCLKConfig
                0x0000000000000000       0x1c ./o/stm32f10x_rcc.o
 .text.RCC_I2S2CLKConfig
                0x0000000000000000       0x1c ./o/stm32f10x_rcc.o
 .text.RCC_I2S3CLKConfig
                0x0000000000000000       0x1c ./o/stm32f10x_rcc.o
 .text.RCC_LSEConfig
                0x0000000000000000       0x40 ./o/stm32f10x_rcc.o
 .text.RCC_LSICmd
                0x0000000000000000       0x20 ./o/stm32f10x_rcc.o
 .text.RCC_RTCCLKConfig
                0x0000000000000000       0x24 ./o/stm32f10x_rcc.o
 .text.RCC_RTCCLKCmd
                0x0000000000000000       0x20 ./o/stm32f10x_rcc.o
 .text.RCC_GetClocksFreq
                0x0000000000000000      0x1c8 ./o/stm32f10x_rcc.o
 .text.RCC_AHBPeriphResetCmd
                0x0000000000000000       0x3c ./o/stm32f10x_rcc.o
 .text.RCC_APB2PeriphResetCmd
                0x0000000000000000       0x3c ./o/stm32f10x_rcc.o
 .text.RCC_APB1PeriphResetCmd
                0x0000000000000000       0x3c ./o/stm32f10x_rcc.o
 .text.RCC_BackupResetCmd
                0x0000000000000000       0x20 ./o/stm32f10x_rcc.o
 .text.RCC_ClockSecuritySystemCmd
                0x0000000000000000       0x20 ./o/stm32f10x_rcc.o
 .text.RCC_MCOConfig
                0x0000000000000000       0x20 ./o/stm32f10x_rcc.o
 .text.RCC_ClearFlag
                0x0000000000000000       0x1c ./o/stm32f10x_rcc.o
 .text.RCC_GetITStatus
                0x0000000000000000       0x34 ./o/stm32f10x_rcc.o
 .text.RCC_ClearITPendingBit
                0x0000000000000000       0x20 ./o/stm32f10x_rcc.o
 .text          0x0000000000000000        0x0 ./o/stm32f10x_flash.o
 .data          0x0000000000000000        0x0 ./o/stm32f10x_flash.o
 .bss           0x0000000000000000        0x0 ./o/stm32f10x_flash.o
 .text.FLASH_HalfCycleAccessCmd
                0x0000000000000000       0x30 ./o/stm32f10x_flash.o
 .text.FLASH_Unlock
                0x0000000000000000       0x24 ./o/stm32f10x_flash.o
 .text.FLASH_UnlockBank1
                0x0000000000000000       0x24 ./o/stm32f10x_flash.o
 .text.FLASH_Lock
                0x0000000000000000       0x1c ./o/stm32f10x_flash.o
 .text.FLASH_LockBank1
                0x0000000000000000       0x1c ./o/stm32f10x_flash.o
 .text.FLASH_ErasePage
                0x0000000000000000       0x64 ./o/stm32f10x_flash.o
 .text.FLASH_EraseAllPages
                0x0000000000000000       0x5c ./o/stm32f10x_flash.o
 .text.FLASH_EraseAllBank1Pages
                0x0000000000000000       0x5c ./o/stm32f10x_flash.o
 .text.FLASH_EraseOptionBytes
                0x0000000000000000       0xd4 ./o/stm32f10x_flash.o
 .text.FLASH_ProgramWord
                0x0000000000000000       0x94 ./o/stm32f10x_flash.o
 .text.FLASH_ProgramHalfWord
                0x0000000000000000       0x5c ./o/stm32f10x_flash.o
 .text.FLASH_ProgramOptionByteData
                0x0000000000000000       0x78 ./o/stm32f10x_flash.o
 .text.FLASH_EnableWriteProtection
                0x0000000000000000      0x118 ./o/stm32f10x_flash.o
 .text.FLASH_ReadOutProtection
                0x0000000000000000       0xd4 ./o/stm32f10x_flash.o
 .text.FLASH_UserOptionByteConfig
                0x0000000000000000       0x94 ./o/stm32f10x_flash.o
 .text.FLASH_GetUserOptionByte
                0x0000000000000000       0x18 ./o/stm32f10x_flash.o
 .text.FLASH_GetWriteProtectionOptionByte
                0x0000000000000000       0x14 ./o/stm32f10x_flash.o
 .text.FLASH_GetReadOutProtectionStatus
                0x0000000000000000       0x30 ./o/stm32f10x_flash.o
 .text.FLASH_GetPrefetchBufferStatus
                0x0000000000000000       0x30 ./o/stm32f10x_flash.o
 .text.FLASH_ITConfig
                0x0000000000000000       0x3c ./o/stm32f10x_flash.o
 .text.FLASH_GetFlagStatus
                0x0000000000000000       0x50 ./o/stm32f10x_flash.o
 .text.FLASH_ClearFlag
                0x0000000000000000       0x1c ./o/stm32f10x_flash.o
 .text.FLASH_GetStatus
                0x0000000000000000       0x54 ./o/stm32f10x_flash.o
 .text.FLASH_GetBank1Status
                0x0000000000000000       0x54 ./o/stm32f10x_flash.o
 .text.FLASH_WaitForLastOperation
                0x0000000000000000       0x44 ./o/stm32f10x_flash.o
 .text.FLASH_WaitForLastBank1Operation
                0x0000000000000000       0x44 ./o/stm32f10x_flash.o
 .text          0x0000000000000000        0x0 ./o/cpuinit.o
 .data          0x0000000000000000        0x0 ./o/cpuinit.o
 .bss           0x0000000000000000        0x0 ./o/cpuinit.o
 .text          0x0000000000000000        0x0 ./o/flop.o
 .data          0x0000000000000000        0x0 ./o/flop.o
 .bss           0x0000000000000000        0x2 ./o/flop.o
 .text.SetFlop  0x0000000000000000       0x30 ./o/flop.o
 .text.TestFlop
                0x0000000000000000       0x38 ./o/flop.o
 .debug_info    0x0000000000000000      0x103 ./o/flop.o
 .debug_abbrev  0x0000000000000000       0x9d ./o/flop.o
 .debug_loc     0x0000000000000000       0xb8 ./o/flop.o
 .debug_aranges
                0x0000000000000000       0x28 ./o/flop.o
 .debug_ranges  0x0000000000000000       0x18 ./o/flop.o
 .debug_line    0x0000000000000000       0xa6 ./o/flop.o
 .debug_str     0x0000000000000000      0x145 ./o/flop.o
 .comment       0x0000000000000000       0x32 ./o/flop.o
 .debug_frame   0x0000000000000000       0x60 ./o/flop.o
 .ARM.attributes
                0x0000000000000000       0x33 ./o/flop.o
 .text          0x0000000000000000        0x0 ./o/misc.o
 .data          0x0000000000000000        0x0 ./o/misc.o
 .bss           0x0000000000000000        0x0 ./o/misc.o
 .text.NVIC_PriorityGroupConfig
                0x0000000000000000       0x24 ./o/misc.o
 .text.NVIC_SetVectorTable
                0x0000000000000000       0x2c ./o/misc.o
 .text.NVIC_SystemLPConfig
                0x0000000000000000       0x40 ./o/misc.o
 .text.SysTick_CLKSourceConfig
                0x0000000000000000       0x38 ./o/misc.o
 .text          0x0000000000000000        0x0 ./o/main.o
 .data          0x0000000000000000        0x0 ./o/main.o
 .bss           0x0000000000000000        0x3 ./o/main.o
 .rodata        0x0000000000000000       0x11 ./o/main.o
 .text          0x0000000000000000        0x0 ./o/stm32f10x_tim.o
 .data          0x0000000000000000        0x0 ./o/stm32f10x_tim.o
 .bss           0x0000000000000000        0x0 ./o/stm32f10x_tim.o
 .text.TIM_DeInit
                0x0000000000000000      0x22c ./o/stm32f10x_tim.o
 .text.TIM_OC1Init
                0x0000000000000000      0x118 ./o/stm32f10x_tim.o
 .text.TIM_OC2Init
                0x0000000000000000      0x110 ./o/stm32f10x_tim.o
 .text.TIM_OC3Init
                0x0000000000000000      0x10c ./o/stm32f10x_tim.o
 .text.TIM_OC4Init
                0x0000000000000000       0xd0 ./o/stm32f10x_tim.o
 .text.TIM_PWMIConfig
                0x0000000000000000       0xb8 ./o/stm32f10x_tim.o
 .text.TIM_BDTRConfig
                0x0000000000000000       0x4e ./o/stm32f10x_tim.o
 .text.TIM_TimeBaseStructInit
                0x0000000000000000       0x32 ./o/stm32f10x_tim.o
 .text.TIM_OCStructInit
                0x0000000000000000       0x42 ./o/stm32f10x_tim.o
 .text.TIM_ICStructInit
                0x0000000000000000       0x30 ./o/stm32f10x_tim.o
 .text.TIM_BDTRStructInit
                0x0000000000000000       0x3c ./o/stm32f10x_tim.o
 .text.TIM_CtrlPWMOutputs
                0x0000000000000000       0x4a ./o/stm32f10x_tim.o
 .text.TIM_GenerateEvent
                0x0000000000000000       0x1c ./o/stm32f10x_tim.o
 .text.TIM_DMAConfig
                0x0000000000000000       0x28 ./o/stm32f10x_tim.o
 .text.TIM_DMACmd
                0x0000000000000000       0x46 ./o/stm32f10x_tim.o
 .text.TIM_InternalClockConfig
                0x0000000000000000       0x22 ./o/stm32f10x_tim.o
 .text.TIM_ITRxExternalClockConfig
                0x0000000000000000       0x2e ./o/stm32f10x_tim.o
 .text.TIM_TIxExternalClockConfig
                0x0000000000000000       0x5c ./o/stm32f10x_tim.o
 .text.TIM_ETRClockMode1Config
                0x0000000000000000       0x5e ./o/stm32f10x_tim.o
 .text.TIM_ETRClockMode2Config
                0x0000000000000000       0x3e ./o/stm32f10x_tim.o
 .text.TIM_ETRConfig
                0x0000000000000000       0x52 ./o/stm32f10x_tim.o
 .text.TIM_PrescalerConfig
                0x0000000000000000       0x26 ./o/stm32f10x_tim.o
 .text.TIM_CounterModeConfig
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_SelectInputTrigger
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_ForcedOC1Config
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_ForcedOC2Config
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_ForcedOC3Config
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_ForcedOC4Config
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_ARRPreloadConfig
                0x0000000000000000       0x3e ./o/stm32f10x_tim.o
 .text.TIM_SelectCOM
                0x0000000000000000       0x3e ./o/stm32f10x_tim.o
 .text.TIM_SelectCCDMA
                0x0000000000000000       0x3e ./o/stm32f10x_tim.o
 .text.TIM_CCPreloadControl
                0x0000000000000000       0x3e ./o/stm32f10x_tim.o
 .text.TIM_OC1PreloadConfig
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_OC2PreloadConfig
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_OC3PreloadConfig
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_OC4PreloadConfig
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_OC1FastConfig
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_OC2FastConfig
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_OC3FastConfig
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_OC4FastConfig
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_ClearOC1Ref
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_ClearOC2Ref
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_ClearOC3Ref
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_ClearOC4Ref
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_OC1PolarityConfig
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_OC1NPolarityConfig
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_OC2PolarityConfig
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_OC2NPolarityConfig
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_OC3PolarityConfig
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_OC3NPolarityConfig
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_OC4PolarityConfig
                0x0000000000000000       0x3a ./o/stm32f10x_tim.o
 .text.TIM_CCxCmd
                0x0000000000000000       0x54 ./o/stm32f10x_tim.o
 .text.TIM_CCxNCmd
                0x0000000000000000       0x54 ./o/stm32f10x_tim.o
 .text.TIM_SelectOCxM
                0x0000000000000000       0xac ./o/stm32f10x_tim.o
 .text.TIM_UpdateDisableConfig
                0x0000000000000000       0x3e ./o/stm32f10x_tim.o
 .text.TIM_UpdateRequestConfig
                0x0000000000000000       0x3e ./o/stm32f10x_tim.o
 .text.TIM_SelectHallSensor
                0x0000000000000000       0x3e ./o/stm32f10x_tim.o
 .text.TIM_SelectOnePulseMode
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_SelectOutputTrigger
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_SelectSlaveMode
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_SelectMasterSlaveMode
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_SetCounter
                0x0000000000000000       0x1c ./o/stm32f10x_tim.o
 .text.TIM_SetAutoreload
                0x0000000000000000       0x1c ./o/stm32f10x_tim.o
 .text.TIM_SetCompare1
                0x0000000000000000       0x1c ./o/stm32f10x_tim.o
 .text.TIM_SetCompare2
                0x0000000000000000       0x1c ./o/stm32f10x_tim.o
 .text.TIM_SetCompare3
                0x0000000000000000       0x1c ./o/stm32f10x_tim.o
 .text.TIM_SetCompare4
                0x0000000000000000       0x1e ./o/stm32f10x_tim.o
 .text.TIM_SetClockDivision
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_GetCapture1
                0x0000000000000000       0x18 ./o/stm32f10x_tim.o
 .text.TIM_GetCapture2
                0x0000000000000000       0x18 ./o/stm32f10x_tim.o
 .text.TIM_GetCapture3
                0x0000000000000000       0x18 ./o/stm32f10x_tim.o
 .text.TIM_GetCapture4
                0x0000000000000000       0x1a ./o/stm32f10x_tim.o
 .text.TIM_GetCounter
                0x0000000000000000       0x18 ./o/stm32f10x_tim.o
 .text.TIM_GetPrescaler
                0x0000000000000000       0x18 ./o/stm32f10x_tim.o
 .text.TIM_GetFlagStatus
                0x0000000000000000       0x36 ./o/stm32f10x_tim.o
 .text.TIM_ClearFlag
                0x0000000000000000       0x20 ./o/stm32f10x_tim.o
 .text.TIM_GetITStatus
                0x0000000000000000       0x52 ./o/stm32f10x_tim.o
 .text          0x0000000000000000        0x0 ./o/stm32f10x_gpio.o
 .data          0x0000000000000000        0x0 ./o/stm32f10x_gpio.o
 .bss           0x0000000000000000        0x0 ./o/stm32f10x_gpio.o
 .text.GPIO_DeInit
                0x0000000000000000       0xe4 ./o/stm32f10x_gpio.o
 .text.GPIO_AFIODeInit
                0x0000000000000000       0x18 ./o/stm32f10x_gpio.o
 .text.GPIO_StructInit
                0x0000000000000000       0x26 ./o/stm32f10x_gpio.o
 .text.GPIO_ReadInputDataBit
                0x0000000000000000       0x32 ./o/stm32f10x_gpio.o
 .text.GPIO_ReadInputData
                0x0000000000000000       0x18 ./o/stm32f10x_gpio.o
 .text.GPIO_ReadOutputDataBit
                0x0000000000000000       0x32 ./o/stm32f10x_gpio.o
 .text.GPIO_ReadOutputData
                0x0000000000000000       0x18 ./o/stm32f10x_gpio.o
 .text.GPIO_SetBits
                0x0000000000000000       0x1c ./o/stm32f10x_gpio.o
 .text.GPIO_ResetBits
                0x0000000000000000       0x1c ./o/stm32f10x_gpio.o
 .text.GPIO_Write
                0x0000000000000000       0x1c ./o/stm32f10x_gpio.o
 .text.GPIO_PinLockConfig
                0x0000000000000000       0x42 ./o/stm32f10x_gpio.o
 .text.GPIO_EventOutputConfig
                0x0000000000000000       0x4c ./o/stm32f10x_gpio.o
 .text.GPIO_EventOutputCmd
                0x0000000000000000       0x20 ./o/stm32f10x_gpio.o
 .text.GPIO_EXTILineConfig
                0x0000000000000000       0x84 ./o/stm32f10x_gpio.o
 .text.GPIO_ETH_MediaInterfaceConfig
                0x0000000000000000       0x1c ./o/stm32f10x_gpio.o
 .text          0x0000000000000000       0x14 ./o/startup.o
 .data          0x0000000000000000        0x0 ./o/startup.o
 .bss           0x0000000000000000        0x0 ./o/startup.o

Memory Configuration

Name             Origin             Length             Attributes
RAM              0x0000000020000000 0x0000000000010000 xrw
FLASH            0x0000000008000000 0x0000000000040000 xr
*default*        0x0000000000000000 0xffffffffffffffff

Linker script and memory map

                0x0000000000000400                __Stack_Size = 0x400
                [!provide]                        PROVIDE (_Stack_Size, __Stack_Size)
                0x000000002000fc00                __Stack_Init = (_estack - __Stack_Size)
                [!provide]                        PROVIDE (_Stack_Init, __Stack_Init)
                0x0000000000000100                _Minimum_Stack_Size = 0x100
                0x0000000020010000                _estack = 0x20010000

.isr_vector     0x0000000008000000      0x1e4
                0x0000000008000000                . = ALIGN (0x4)
 *(.isr_vector)
 .isr_vector    0x0000000008000000      0x1e4 ./o/startup.o
                0x0000000008000000                g_pfnVectors
                0x00000000080001e4                . = ALIGN (0x4)

.text           0x00000000080001e4     0x13c4
                0x00000000080001e4                . = ALIGN (0x4)
 *(.text)
 *(.text.*)
 .text.DAC_Init
                0x00000000080001e4       0x64 ./o/stm32f10x_dac.o
                0x00000000080001e4                DAC_Init
 .text.DAC_Cmd  0x0000000008000248       0x48 ./o/stm32f10x_dac.o
                0x0000000008000248                DAC_Cmd
 .text.DAC_SoftwareTriggerCmd
                0x0000000008000290       0x4c ./o/stm32f10x_dac.o
                0x0000000008000290                DAC_SoftwareTriggerCmd
 .text.DAC_SetChannel1Data
                0x00000000080002dc       0x34 ./o/stm32f10x_dac.o
                0x00000000080002dc                DAC_SetChannel1Data
 .text.RCC_DeInit
                0x0000000008000310       0x70 ./o/stm32f10x_rcc.o
                0x0000000008000310                RCC_DeInit
 .text.RCC_HSEConfig
                0x0000000008000380       0x5c ./o/stm32f10x_rcc.o
                0x0000000008000380                RCC_HSEConfig
 .text.RCC_WaitForHSEStartUp
                0x00000000080003dc       0x50 ./o/stm32f10x_rcc.o
                0x00000000080003dc                RCC_WaitForHSEStartUp
 .text.RCC_PLLConfig
                0x000000000800042c       0x3c ./o/stm32f10x_rcc.o
                0x000000000800042c                RCC_PLLConfig
 .text.RCC_PLLCmd
                0x0000000008000468       0x20 ./o/stm32f10x_rcc.o
                0x0000000008000468                RCC_PLLCmd
 .text.RCC_PREDIV1Config
                0x0000000008000488       0x40 ./o/stm32f10x_rcc.o
                0x0000000008000488                RCC_PREDIV1Config
 .text.RCC_SYSCLKConfig
                0x00000000080004c8       0x38 ./o/stm32f10x_rcc.o
                0x00000000080004c8                RCC_SYSCLKConfig
 .text.RCC_GetSYSCLKSource
                0x0000000008000500       0x1c ./o/stm32f10x_rcc.o
                0x0000000008000500                RCC_GetSYSCLKSource
 .text.RCC_HCLKConfig
                0x000000000800051c       0x38 ./o/stm32f10x_rcc.o
                0x000000000800051c                RCC_HCLKConfig
 .text.RCC_PCLK1Config
                0x0000000008000554       0x38 ./o/stm32f10x_rcc.o
                0x0000000008000554                RCC_PCLK1Config
 .text.RCC_PCLK2Config
                0x000000000800058c       0x38 ./o/stm32f10x_rcc.o
                0x000000000800058c                RCC_PCLK2Config
 .text.RCC_ADCCLKConfig
                0x00000000080005c4       0x38 ./o/stm32f10x_rcc.o
                0x00000000080005c4                RCC_ADCCLKConfig
 .text.RCC_AHBPeriphClockCmd
                0x00000000080005fc       0x3c ./o/stm32f10x_rcc.o
                0x00000000080005fc                RCC_AHBPeriphClockCmd
 .text.RCC_APB2PeriphClockCmd
                0x0000000008000638       0x3c ./o/stm32f10x_rcc.o
                0x0000000008000638                RCC_APB2PeriphClockCmd
 .text.RCC_APB1PeriphClockCmd
                0x0000000008000674       0x3c ./o/stm32f10x_rcc.o
                0x0000000008000674                RCC_APB1PeriphClockCmd
 .text.RCC_GetFlagStatus
                0x00000000080006b0       0x74 ./o/stm32f10x_rcc.o
                0x00000000080006b0                RCC_GetFlagStatus
 .text.FLASH_SetLatency
                0x0000000008000724       0x38 ./o/stm32f10x_flash.o
                0x0000000008000724                FLASH_SetLatency
 .text.FLASH_PrefetchBufferCmd
                0x000000000800075c       0x30 ./o/stm32f10x_flash.o
                0x000000000800075c                FLASH_PrefetchBufferCmd
 .text.NVIC_SetPriority
                0x000000000800078c       0x54 ./o/cpuinit.o
 .text.SysTick_Config
                0x00000000080007e0       0x44 ./o/cpuinit.o
 .text.cpuinit  0x0000000008000824      0x268 ./o/cpuinit.o
                0x0000000008000824                cpuinit
 .text.NVIC_Init
                0x0000000008000a8c       0xc4 ./o/misc.o
                0x0000000008000a8c                NVIC_Init
 .text.main     0x0000000008000b50       0x18 ./o/main.o
                0x0000000008000b50                main
 .text.TIM_TimeBaseInit
                0x0000000008000b68       0xf8 ./o/stm32f10x_tim.o
                0x0000000008000b68                TIM_TimeBaseInit
 .text.TIM_ICInit
                0x0000000008000c60       0xa8 ./o/stm32f10x_tim.o
                0x0000000008000c60                TIM_ICInit
 .text.TIM_Cmd  0x0000000008000d08       0x3e ./o/stm32f10x_tim.o
                0x0000000008000d08                TIM_Cmd
 .text.TIM_ITConfig
                0x0000000008000d46       0x46 ./o/stm32f10x_tim.o
                0x0000000008000d46                TIM_ITConfig
 .text.TIM_EncoderInterfaceConfig
                0x0000000008000d8c       0x96 ./o/stm32f10x_tim.o
                0x0000000008000d8c                TIM_EncoderInterfaceConfig
 .text.TIM_SetIC1Prescaler
                0x0000000008000e22       0x36 ./o/stm32f10x_tim.o
                0x0000000008000e22                TIM_SetIC1Prescaler
 .text.TIM_SetIC2Prescaler
                0x0000000008000e58       0x3a ./o/stm32f10x_tim.o
                0x0000000008000e58                TIM_SetIC2Prescaler
 .text.TIM_SetIC3Prescaler
                0x0000000008000e92       0x36 ./o/stm32f10x_tim.o
                0x0000000008000e92                TIM_SetIC3Prescaler
 .text.TIM_SetIC4Prescaler
                0x0000000008000ec8       0x3a ./o/stm32f10x_tim.o
                0x0000000008000ec8                TIM_SetIC4Prescaler
 .text.TIM_ClearITPendingBit
                0x0000000008000f02       0x20 ./o/stm32f10x_tim.o
                0x0000000008000f02                TIM_ClearITPendingBit
 *fill*         0x0000000008000f22        0x2 
 .text.TI1_Config
                0x0000000008000f24       0xe0 ./o/stm32f10x_tim.o
 .text.TI2_Config
                0x0000000008001004       0xf4 ./o/stm32f10x_tim.o
 .text.TI3_Config
                0x00000000080010f8       0xec ./o/stm32f10x_tim.o
 .text.TI4_Config
                0x00000000080011e4       0xf8 ./o/stm32f10x_tim.o
 .text.GPIO_Init
                0x00000000080012dc      0x178 ./o/stm32f10x_gpio.o
                0x00000000080012dc                GPIO_Init
 .text.GPIO_WriteBit
                0x0000000008001454       0x2e ./o/stm32f10x_gpio.o
                0x0000000008001454                GPIO_WriteBit
 *fill*         0x0000000008001482        0x2 
 .text.GPIO_PinRemapConfig
                0x0000000008001484       0xe0 ./o/stm32f10x_gpio.o
                0x0000000008001484                GPIO_PinRemapConfig
 .text.Reset_Handler
                0x0000000008001564       0x40 ./o/startup.o
                0x0000000008001564                Reset_Handler
 .text.Default_Handler
                0x00000000080015a4        0x2 ./o/startup.o
                0x00000000080015a4                EXTI2_IRQHandler
                0x00000000080015a4                DebugMon_Handler
                0x00000000080015a4                TIM1_CC_IRQHandler
                0x00000000080015a4                HardFault_Handler
                0x00000000080015a4                TIM6_IRQHandler
                0x00000000080015a4                SysTick_Handler
                0x00000000080015a4                PVD_IRQHandler
                0x00000000080015a4                PendSV_Handler
                0x00000000080015a4                NMI_Handler
                0x00000000080015a4                CAN2_RX1_IRQHandler
                0x00000000080015a4                EXTI3_IRQHandler
                0x00000000080015a4                EXTI0_IRQHandler
                0x00000000080015a4                I2C2_EV_IRQHandler
                0x00000000080015a4                CAN1_RX0_IRQHandler
                0x00000000080015a4                UsageFault_Handler
                0x00000000080015a4                CAN2_SCE_IRQHandler
                0x00000000080015a4                ADC1_2_IRQHandler
                0x00000000080015a4                SPI1_IRQHandler
                0x00000000080015a4                TAMPER_IRQHandler
                0x00000000080015a4                CAN2_RX0_IRQHandler
                0x00000000080015a4                DMA2_Channel2_IRQHandler
                0x00000000080015a4                DMA1_Channel4_IRQHandler
                0x00000000080015a4                USART3_IRQHandler
                0x00000000080015a4                RTC_IRQHandler
                0x00000000080015a4                DMA1_Channel7_IRQHandler
                0x00000000080015a4                CAN1_RX1_IRQHandler
                0x00000000080015a4                UART5_IRQHandler
                0x00000000080015a4                TIM4_IRQHandler
                0x00000000080015a4                DMA2_Channel1_IRQHandler
                0x00000000080015a4                I2C1_EV_IRQHandler
                0x00000000080015a4                DMA1_Channel6_IRQHandler
                0x00000000080015a4                UART4_IRQHandler
                0x00000000080015a4                DMA2_Channel4_IRQHandler
                0x00000000080015a4                TIM3_IRQHandler
                0x00000000080015a4                RCC_IRQHandler
                0x00000000080015a4                TIM1_TRG_COM_IRQHandler
                0x00000000080015a4                DMA1_Channel1_IRQHandler
                0x00000000080015a4                Default_Handler
                0x00000000080015a4                EXTI15_10_IRQHandler
                0x00000000080015a4                TIM7_IRQHandler
                0x00000000080015a4                CAN2_TX_IRQHandler
                0x00000000080015a4                TIM5_IRQHandler
                0x00000000080015a4                EXTI9_5_IRQHandler
                0x00000000080015a4                ETH_WKUP_IRQHandler
                0x00000000080015a4                SPI2_IRQHandler
                0x00000000080015a4                MemManage_Handler
                0x00000000080015a4                CAN1_TX_IRQHandler
                0x00000000080015a4                SVC_Handler
                0x00000000080015a4                DMA2_Channel5_IRQHandler
                0x00000000080015a4                DMA1_Channel5_IRQHandler
                0x00000000080015a4                EXTI4_IRQHandler
                0x00000000080015a4                DMA1_Channel3_IRQHandler
                0x00000000080015a4                ETH_IRQHandler
                0x00000000080015a4                TIM1_UP_IRQHandler
                0x00000000080015a4                WWDG_IRQHandler
                0x00000000080015a4                TIM2_IRQHandler
                0x00000000080015a4                OTG_FS_WKUP_IRQHandler
                0x00000000080015a4                TIM1_BRK_IRQHandler
                0x00000000080015a4                EXTI1_IRQHandler
                0x00000000080015a4                RTCAlarm_IRQHandler
                0x00000000080015a4                USART2_IRQHandler
                0x00000000080015a4                I2C2_ER_IRQHandler
                0x00000000080015a4                DMA1_Channel2_IRQHandler
                0x00000000080015a4                CAN1_SCE_IRQHandler
                0x00000000080015a4                FLASH_IRQHandler
                0x00000000080015a4                BusFault_Handler
                0x00000000080015a4                USART1_IRQHandler
                0x00000000080015a4                OTG_FS_IRQHandler
                0x00000000080015a4                SPI3_IRQHandler
                0x00000000080015a4                I2C1_ER_IRQHandler
                0x00000000080015a4                DMA2_Channel3_IRQHandler
 *(.rodata)
 *(.rodata*)
 *(.glue_7)
 .glue_7        0x00000000080015a6        0x0 linker stubs
 *(.glue_7t)
 .glue_7t       0x00000000080015a6        0x0 linker stubs
                0x00000000080015a8                . = ALIGN (0x4)
 *fill*         0x00000000080015a6        0x2 
                0x00000000080015a8                _etext = .
                0x00000000080015a8                _sidata = _etext

.vfp11_veneer   0x00000000080015a8        0x0
 .vfp11_veneer  0x00000000080015a8        0x0 linker stubs

.v4_bx          0x00000000080015a8        0x0
 .v4_bx         0x00000000080015a8        0x0 linker stubs

.iplt           0x00000000080015a8        0x0
 .iplt          0x00000000080015a8        0x0 ./o/system_stm32f10x.o

.rel.dyn        0x00000000080015a8        0x0
 .rel.iplt      0x00000000080015a8        0x0 ./o/system_stm32f10x.o

.data           0x0000000020000000        0x0 load address 0x00000000080015a8
                0x0000000020000000                . = ALIGN (0x4)
                0x0000000020000000                _sdata = .
 *(.data)
 *(.data.*)
                0x0000000020000000                . = ALIGN (0x4)
                0x0000000020000000                _edata = .

.igot.plt       0x0000000020000000        0x0
 .igot.plt      0x0000000020000000        0x0 ./o/system_stm32f10x.o

.bss            0x0000000020000000       0x50
                0x0000000020000000                . = ALIGN (0x4)
                0x0000000020000000                _sbss = .
 *(.bss)
 *(COMMON)
 COMMON         0x0000000020000000       0x40 ./o/cpuinit.o
                0x0000000020000000                TIM_BDTRInitStructure
                0x0000000020000010                TIM_TimeBaseStructure
                0x000000002000001c                DAC_InitStructure
                0x000000002000002c                GPIO_InitStructure
                0x0000000020000030                TIM_ICInitStructure
                0x000000002000003c                NVIC_InitStructure
 COMMON         0x0000000020000040       0x10 ./o/main.o
                0x0000000020000040                j
                0x0000000020000044                dbg
                0x0000000020000048                ToTimer
                0x000000002000004c                i
                0x0000000020000050                . = ALIGN (0x4)
                0x0000000020000050                _ebss = .
                [!provide]                        PROVIDE (end, _ebss)
                [!provide]                        PROVIDE (_end, _ebss)

._usrstack      0x0000000020000050      0x100
                0x0000000020000050                . = ALIGN (0x4)
                0x0000000020000050                _susrstack = .
                0x0000000020000150                . = (. + _Minimum_Stack_Size)
 *fill*         0x0000000020000050      0x100 
                0x0000000020000150                . = ALIGN (0x4)
                0x0000000020000150                _eusrstack = .
LOAD ./o/system_stm32f10x.o
LOAD ./o/stm32f10x_dac.o
LOAD ./o/stm32f10x_rcc.o
LOAD ./o/stm32f10x_flash.o
LOAD ./o/cpuinit.o
LOAD ./o/flop.o
LOAD ./o/misc.o
LOAD ./o/main.o
LOAD ./o/stm32f10x_tim.o
LOAD ./o/stm32f10x_gpio.o
LOAD ./o/startup.o
OUTPUT(./o/out.elf elf32-littlearm)

.debug_info     0x0000000000000000     0x52be
 .debug_info    0x0000000000000000      0x513 ./o/stm32f10x_dac.o
 .debug_info    0x0000000000000513      0xb99 ./o/stm32f10x_rcc.o
 .debug_info    0x00000000000010ac      0x868 ./o/stm32f10x_flash.o
 .debug_info    0x0000000000001914      0xc54 ./o/cpuinit.o
 .debug_info    0x0000000000002568      0x55c ./o/misc.o
 .debug_info    0x0000000000002ac4      0x1af ./o/main.o
 .debug_info    0x0000000000002c73     0x1ea2 ./o/stm32f10x_tim.o
 .debug_info    0x0000000000004b15      0x76b ./o/stm32f10x_gpio.o
 .debug_info    0x0000000000005280       0x3e ./o/startup.o

.debug_abbrev   0x0000000000000000      0xc75
 .debug_abbrev  0x0000000000000000      0x18a ./o/stm32f10x_dac.o
 .debug_abbrev  0x000000000000018a      0x1d1 ./o/stm32f10x_rcc.o
 .debug_abbrev  0x000000000000035b      0x1a2 ./o/stm32f10x_flash.o
 .debug_abbrev  0x00000000000004fd      0x1a6 ./o/cpuinit.o
 .debug_abbrev  0x00000000000006a3      0x165 ./o/misc.o
 .debug_abbrev  0x0000000000000808       0xb7 ./o/main.o
 .debug_abbrev  0x00000000000008bf      0x1c5 ./o/stm32f10x_tim.o
 .debug_abbrev  0x0000000000000a84      0x1df ./o/stm32f10x_gpio.o
 .debug_abbrev  0x0000000000000c63       0x12 ./o/startup.o

.debug_loc      0x0000000000000000     0x44e4
 .debug_loc     0x0000000000000000      0x420 ./o/stm32f10x_dac.o
 .debug_loc     0x0000000000000420      0xe68 ./o/stm32f10x_rcc.o
 .debug_loc     0x0000000000001288      0x8f0 ./o/stm32f10x_flash.o
 .debug_loc     0x0000000000001b78       0xd8 ./o/cpuinit.o
 .debug_loc     0x0000000000001c50      0x1cc ./o/misc.o
 .debug_loc     0x0000000000001e1c       0x2c ./o/main.o
 .debug_loc     0x0000000000001e48     0x2060 ./o/stm32f10x_tim.o
 .debug_loc     0x0000000000003ea8      0x63c ./o/stm32f10x_gpio.o

.debug_aranges  0x0000000000000000      0x720
 .debug_aranges
                0x0000000000000000       0x78 ./o/stm32f10x_dac.o
 .debug_aranges
                0x0000000000000078      0x160 ./o/stm32f10x_rcc.o
 .debug_aranges
                0x00000000000001d8       0xf8 ./o/stm32f10x_flash.o
 .debug_aranges
                0x00000000000002d0       0x30 ./o/cpuinit.o
 .debug_aranges
                0x0000000000000300       0x40 ./o/misc.o
 .debug_aranges
                0x0000000000000340       0x20 ./o/main.o
 .debug_aranges
                0x0000000000000360      0x2f0 ./o/stm32f10x_tim.o
 .debug_aranges
                0x0000000000000650       0xa8 ./o/stm32f10x_gpio.o
 .debug_aranges
                0x00000000000006f8       0x28 ./o/startup.o

.debug_ranges   0x0000000000000000      0x698
 .debug_ranges  0x0000000000000000       0x68 ./o/stm32f10x_dac.o
 .debug_ranges  0x0000000000000068      0x150 ./o/stm32f10x_rcc.o
 .debug_ranges  0x00000000000001b8       0xe8 ./o/stm32f10x_flash.o
 .debug_ranges  0x00000000000002a0       0x20 ./o/cpuinit.o
 .debug_ranges  0x00000000000002c0       0x30 ./o/misc.o
 .debug_ranges  0x00000000000002f0       0x10 ./o/main.o
 .debug_ranges  0x0000000000000300      0x2e0 ./o/stm32f10x_tim.o
 .debug_ranges  0x00000000000005e0       0x98 ./o/stm32f10x_gpio.o
 .debug_ranges  0x0000000000000678       0x20 ./o/startup.o

.debug_line     0x0000000000000000     0x1ade
 .debug_line    0x0000000000000000      0x1ce ./o/stm32f10x_dac.o
 .debug_line    0x00000000000001ce      0x46e ./o/stm32f10x_rcc.o
 .debug_line    0x000000000000063c      0x3b3 ./o/stm32f10x_flash.o
 .debug_line    0x00000000000009ef      0x1a8 ./o/cpuinit.o
 .debug_line    0x0000000000000b97      0x12a ./o/misc.o
 .debug_line    0x0000000000000cc1       0xcc ./o/main.o
 .debug_line    0x0000000000000d8d      0xa37 ./o/stm32f10x_tim.o
 .debug_line    0x00000000000017c4      0x2b7 ./o/stm32f10x_gpio.o
 .debug_line    0x0000000000001a7b       0x63 ./o/startup.o

.debug_str      0x0000000000000000     0x2236
 .debug_str     0x0000000000000000      0x338 ./o/stm32f10x_dac.o
                                        0x38b (size before relaxing)
 .debug_str     0x0000000000000338      0x57a ./o/stm32f10x_rcc.o
                                        0x73e (size before relaxing)
 .debug_str     0x00000000000008b2      0x3f4 ./o/stm32f10x_flash.o
                                        0x5c4 (size before relaxing)
 .debug_str     0x0000000000000ca6      0x905 ./o/cpuinit.o
                                        0xb00 (size before relaxing)
 .debug_str     0x00000000000015ab       0xda ./o/misc.o
                                        0x394 (size before relaxing)
 .debug_str     0x0000000000001685       0x3c ./o/main.o
                                        0x1aa (size before relaxing)
 .debug_str     0x00000000000016c1      0x95e ./o/stm32f10x_tim.o
                                        0xdb9 (size before relaxing)
 .debug_str     0x000000000000201f      0x217 ./o/stm32f10x_gpio.o
                                        0x4f5 (size before relaxing)

.comment        0x0000000000000000       0x31
 .comment       0x0000000000000000       0x31 ./o/stm32f10x_dac.o
                                         0x32 (size before relaxing)
 .comment       0x0000000000000031       0x32 ./o/stm32f10x_rcc.o
 .comment       0x0000000000000031       0x32 ./o/stm32f10x_flash.o
 .comment       0x0000000000000031       0x32 ./o/cpuinit.o
 .comment       0x0000000000000031       0x32 ./o/misc.o
 .comment       0x0000000000000031       0x32 ./o/main.o
 .comment       0x0000000000000031       0x32 ./o/stm32f10x_tim.o
 .comment       0x0000000000000031       0x32 ./o/stm32f10x_gpio.o

.ARM.attributes
                0x0000000000000000       0x31
 .ARM.attributes
                0x0000000000000000       0x33 ./o/stm32f10x_dac.o
 .ARM.attributes
                0x0000000000000033       0x33 ./o/stm32f10x_rcc.o
 .ARM.attributes
                0x0000000000000066       0x33 ./o/stm32f10x_flash.o
 .ARM.attributes
                0x0000000000000099       0x33 ./o/cpuinit.o
 .ARM.attributes
                0x00000000000000cc       0x33 ./o/misc.o
 .ARM.attributes
                0x00000000000000ff       0x33 ./o/main.o
 .ARM.attributes
                0x0000000000000132       0x33 ./o/stm32f10x_tim.o
 .ARM.attributes
                0x0000000000000165       0x33 ./o/stm32f10x_gpio.o
 .ARM.attributes
                0x0000000000000198       0x21 ./o/startup.o

.debug_frame    0x0000000000000000     0x1ec8
 .debug_frame   0x0000000000000000      0x1e4 ./o/stm32f10x_dac.o
 .debug_frame   0x00000000000001e4      0x65c ./o/stm32f10x_rcc.o
 .debug_frame   0x0000000000000840      0x410 ./o/stm32f10x_flash.o
 .debug_frame   0x0000000000000c50       0x78 ./o/cpuinit.o
 .debug_frame   0x0000000000000cc8       0xd8 ./o/misc.o
 .debug_frame   0x0000000000000da0       0x2c ./o/main.o
 .debug_frame   0x0000000000000dcc      0xe2c ./o/stm32f10x_tim.o
 .debug_frame   0x0000000000001bf8      0x2d0 ./o/stm32f10x_gpio.o

von Nop (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Niklas G. schrieb:

> Das ist falsch. Das ist der erwähnte Fehler aus dem ST-Linkerscript.

Merkwürdig, so ähnlich funktioniert das bei mir problemlos. Ich habe 
nach den Text-Segmenten (allerdings nicht IM Textsegment) ein etext auf 
die dort angelangte Adresse, und .data hat dann das AT auf dieses etext.

Vereinfacht so:
SECTIONS
{
  .text :
  {
    *(.text*)
    . = ALIGN(4);  
    *(.rodata*)

  } > FLASH 
  
  . = ALIGN(4);
  _etext = .;
  
  .data : AT (_etext)
  {
    . = ALIGN(4);
    _start_of_data = .;
    *(.data*)
    . = ALIGN(4);
    _end_of_data = .;
  } > RAM 
  
  .bss :
  {
    . = ALIGN(4);
    *(.bss*)
    *(COMMON)
    . = ALIGN(4);
  } > RAM 
}

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
Niklas G. schrieb:
>
> Mit "nm test.elf" kann man feststellen, in welche Section die Symbole
> gepackt wurden. Wenn man also z.B.
>
volatile int foo = 42;
> volatile int bar = 0;
> kompiliert, kommt
>
00000000 d $d
> 00000000 b $d
> 00000000 B bar
> 00000000 D foo
> heraus - das "D" gibt an, dass "foo" in ".data" ist, und das "B" zeigt
> dass "bar" in ".bss" ist.

Na da ist doch eine einfache Erklärung zu sehen. Initialisierung mit 0 
wird eben nicht mit 4x0-Byte ins .data geschrieben, denn ins .bss 
gepackt kann man sich diese 4Byte sparen.

Ich gebe zu, meine Vermutung war komplizierter als nötig, aber da wir 
nicht wissen, ob der TO mit 0 oder !=0 initialisiert hat, wissen wir 
auch nicht, ob die simple Erklärung "nicht wegen volatile, sonder wegen 
=0" ausreicht.

von Bauform B. (bauformb)


Bewertung
0 lesenswert
nicht lesenswert
Niklas G. schrieb:
> Bauform B. schrieb:
>> selbst definierte sections sollen mit einem Buchstaben
>> beginnen.
>
> Hast du dafür eine Quelle?

Hier https://refspecs.linuxfoundation.org/ gibt's den/die
Tool Interface Standard (TIS)
Executable and Linking Format (ELF) Specification
Version 1.2, TIS Committee May 1995
<<This appears to be the most current TIS specification.>>
Special Sections
  Various sections in ELF are pre-defined and hold program and control
  information.
(...)
  .bss   This section holds uninitialized data that contribute to the
         program's memory image. By definition, the system initializes
         the data with zeros when the program begins to run.
(...)
  .text  This section holds the "text,'' or executable instructions,
         of a program.

  Section names with a dot (.) prefix are reserved for the system,
  although applications may use these sections if their existing
  meanings are satisfactory. Applications may use names without the
  prefix to avoid conflicts with system sections. The object file
  format lets one define sections not in the list above. An object
  file may have more than one section with the same name.

von J. V. (janvi)


Bewertung
0 lesenswert
nicht lesenswert
Was ich vom map File verstehe/vermute:

Zu den "discarded input sections" ist alles unrelevant bzw. sind das 
Teile der Periph-Lib welche weggeworfen werden da unbenutzt. Weil das 
kein Archiv ist braucht man dazu die Schalter --function-sections und 
für den Linker -gc-sections.

Ab "Linker Skript and Memory Map" wirds dann interessanter. Nach Section 
und Funktionsnamen steht in der ersten Spalte die Anfangsadresse und in 
der zweiten die Länge. Warum dann der gleiche Funktionsname nochmal?

Alle .debug Zeilen sind vermutlich nur mit gdb auszuwerten und für mich 
daher unrelevant bzw. die Informationen besser über ELF und Quellen 
erhältlich.

Eine Gesamtübersicht der Speicherbelegung bzw. Code und Ram Längen sehe 
ich genausowenig wie _sdata _edata

: Bearbeitet durch User
von Nop (Gast)


Bewertung
0 lesenswert
nicht lesenswert
J. V. schrieb:
> genausowenig wie _sdata _edata

Steht doch da, mach einfach eine Volltextsuche im Mapfile:
0x0000000020000000                _sdata = .
...
0x0000000020000000                _edata = .

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Janvi schrieb:
> 0x0000000020000000                . = ALIGN (0x4)
>                 0x0000000020000000                _sdata = .
>  *(.data)
>  *(.data.*)
>                 0x0000000020000000                . = ALIGN (0x4)
>                 0x0000000020000000                _edata = .
>
> .igot.plt       0x0000000020000000        0x0
>  .igot.plt      0x0000000020000000        0x0 ./o/system_stm32f10x.o
>
> .bss            0x0000000020000000       0x50
>                 0x0000000020000000                . = ALIGN (0x4)
>                 0x0000000020000000                _sbss = .
>  *(.bss)
>  *(COMMON)
>  COMMON         0x0000000020000000       0x40 ./o/cpuinit.o
>                 0x0000000020000000                TIM_BDTRInitStructure
>                 0x0000000020000010                TIM_TimeBaseStructure
>                 0x000000002000001c                DAC_InitStructure
>                 0x000000002000002c                GPIO_InitStructure
>                 0x0000000020000030                TIM_ICInitStructure
>                 0x000000002000003c                NVIC_InitStructure
>  COMMON         0x0000000020000040       0x10 ./o/main.o
>                 0x0000000020000040                j
>                 0x0000000020000044                dbg
>                 0x0000000020000048                ToTimer
>                 0x000000002000004c                i
>                 0x0000000020000050                . = ALIGN (0x4)
>                 0x0000000020000050                _ebss = .

Das hier sieht tatsächlich so aus als würden die Variablen in .bss 
landen. Um welche Variable geht es denn genau? Zeig doch mal deren 
Definition. Zeig auch mal die Ausgabe von "nm" angewendet auf die 
Programm-ELF und die relevante .o-Datei.

Nop schrieb:
> Merkwürdig, so ähnlich funktioniert das bei mir problemlos.

Ah, ja je nach Verteilung der "ALIGN" geht es doch. Wenn man so etwas 
hat:

Nop schrieb:
>   _etext = .;
>
>   .data : AT (_etext)
>   {
>     . = ALIGN(4);
>     _start_of_data = .;

Dann zeigt _etext an den Anfang des RAM-Abbilds im Flash, aber dann 
kommen ggf. noch erst 1-3 Bytes Padding, während _start_of_data auf 
nach das Padding im RAM zeigt. Wenn man jetzt einfach so etwas wie 
"memcpy(_start_of_data, _etext, ...)" macht, kopiert man die "leeren" 
Padding-Bytes in die Variablen hinein. In deinem Fall tritt das nicht 
auf, weil davor nochmal ein "ALIGN" steht und das ALIGN am Anfang von 
".data" somit wirkungslos ist.
Man muss also sehr genau aufpassen welche Symbole auf was gesetzt sind 
und wo das Padding hinkommt. Ich finde es daher besser, das Align vor 
das ".data" zu machen und "LOADADDR" zu verwenden, damit sich alle 
Symbole auf die Adressen nach den Padding-Bytes beziehen.

Aber anscheinend ist das hier doch nicht das Problem, weil die Variablen 
wirklich nicht in ".data" landen.

Carl D. schrieb:
> Na da ist doch eine einfache Erklärung zu sehen. Initialisierung mit 0
> wird eben nicht mit 4x0-Byte ins .data geschrieben, denn ins .bss
> gepackt kann man sich diese 4Byte sparen.

Ja natürlich, darum geht es ja die ganze Zeit. Aber angeblich (wir 
wissen es nicht) ist die Variable ja eben nicht mit 0 definiert.

Bauform B. schrieb:
> Section names with a dot (.) prefix are reserved for the system,

Ich denke das bezieht sich darauf, wenn man ein Betriebssystem mit 
vordefiniertem Linkerscript verwendet. Da man mit eigenem Linkerscript + 
Startup-Code aber seine eigene Laufzeit-Umgebung baut, ist es 
unproblematisch hier eigene Section-Namen mit "." zu definieren. Damit 
hatte ich bisher keine Probleme... Man könnte auch in der Programm-ELF 
die Standard-Namen ".data" anders benutzen als üblich - nicht besonders 
wartbar, aber da es kein OS gibt was bestimmte Namen erwartet kann da 
eigentlich nicht viel schiefgehen. In den ".o" Files hingegen wäre das 
nicht so clever, weil es dann mit den vom Compiler genutzten Namen 
kollidiert.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Janvi schrieb:

> Soweit ich das mal gehört habe ist .text eben für den Code und .bss
> bedeute BaSeSegment und .daten sind eben für die Daten.

"block starting symbols"

So muss mal historisch eine entsprechende Assembler-Anweisung auf gaaanz 
alten IBM-Systemen gehießen haben, und seither heißt diese section halt 
so. ;-)

> … glaube mal irgendwo gehört zu haben, daß dies
> ein Relikt aus älteren Architekturen ist wo es eine Kurzadressierung
> fürs RAM gibt.

Definitiv nicht.

Carl D. schrieb:
> Na da ist doch eine einfache Erklärung zu sehen. Initialisierung mit 0
> wird eben nicht mit 4x0-Byte ins .data geschrieben, denn ins .bss
> gepackt kann man sich diese 4Byte sparen.

Bei sehr alten GCCs (ich glaube bis Version 2.x) war es tatsächlich so, 
dass
int foo = 0;

in .data landete und
int foo;

in .bss (beide natürlich auf globalem Niveau bzw. static). Das wurde 
danach aufgegeben, nun sind beide äquivalent, und alles was 0 ist, 
landet in .bss.

von Janvi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Besten Dank an Niklas für die richtige Antwort. Es funktioniert so wie
erwartet.

Summa Summarum hat .data in all meinen Programmen viele Jahre nicht
funktioniert. Dazu gab es weder eine Warnung noch irgendwelche Fehler 
(never
trust the IDE). Ich glaube der Teil des scripts stammt ursprünglich 
nicht von Cube sondern von der Hitex Hitop IDE welche zwischenzeitlich 
zu Recht nur noch unter "Legacy Products" aufgeführt ist. Selbst hab ich 
mir das nicht ausgedacht.
Das es nicht aufgefallen ist, liegt daran daß ich als Assembler 
Programmierer gewohnt bin selbst Code anzugeben wenn eine Variable 
initialsiert sein soll. Das merkt man sich  automatisch, wenn man mal 
Zeit damit verbracht hat in anderen Projekten Fehler zu suchen. Die 
Fertigung beanstandet dabei, daß ein Projekt nicht mehr funktioniert 
seit der RAM Baustein vom Hersteller X eingesetzt wird obwohl der 
vollständig kompatibel zum bisherigen vom Hersteller Y sein sollte. Das 
ist vielleicht auch nur manchmal so ...

Als Nebeneffekt habe ich gelernt, daß ein Compiler nicht zwischen
initialisierten und nicht initialsierten Daten sondern zwischen solchen 
die
mit 0 und solchen die mit anderen Daten initialisiert werden sollen
unterscheidet.

von Markus F. (mfro)


Bewertung
0 lesenswert
nicht lesenswert
Janvi schrieb:
> Als Nebeneffekt habe ich gelernt, daß ein Compiler nicht zwischen
> initialisierten und nicht initialsierten Daten sondern zwischen solchen
> die
> mit 0 und solchen die mit anderen Daten initialisiert werden sollen
> unterscheidet.

eigentlich sind für den Compiler alle globalen Variablen 
initialisiert.

Die, die's nicht (explizit) sind, eben (implizit) mit 0.

Und die, die mit 0 initialisiert werden, "nullt" der Startupcode in 
einem Rutsch über's .bss-Segment.

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Janvi schrieb:
> Besten Dank an Niklas für die richtige Antwort. Es funktioniert so wie
> erwartet.

Äh, was war es denn jetzt genau?

Janvi schrieb:
> Das es nicht aufgefallen ist, liegt daran daß ich als Assembler
> Programmierer gewohnt bin selbst Code anzugeben wenn eine Variable
> initialsiert sein soll.

Selbst da muss das eigentlich nicht. Wie z.B. hier gezeigt, kann man 
sich in Assembler globale Variablen auf exakt die gleiche Art und Weise 
initialisieren lassen:

https://www.mikrocontroller.net/articles/ARM-ASM-Tutorial#Initializing_RAM

Eine solche memcpy-artige-Schleife dürfte auch effizienter (In Sachen 
Geschwindigkeit und Flash) sein als manuelles Initialisieren jeder 
Variablen. Nur bei großen Datenstrukturen mit generierbaren Inhalten 
(z.B. ein Array wo jedes Element den gleichen Wert != 0 hat) trifft das 
nicht zu.

von Nop (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Niklas G. schrieb:
> Nop schrieb:
>> Merkwürdig, so ähnlich funktioniert das bei mir problemlos.
>
> Ah, ja je nach Verteilung der "ALIGN" geht es doch.

Ja, ich hab da überall das align stehen, damit ich im Startup die 
Kopierschleife in Assembler einfach auf 32bit-Worte machen kann. 
Deswegen auch am Ende von Data nochmal, weil ich dann zwar 0-3 Padbytes 
aus dem Flash mitkopiere, die aber nichts ausmachen, weil die im RAM ja 
genauso reserviert werden, ohne daß sie mir ins zu nullende BSS 
reinragen.

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Nop schrieb:
> Ja, ich hab da überall das align stehen, damit ich im Startup die
> Kopierschleife in Assembler einfach auf 32bit-Worte machen kann.

Logisch, so machen das alle. Aber im Prinzip ist eines der beiden Aligns 
(vor .data und am Anfang von .data) überflüssig, aber wenn man eines 
entfernt kann der besagte Fehler auftreten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.