ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
1035643
evgeniy1294 (11.09.2020 18:06, просмотров: 17455)
startup-файлы и вопросы по ним: 

1) Полазив по репам ARM заметил, что старые добрые стартапы на асме помечены как deprecated, теперь в шаблонах сишечка.
https://github.com/ARM-software/CMSIS_5/blob/develop/Device/ARM/ARMCM4/Source/startup_ARMCM4.c

2) У некоторых вендоров заметил очень интересный код в ResetHandler:

Reset_Handler: 
  ldr   sp, =_estack

или вот такой:

  __asm__ __volatile__ (
        " movw r0, #:lower16:resetVectors\n"
        " movt r0, #:upper16:resetVectors\n"
        " ldr r0, [r0]\n"
        " mov sp, r0\n"
        " bl localProgramStart"
    );

В целом смысл всего этого один - установить в sp указатель на верхушку стэка, sp является алиасом на msp или psp в зависимости от контекста. При этом, данная процедура выполняется ядром автоматически при старте: вначале загружается sp, затем осуществляется переход по указателю в ResetHandler. Т.е установка начального значения sp производится дважды.

Для чего это нужно? Единственное, что пришло мне в голову, это используется в загрузчиках. В данном случае в загрузчике можно не смещать стек, а обойтись смещением таблицы прерываний.


Мое вариант кода:

https://github.com/evgeniy1294/mpp/blob/develop/example/blink/board/stm32f407g_disco/startup_gcc.cpp