1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-11-30 08:24:11 +01:00
LibrePilot/flight/PiOS/STM32F10x/link_STM32103CB_CC_Rev1_sections.ld

162 lines
4.5 KiB
Plaintext
Raw Normal View History

OP-423 do the arch specific stuff (in reset vector) to hide this from portable code: - switch back to MSP stack before starting the scheduler so that the sheduler can use the IRQ stack (when/if needed). - call the C portable function in heap1 to claim some stack back (the number to claim is taken from linker file). - start the scheduler from reset vector (I move this here from main because it make sense to not go back to C (so that I don't need to copy the rolled stack in case the sheduler returns). This make it more clean. - Also I have added the call to the mem manager if sheduler return. that way, we don't reset indefinitely if memory runs out. We will go to this handler and figure things out (right now, it's just looping but at least not rebooting. Probably trap NMI would be better (later improvement). The part missing for this part is the weak attribute for the function in heap1.c so that we don't have to update everything with empty stub. I think the weak atrribute for C function called in assembly is arch dependent so I am not sure if this is possible (will look into it, maybe somebody outthere nows). Right now, it's heap1 dependent and won't work with heap2. I will clean that up the next couple of days. I did some test and it looks good. this is without init code re-organization so we don't free as much as we will be it's good starts. This compile with sim_posix (since it does not affect portable code) so this is really clean. I only tested this with CC. I will port it for OP when I will work on heap2.
2011-06-14 06:49:17 +02:00
/* This is the size of the stack for all FreeRTOS IRQs */
_irq_stack_size = 0x180;
OP-423 do the arch specific stuff (in reset vector) to hide this from portable code: - switch back to MSP stack before starting the scheduler so that the sheduler can use the IRQ stack (when/if needed). - call the C portable function in heap1 to claim some stack back (the number to claim is taken from linker file). - start the scheduler from reset vector (I move this here from main because it make sense to not go back to C (so that I don't need to copy the rolled stack in case the sheduler returns). This make it more clean. - Also I have added the call to the mem manager if sheduler return. that way, we don't reset indefinitely if memory runs out. We will go to this handler and figure things out (right now, it's just looping but at least not rebooting. Probably trap NMI would be better (later improvement). The part missing for this part is the weak attribute for the function in heap1.c so that we don't have to update everything with empty stub. I think the weak atrribute for C function called in assembly is arch dependent so I am not sure if this is possible (will look into it, maybe somebody outthere nows). Right now, it's heap1 dependent and won't work with heap2. I will clean that up the next couple of days. I did some test and it looks good. this is without init code re-organization so we don't free as much as we will be it's good starts. This compile with sim_posix (since it does not affect portable code) so this is really clean. I only tested this with CC. I will port it for OP when I will work on heap2.
2011-06-14 06:49:17 +02:00
/* This is the size of the stack for early init: life span is until scheduler starts */
_init_stack_size = 0x100;
/* Stub out these functions since we don't use them anyway */
PROVIDE ( vPortSVCHandler = 0 ) ;
PROVIDE ( xPortPendSVHandler = 0 ) ;
PROVIDE ( xPortSysTickHandler = 0 ) ;
PROVIDE(pios_board_info_blob = ORIGIN(BD_INFO));
/* Section Definitions */
SECTIONS
{
.text :
{
PROVIDE (pios_isr_vector_table_base = .);
KEEP(*(.isr_vector .isr_vector.*))
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)
*(.rodata .rodata* .gnu.linkonce.r.*)
} > FLASH
/* init sections */
.initcalluavobj.init :
{
. = ALIGN(4);
__uavobj_initcall_start = .;
KEEP(*(.initcalluavobj.init))
. = ALIGN(4);
__uavobj_initcall_end = .;
} >FLASH
/* module sections */
.initcallmodule.init :
{
. = ALIGN(4);
__module_initcall_start = .;
KEEP(*(.initcallmodule.init))
. = ALIGN(4);
__module_initcall_end = .;
} >FLASH
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > FLASH
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > FLASH
. = ALIGN(4);
_etext = .;
_sidata = .;
/*
* This stack is used both as the initial sp during early init as well as ultimately
* being used as the STM32's MSP (Main Stack Pointer) which is the same stack that
* is used for _all_ interrupt handlers. The end of this stack should be placed
* against the lowest address in RAM so that a stack overrun results in a hard fault
* at the first access beyond the end of the stack.
*/
.irq_stack :
{
. = ALIGN(4);
_irq_stack_end = . ;
. = . + _irq_stack_size ;
. = ALIGN(4);
_irq_stack_top = . - 4 ;
. = ALIGN(4);
} > SRAM
.data : AT (_etext)
{
_sdata = .;
*(.data .data.*)
. = ALIGN(4);
_edata = . ;
} > SRAM
/* .bss section which is used for uninitialized data */
.bss (NOLOAD) :
{
_sbss = . ;
*(.bss .bss.*)
*(COMMON)
} > SRAM
.heap (NOLOAD) :
{
. = ALIGN(4);
_sheap = . ;
OP-423 do the arch specific stuff (in reset vector) to hide this from portable code: - switch back to MSP stack before starting the scheduler so that the sheduler can use the IRQ stack (when/if needed). - call the C portable function in heap1 to claim some stack back (the number to claim is taken from linker file). - start the scheduler from reset vector (I move this here from main because it make sense to not go back to C (so that I don't need to copy the rolled stack in case the sheduler returns). This make it more clean. - Also I have added the call to the mem manager if sheduler return. that way, we don't reset indefinitely if memory runs out. We will go to this handler and figure things out (right now, it's just looping but at least not rebooting. Probably trap NMI would be better (later improvement). The part missing for this part is the weak attribute for the function in heap1.c so that we don't have to update everything with empty stub. I think the weak atrribute for C function called in assembly is arch dependent so I am not sure if this is possible (will look into it, maybe somebody outthere nows). Right now, it's heap1 dependent and won't work with heap2. I will clean that up the next couple of days. I did some test and it looks good. this is without init code re-organization so we don't free as much as we will be it's good starts. This compile with sim_posix (since it does not affect portable code) so this is really clean. I only tested this with CC. I will port it for OP when I will work on heap2.
2011-06-14 06:49:17 +02:00
_sheap_pre_rtos = . ;
*(.heap)
. = ALIGN(4);
_eheap = . ;
OP-423 do the arch specific stuff (in reset vector) to hide this from portable code: - switch back to MSP stack before starting the scheduler so that the sheduler can use the IRQ stack (when/if needed). - call the C portable function in heap1 to claim some stack back (the number to claim is taken from linker file). - start the scheduler from reset vector (I move this here from main because it make sense to not go back to C (so that I don't need to copy the rolled stack in case the sheduler returns). This make it more clean. - Also I have added the call to the mem manager if sheduler return. that way, we don't reset indefinitely if memory runs out. We will go to this handler and figure things out (right now, it's just looping but at least not rebooting. Probably trap NMI would be better (later improvement). The part missing for this part is the weak attribute for the function in heap1.c so that we don't have to update everything with empty stub. I think the weak atrribute for C function called in assembly is arch dependent so I am not sure if this is possible (will look into it, maybe somebody outthere nows). Right now, it's heap1 dependent and won't work with heap2. I will clean that up the next couple of days. I did some test and it looks good. this is without init code re-organization so we don't free as much as we will be it's good starts. This compile with sim_posix (since it does not affect portable code) so this is really clean. I only tested this with CC. I will port it for OP when I will work on heap2.
2011-06-14 06:49:17 +02:00
_eheap_pre_rtos = . ;
_init_stack_end = . ;
OP-423 do the arch specific stuff (in reset vector) to hide this from portable code: - switch back to MSP stack before starting the scheduler so that the sheduler can use the IRQ stack (when/if needed). - call the C portable function in heap1 to claim some stack back (the number to claim is taken from linker file). - start the scheduler from reset vector (I move this here from main because it make sense to not go back to C (so that I don't need to copy the rolled stack in case the sheduler returns). This make it more clean. - Also I have added the call to the mem manager if sheduler return. that way, we don't reset indefinitely if memory runs out. We will go to this handler and figure things out (right now, it's just looping but at least not rebooting. Probably trap NMI would be better (later improvement). The part missing for this part is the weak attribute for the function in heap1.c so that we don't have to update everything with empty stub. I think the weak atrribute for C function called in assembly is arch dependent so I am not sure if this is possible (will look into it, maybe somebody outthere nows). Right now, it's heap1 dependent and won't work with heap2. I will clean that up the next couple of days. I did some test and it looks good. this is without init code re-organization so we don't free as much as we will be it's good starts. This compile with sim_posix (since it does not affect portable code) so this is really clean. I only tested this with CC. I will port it for OP when I will work on heap2.
2011-06-14 06:49:17 +02:00
_sheap_post_rtos = . ;
. = . + _init_stack_size ;
. = ALIGN(4);
_eheap_post_rtos = . ;
_init_stack_top = . - 4 ;
} > SRAM
_free_ram = . ;
.free_ram (NOLOAD) :
{
. = ORIGIN(SRAM) + LENGTH(SRAM) - _free_ram ;
/* This is used by the startup in order to initialize the .bss section */
_ebss = . ;
_eram = . ;
} > SRAM
/* keep the heap section at the end of the SRAM
* this will allow to claim the remaining bytes not used
* at run time! (done by the reset vector).
*/
PROVIDE ( _end = _ebss ) ;
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
}