Упдате. Сделал по-другому (но тоже всё это совсем не нравится и наверняка где-то ошибся). Ткните носом, скажите своё фиииБуду благодарен за критику (а лучше подскажите как сами решаете подобные задачи). Делал так: 1) Добавил в LD
RAM_FUNC (xrw) : ORIGIN = 0x20040000, LENGTH = 64K /*под вечер нет уже сил искать где там ITCM, пусть отсюда запускается - 0x20040000 тоже ОЗУ*/
и вот это (тут наверняка ошибся - я этот птичий язык LD почти совсем не понимаю)
_sramfunc = LOADADDR(.ramfunc);
.ramfunc : /* RAM functions section */
{
. = ALIGN(4);
_fast_func_start = .;
*(.ramfunc)
*(.ramfunc.*)
_fast_func_end = .;
} > RAM_FUNC AT > FLASH
2) стартап такой
extern unsigned long _sidata;
extern unsigned long _sdata;
extern unsigned long _edata;
extern unsigned long _sbss;
extern unsigned long _ebss;
extern unsigned long _estack;
extern unsigned long __ctors_start__;
extern unsigned long __ctors_end__;
extern unsigned long __dtors_start__;
extern unsigned long __dtors_end__;
extern unsigned long _sramfunc;
extern unsigned long _fast_func_start;
extern unsigned long _fast_func_end;
void Reset_Handler(void) __attribute__((__interrupt__));
extern int main(void);
void __Init_Data(void);
/* Core interrupt vectors */
/* External Interrupts */
/******************************************************************************
*
******************************************************************************/
typedef void( *const intfunc )( void );
void SystemInit (void);
void Reset_Handler(void)
{
SystemInit();
__Init_Data();
main();
}
extern void init_HW(void);
void __Init_Data(void)
{
unsigned long *pulSrc, *pulDest;
pulSrc = &_sidata;
for(pulDest = &_sdata; pulDest < &_edata; )
*(pulDest++) = *(pulSrc++);
for(pulDest = &_sbss; pulDest < &_ebss; )
*(pulDest++) = 0;
/* Init hardware before calling constructors */
//init_HW();
pulDest=&_fast_func_start;
pulSrc=&_sramfunc;
for(; pulDest < &_fast_func_end; )
*(pulDest++) = *(pulSrc++);
/* Call constructors */
unsigned long *ctors;
for(ctors = &__ctors_start__; ctors < &__ctors_end__; )
((void(*)(void))(*ctors++))();
}
3) в main.c
__attribute__ ((section(".ramfunc")))
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, LD1_Pin|LD3_Pin|LD2_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(USB_PowerSwitchOn_GPIO_Port, USB_PowerSwitchOn_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin : USER_Btn_Pin */
GPIO_InitStruct.Pin = USER_Btn_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(USER_Btn_GPIO_Port, &GPIO_InitStruct);
/// blablabla
}
Вроде работает, но как-то не нравится. Кто может подскажет более прямые способы?
P.S. Ещё вопрос - как в ОЗУ закинуть часть проекта целиком (например всю директорию с LwIp (и есть ли в этом смысл? - хотелось чтоб работало по-быстрей))?