ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 апреля
890054 Топик полностью
Apтём (20.12.2018 02:20, просмотров: 122) ответил Apтём на День добрый. Что-то я опять делаю не так, но не могу понять что. Пытаюсь переместить некоторые функции в ОЗУ. Для этого делаю следующие действия.
Упдате. Сделал по-другому (но тоже всё это совсем не нравится и наверняка где-то ошибся). Ткните носом, скажите своё фиииБуду благодарен за критику (а лучше подскажите как сами решаете подобные задачи). Делал так: 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 (и есть ли в этом смысл? - хотелось чтоб работало по-быстрей))?