STM32L162 reset time
Miroslav Mraz
mraz na seznam.cz
Pondělí Únor 10 22:06:09 CET 2014
Nějak mi vadí, že ST tuhle část má v assembleru, když se to dá napsat v
C např. takto:
extern void main (void);
extern void SystemInit (void);
/* start address for the initialization values of the .data section.
defined in linker script */
extern unsigned int _sidata;
/* start address for the .data section. defined in linker script */
extern unsigned int _sdata;
/* end address for the .data section. defined in linker script */
extern unsigned int _edata;
/* start address for the .bss section. defined in linker script */
extern unsigned int _sbss;
/* end address for the .bss section. defined in linker script */
extern unsigned int _ebss;
void Reset_Handler(void) {
register unsigned int *src, *dst, *end;
/* Zero fill the bss section */
dst = &_sbss;
end = &_ebss;
while (dst < end) *dst++ = 0U;
/* Copy data section from flash to RAM */
src = &_sidata;
dst = &_sdata;
end = &_edata;
while (dst < end) *dst++ = *src++;
SystemInit();
main();
for (;;);
}
I toto předpokládá, že máte kontrolu nad linker skriptem - všechny
použité symboly musí být zarovnány na word. Stačí před definicí použít
direktivu . = ALIGN(4); - normálně to tak linker skripty mají. Překladač
to pak zoptimalizuje lépe, než byl ten původní kód v assembleru.
Mrazík
Jaroslav Buchta píše v Po 10. 02. 2014 v 20:13 +0100:
> Jen pro ilustracit, takovy startup code (cast) pouzivam ja u
> STM32F4xxx:
> Reset_Handler:
>
> /* Copy the data segment initializers from flash to SRAM */
> movs r1, #0
> b LoopCopyDataInit
>
> CopyDataInit:
> ldr r3, =_sidata
> ldr r3, [r3, r1]
> str r3, [r0, r1]
> adds r1, r1, #4
>
> LoopCopyDataInit:
> ldr r0, =_sdata
> ldr r3, =_edata
> adds r2, r0, r1
> cmp r2, r3
> bcc CopyDataInit
> ldr r2, =_sbss
> b LoopFillZerobss
> /* Zero fill the bss segment. */
> FillZerobss:
> movs r3, #0
> str r3, [r2], #4
>
> LoopFillZerobss:
> ldr r3, = _ebss
> cmp r2, r3
> bcc FillZerobss
>
>
> /*FPU settings*/
> ldr r0, =0xE000ED88 /* Enable CP10,CP11 */
> ldr r1,[r0]
> orr r1,r1,#(0xF << 20)
> str r1,[r0]
>
> /* Call the clock system intitialization function.*/
> bl SystemInit
> /* Call static constructors */
> bl __libc_init_array
> /* Call the application's entry point.*/
> bl main
> bx lr
> .size Reset_Handler, .-Reset_Handler
>
>
Další informace o konferenci Hw-list