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