Сергей Борщ 143 24 августа, 2021 Опубликовано 24 августа, 2021 · Жалоба 1 час назад, one_eight_seven сказал: Для переноса векторов вам надо создать место для второй таблицы, и при старте скопировать туда основную. Вот только при старте ядро ожидает вектора в совершенно конкретном, прибитом гвоздями месте. Поэтому надо не AT> FLASH а AT>регион, расположенный на штатном месте векторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_Golubev 0 24 августа, 2021 Опубликовано 24 августа, 2021 · Жалоба 1 час назад, one_eight_seven сказал: Конечно. Они собрались у вас после текста. Для переноса векторов вам надо создать место для второй таблицы, и при старте скопировать туда основную. Или создать сразу две таблицы, в разных секциях. Можно пример. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 24 августа, 2021 Опубликовано 24 августа, 2021 · Жалоба 2 hours ago, Сергей Борщ said: Вот только при старте ядро ожидает вектора в совершенно конкретном, прибитом гвоздями месте. Поэтому надо не AT> FLASH а AT>регион, расположенный на штатном месте векторов. И? Первая изначально собиралась верно. Я пишу именно про вторую, релоцированную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 24 августа, 2021 Опубликовано 24 августа, 2021 (изменено) · Жалоба 13 hours ago, Alex_Golubev said: Можно пример. Да: LD: Spoiler ... SECTIONS { .flash_vectors : { .KEEP(*(.flash_vectors)) } > FLASH .text : { ... } > FLASH .ram_vectors : AT (__reloc_ivt_start) { . = ALIGN(256); /* Next power of 2 grater than IVT size, see ARM Documentation */ __ram_vectors_start = .; KEEP(*(.ram_vectors)) __ram_vectors_end = .; } > ITCM_RAM .relocatable_ivt : { __reloc_ivt_start = .; . += SIZEOF(.ram_vectors); . = ALIGN(4); _etext = .; } > FLASH ... } startup C file: Spoiler typedef void (*p_func) (void); extern size_t __stack_top[]; extern size_t __ram_vectors_start[]; extern size_t __ram_vectors_end[]; extern size_t __reloc_ivt_start[]; void flash_reset_handler(void); // Flash-located vectors necessary for startup void ram_reset_handler(void); const p_func __flash_vectors[] __attribute__((used, section(".flash_vectors"))) = { [0] = (p_func)__stack_top, [1] = flash_reset_handler, .... }; p_func __ram_vectors[] __attribute__((used, section(".flash_vectors"))) = { [0] = (p_func)__stack_top, [1] = ram_reset_handler, .... }; void flash_reset_handler(void) { ... // Copy relocatable table into RAM size_t * p_src; size_t * p_dst; for (p_src = __reloc_ivt_start, p_dst = __ram_vectors_start; p_dst < __ram_vectors_end; ) { *p_dst++ = *p_src++; } ... } ... // Somewhere in initialization function: SCB->VTOR = __ram_vectors_start; Изменено 24 августа, 2021 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_Golubev 0 31 августа, 2021 Опубликовано 31 августа, 2021 · Жалоба У меня таблица векторов описана на asm: Скрытый текст .section .isr_vector,"a",%progbits .type g_pfnVectors, %object .size g_pfnVectors, .-g_pfnVectors g_pfnVectors: .word _estack .word Reset_Handler .word NMI_Handler .word HardFault_Handler .word MemManage_Handler .word BusFault_Handler .word UsageFault_Handler .word 0 .word 0 .word 0 .word 0 .word SVC_Handler .word DebugMon_Handler .word 0 .word PendSV_Handler .word SysTick_Handler /* External Interrupts */ .word WWDG_IRQHandler /* Window WatchDog */ .word PVD_AVD_IRQHandler /* PVD/AVD through EXTI Line detection */ .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ .word FLASH_IRQHandler /* FLASH */ .word RCC_IRQHandler /* RCC */ .word EXTI0_IRQHandler /* EXTI Line0 */ .word EXTI1_IRQHandler /* EXTI Line1 */ .word EXTI2_IRQHandler /* EXTI Line2 */ .word EXTI3_IRQHandler /* EXTI Line3 */ .word EXTI4_IRQHandler /* EXTI Line4 */ .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ .word FDCAN1_IT0_IRQHandler /* FDCAN1 interrupt line 0 */ .word FDCAN2_IT0_IRQHandler /* FDCAN2 interrupt line 0 */ .word FDCAN1_IT1_IRQHandler /* FDCAN1 interrupt line 1 */ .word FDCAN2_IT1_IRQHandler /* FDCAN2 interrupt line 1 */ .word EXTI9_5_IRQHandler /* External Line[9:5]s */ .word TIM1_BRK_IRQHandler /* TIM1 Break interrupt */ .word TIM1_UP_IRQHandler /* TIM1 Update interrupt */ .word TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation interrupt */ .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ .word TIM2_IRQHandler /* TIM2 */ .word TIM3_IRQHandler /* TIM3 */ .word TIM4_IRQHandler /* TIM4 */ .word I2C1_EV_IRQHandler /* I2C1 Event */ .word I2C1_ER_IRQHandler /* I2C1 Error */ .word I2C2_EV_IRQHandler /* I2C2 Event */ .word I2C2_ER_IRQHandler /* I2C2 Error */ .word SPI1_IRQHandler /* SPI1 */ .word SPI2_IRQHandler /* SPI2 */ .word USART1_IRQHandler /* USART1 */ .word USART2_IRQHandler /* USART2 */ .word USART3_IRQHandler /* USART3 */ .word EXTI15_10_IRQHandler /* External Line[15:10]s */ .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ .word 0 /* Reserved */ .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ .word FMC_IRQHandler /* FMC */ .word SDMMC1_IRQHandler /* SDMMC1 */ .word TIM5_IRQHandler /* TIM5 */ .word SPI3_IRQHandler /* SPI3 */ .word UART4_IRQHandler /* UART4 */ .word UART5_IRQHandler /* UART5 */ .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ .word TIM7_IRQHandler /* TIM7 */ .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ .word ETH_IRQHandler /* Ethernet */ .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ .word FDCAN_CAL_IRQHandler /* FDCAN calibration unit interrupt*/ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ .word USART6_IRQHandler /* USART6 */ .word I2C3_EV_IRQHandler /* I2C3 event */ .word I2C3_ER_IRQHandler /* I2C3 error */ .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ .word OTG_HS_IRQHandler /* USB OTG HS */ .word DCMI_IRQHandler /* DCMI */ .word 0 /* Reserved */ .word RNG_IRQHandler /* Rng */ .word FPU_IRQHandler /* FPU */ .word UART7_IRQHandler /* UART7 */ .word UART8_IRQHandler /* UART8 */ .word SPI4_IRQHandler /* SPI4 */ .word SPI5_IRQHandler /* SPI5 */ .word SPI6_IRQHandler /* SPI6 */ .word SAI1_IRQHandler /* SAI1 */ .word LTDC_IRQHandler /* LTDC */ .word LTDC_ER_IRQHandler /* LTDC error */ .word DMA2D_IRQHandler /* DMA2D */ .word SAI2_IRQHandler /* SAI2 */ .word QUADSPI_IRQHandler /* QUADSPI */ .word LPTIM1_IRQHandler /* LPTIM1 */ .word CEC_IRQHandler /* HDMI_CEC */ .word I2C4_EV_IRQHandler /* I2C4 Event */ .word I2C4_ER_IRQHandler /* I2C4 Error */ .word SPDIF_RX_IRQHandler /* SPDIF_RX */ .word OTG_FS_EP1_OUT_IRQHandler /* USB OTG FS End Point 1 Out */ .word OTG_FS_EP1_IN_IRQHandler /* USB OTG FS End Point 1 In */ .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI */ .word OTG_FS_IRQHandler /* USB OTG FS */ .word DMAMUX1_OVR_IRQHandler /* DMAMUX1 Overrun interrupt */ .word HRTIM1_Master_IRQHandler /* HRTIM Master Timer global Interrupt */ .word HRTIM1_TIMA_IRQHandler /* HRTIM Timer A global Interrupt */ .word HRTIM1_TIMB_IRQHandler /* HRTIM Timer B global Interrupt */ .word HRTIM1_TIMC_IRQHandler /* HRTIM Timer C global Interrupt */ .word HRTIM1_TIMD_IRQHandler /* HRTIM Timer D global Interrupt */ .word HRTIM1_TIME_IRQHandler /* HRTIM Timer E global Interrupt */ .word HRTIM1_FLT_IRQHandler /* HRTIM Fault global Interrupt */ .word DFSDM1_FLT0_IRQHandler /* DFSDM Filter0 Interrupt */ .word DFSDM1_FLT1_IRQHandler /* DFSDM Filter1 Interrupt */ .word DFSDM1_FLT2_IRQHandler /* DFSDM Filter2 Interrupt */ .word DFSDM1_FLT3_IRQHandler /* DFSDM Filter3 Interrupt */ .word SAI3_IRQHandler /* SAI3 global Interrupt */ .word SWPMI1_IRQHandler /* Serial Wire Interface 1 global interrupt */ .word TIM15_IRQHandler /* TIM15 global Interrupt */ .word TIM16_IRQHandler /* TIM16 global Interrupt */ .word TIM17_IRQHandler /* TIM17 global Interrupt */ .word MDIOS_WKUP_IRQHandler /* MDIOS Wakeup Interrupt */ .word MDIOS_IRQHandler /* MDIOS global Interrupt */ .word JPEG_IRQHandler /* JPEG global Interrupt */ .word MDMA_IRQHandler /* MDMA global Interrupt */ .word 0 /* Reserved */ .word SDMMC2_IRQHandler /* SDMMC2 global Interrupt */ .word HSEM1_IRQHandler /* HSEM1 global Interrupt */ .word 0 /* Reserved */ .word ADC3_IRQHandler /* ADC3 global Interrupt */ .word DMAMUX2_OVR_IRQHandler /* DMAMUX Overrun interrupt */ .word BDMA_Channel0_IRQHandler /* BDMA Channel 0 global Interrupt */ .word BDMA_Channel1_IRQHandler /* BDMA Channel 1 global Interrupt */ .word BDMA_Channel2_IRQHandler /* BDMA Channel 2 global Interrupt */ .word BDMA_Channel3_IRQHandler /* BDMA Channel 3 global Interrupt */ .word BDMA_Channel4_IRQHandler /* BDMA Channel 4 global Interrupt */ .word BDMA_Channel5_IRQHandler /* BDMA Channel 5 global Interrupt */ .word BDMA_Channel6_IRQHandler /* BDMA Channel 6 global Interrupt */ .word BDMA_Channel7_IRQHandler /* BDMA Channel 7 global Interrupt */ .word COMP1_IRQHandler /* COMP1 global Interrupt */ .word LPTIM2_IRQHandler /* LP TIM2 global interrupt */ .word LPTIM3_IRQHandler /* LP TIM3 global interrupt */ .word LPTIM4_IRQHandler /* LP TIM4 global interrupt */ .word LPTIM5_IRQHandler /* LP TIM5 global interrupt */ .word LPUART1_IRQHandler /* LP UART1 interrupt */ .word 0 /* Reserved */ .word CRS_IRQHandler /* Clock Recovery Global Interrupt */ .word ECC_IRQHandler /* ECC diagnostic Global Interrupt */ .word SAI4_IRQHandler /* SAI4 global interrupt */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word WAKEUP_PIN_IRQHandler /* Interrupt for all 6 wake-up pins */ Как понял нужна еще одна таблица но созданная в ITCMRAM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 31 августа, 2021 Опубликовано 31 августа, 2021 · Жалоба 46 minutes ago, Alex_Golubev said: Как понял нужна еще одна таблица но созданная в ITCMRAM Вы можете просто зарезервировать для неë место, и заполнить в рантайме. Она, в любом случае, будет заполняться в рантайме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 31 августа, 2021 Опубликовано 31 августа, 2021 · Жалоба 2 часа назад, Alex_Golubev сказал: еще одна таблица но созданная в ITCMRAM Да, нужна. Для этого опишите и создайте структуру (можно массив или объединение структуры и массива - насколько вам фантазии хватит) вашей таблицы векторов в любом исходном Си-файле проекта. Задайте ей аттрибут размещения в именованной секции. А эту секцию через линкер-скрипт разместите в адресном пространстве ITCMRAM. И не забудьте про требование к выравниванию адреса таблицы векторов. В рантайме, когда будете делать перенос, просто скопируете содержимое оригинальной таблицы в эту. С другой стороны, можно инициализировать эту таблицу векторов значениями в момент создания - заполнить её тем же, чем заполняется оригинальная таблица векторов в стартапе. Тогда к моменту входа в main() она уже будет содержать корректные значения. Останется лишь сообщить ядру её новый адрес. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 31 августа, 2021 Опубликовано 31 августа, 2021 · Жалоба Начало секции сдвиньте на размер таблицы и скопируйте в startup.... Хотя можно с бубном и танцами (см.выше) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_Golubev 0 3 сентября, 2021 Опубликовано 3 сентября, 2021 · Жалоба А почему просто нельзя изменить в ".ld" >FLASH на >ITCMRAM и в SystemInit прописать "SCB->VTOR = D1_ITCMRAM_BASE | VECT_TAB_OFFSET"? Скрытый текст MEMORY { DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K } /* Sections */ SECTIONS { /* The startup code into "FLASH" Rom type memory */ .isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) /* Startup code */ . = ALIGN(4); } >ITCMRAM SCB->VTOR = D1_ITCMRAM_BASE | VECT_TAB_OFFSET; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 3 сентября, 2021 Опубликовано 3 сентября, 2021 (изменено) · Жалоба 2 hours ago, Alex_Golubev said: А почему просто нельзя изменить в ".ld" >FLASH на >ITCMRAM и в SystemInit прописать "SCB->VTOR = D1_ITCMRAM_BASE | VECT_TAB_OFFSET"? Reveal hidden contents MEMORY { DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K } /* Sections */ SECTIONS { /* The startup code into "FLASH" Rom type memory */ .isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) /* Startup code */ . = ALIGN(4); } >ITCMRAM SCB->VTOR = D1_ITCMRAM_BASE | VECT_TAB_OFFSET; Ядро начинает фетчить команды при старте, начиная с определëнного адреса, и это должен быть ресет вектор, и этот адрес - во флэш. Более того, реализация обработчика ресет вектора - тоже должна быть во флэш. Но можно сделать и так, как вы хотите - разместить всё отладчиком, и отладчиком же установить pc, sp, и работать. Но в реальном использовании это всë сломается, как только произойдëт аппаратный сброс или потеря питания. А как, по-вашему, данные должны попасть в RAM? Изменено 3 сентября, 2021 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_Golubev 0 6 сентября, 2021 Опубликовано 6 сентября, 2021 · Жалоба Почему у вас для массива векторов указаны одинаковые секции "__attribute__((used, section(".flash_vectors"))) "? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 6 сентября, 2021 Опубликовано 6 сентября, 2021 · Жалоба 8 minutes ago, Alex_Golubev said: Почему у вас для массива векторов указаны одинаковые секции "__attribute__((used, section(".flash_vectors"))) "? Опечатка. Разумеется, для RAM нужно `. ram_vectors` Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_Golubev 0 6 сентября, 2021 Опубликовано 6 сентября, 2021 (изменено) · Жалоба Не догнал работу с линкером. Скрытый текст .ram_vectors : AT (__reloc_ivt_start) // для чего нужен AT (__reloc_ivt_start) можно упрастить, для лучшего понимания { . = ALIGN(256); /* Next power of 2 grater than IVT size, see ARM Documentation */ __ram_vectors_start = .; KEEP(*(.ram_vectors)) __ram_vectors_end = .; } > ITCM_RAM .relocatable_ivt : { __reloc_ivt_start = .; . += SIZEOF(.ram_vectors); . = ALIGN(4); _etext = .; } > FLASH Сделал вот так не знаю насколько правильно. в .id добавил: Скрытый текст .ram_vectors : AT (__reloc_ivt_start) { . = ALIGN(256); /* Next power of 2 grater than IVT size, see ARM Documentation */ __ram_vectors_start = .; KEEP(*(.ram_vectors)) __ram_vectors_end = .; } > ITCM_RAM .relocatable_ivt : { __reloc_ivt_start = .; . += SIZEOF(.ram_vectors); . = ALIGN(4); _etext = .; } > FLASH Создал вторую таблицу векторов Скрытый текст /* vectors to ITCMRAM*/ .section .ram_vectors,"a",%progbits .type g_ramVectors, %object .size g_ramVectors, .-g_ramVectors g_ramVectors: .word _estack .word Reset_Handler .word NMI_Handler .word HardFault_Handler .word MemManage_Handler .word BusFault_Handler .word UsageFault_Handler .word 0 .word 0 .word 0 .word 0 .word SVC_Handler .word DebugMon_Handler .word 0 .word PendSV_Handler .word SysTick_Handler /* External Interrupts */ .word WWDG_IRQHandler /* Window WatchDog */ .word PVD_AVD_IRQHandler /* PVD/AVD through EXTI Line detection */ .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ .word FLASH_IRQHandler /* FLASH */ .word RCC_IRQHandler /* RCC */ .word EXTI0_IRQHandler /* EXTI Line0 */ .word EXTI1_IRQHandler /* EXTI Line1 */ .word EXTI2_IRQHandler /* EXTI Line2 */ .word EXTI3_IRQHandler /* EXTI Line3 */ .word EXTI4_IRQHandler /* EXTI Line4 */ .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ .word FDCAN1_IT0_IRQHandler /* FDCAN1 interrupt line 0 */ .word FDCAN2_IT0_IRQHandler /* FDCAN2 interrupt line 0 */ .word FDCAN1_IT1_IRQHandler /* FDCAN1 interrupt line 1 */ .word FDCAN2_IT1_IRQHandler /* FDCAN2 interrupt line 1 */ .word EXTI9_5_IRQHandler /* External Line[9:5]s */ .word TIM1_BRK_IRQHandler /* TIM1 Break interrupt */ .word TIM1_UP_IRQHandler /* TIM1 Update interrupt */ .word TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation interrupt */ .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ .word TIM2_IRQHandler /* TIM2 */ .word TIM3_IRQHandler /* TIM3 */ .word TIM4_IRQHandler /* TIM4 */ .word I2C1_EV_IRQHandler /* I2C1 Event */ .word I2C1_ER_IRQHandler /* I2C1 Error */ .word I2C2_EV_IRQHandler /* I2C2 Event */ .word I2C2_ER_IRQHandler /* I2C2 Error */ .word SPI1_IRQHandler /* SPI1 */ .word SPI2_IRQHandler /* SPI2 */ .word USART1_IRQHandler /* USART1 */ .word USART2_IRQHandler /* USART2 */ .word USART3_IRQHandler /* USART3 */ .word EXTI15_10_IRQHandler /* External Line[15:10]s */ .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ .word 0 /* Reserved */ .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ .word FMC_IRQHandler /* FMC */ .word SDMMC1_IRQHandler /* SDMMC1 */ .word TIM5_IRQHandler /* TIM5 */ .word SPI3_IRQHandler /* SPI3 */ .word UART4_IRQHandler /* UART4 */ .word UART5_IRQHandler /* UART5 */ .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ .word TIM7_IRQHandler /* TIM7 */ .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ .word ETH_IRQHandler /* Ethernet */ .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ .word FDCAN_CAL_IRQHandler /* FDCAN calibration unit interrupt*/ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ .word USART6_IRQHandler /* USART6 */ .word I2C3_EV_IRQHandler /* I2C3 event */ .word I2C3_ER_IRQHandler /* I2C3 error */ .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ .word OTG_HS_IRQHandler /* USB OTG HS */ .word DCMI_IRQHandler /* DCMI */ .word 0 /* Reserved */ .word RNG_IRQHandler /* Rng */ .word FPU_IRQHandler /* FPU */ .word UART7_IRQHandler /* UART7 */ .word UART8_IRQHandler /* UART8 */ .word SPI4_IRQHandler /* SPI4 */ .word SPI5_IRQHandler /* SPI5 */ .word SPI6_IRQHandler /* SPI6 */ .word SAI1_IRQHandler /* SAI1 */ .word LTDC_IRQHandler /* LTDC */ .word LTDC_ER_IRQHandler /* LTDC error */ .word DMA2D_IRQHandler /* DMA2D */ .word SAI2_IRQHandler /* SAI2 */ .word QUADSPI_IRQHandler /* QUADSPI */ .word LPTIM1_IRQHandler /* LPTIM1 */ .word CEC_IRQHandler /* HDMI_CEC */ .word I2C4_EV_IRQHandler /* I2C4 Event */ .word I2C4_ER_IRQHandler /* I2C4 Error */ .word SPDIF_RX_IRQHandler /* SPDIF_RX */ .word OTG_FS_EP1_OUT_IRQHandler /* USB OTG FS End Point 1 Out */ .word OTG_FS_EP1_IN_IRQHandler /* USB OTG FS End Point 1 In */ .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI */ .word OTG_FS_IRQHandler /* USB OTG FS */ .word DMAMUX1_OVR_IRQHandler /* DMAMUX1 Overrun interrupt */ .word HRTIM1_Master_IRQHandler /* HRTIM Master Timer global Interrupt */ .word HRTIM1_TIMA_IRQHandler /* HRTIM Timer A global Interrupt */ .word HRTIM1_TIMB_IRQHandler /* HRTIM Timer B global Interrupt */ .word HRTIM1_TIMC_IRQHandler /* HRTIM Timer C global Interrupt */ .word HRTIM1_TIMD_IRQHandler /* HRTIM Timer D global Interrupt */ .word HRTIM1_TIME_IRQHandler /* HRTIM Timer E global Interrupt */ .word HRTIM1_FLT_IRQHandler /* HRTIM Fault global Interrupt */ .word DFSDM1_FLT0_IRQHandler /* DFSDM Filter0 Interrupt */ .word DFSDM1_FLT1_IRQHandler /* DFSDM Filter1 Interrupt */ .word DFSDM1_FLT2_IRQHandler /* DFSDM Filter2 Interrupt */ .word DFSDM1_FLT3_IRQHandler /* DFSDM Filter3 Interrupt */ .word SAI3_IRQHandler /* SAI3 global Interrupt */ .word SWPMI1_IRQHandler /* Serial Wire Interface 1 global interrupt */ .word TIM15_IRQHandler /* TIM15 global Interrupt */ .word TIM16_IRQHandler /* TIM16 global Interrupt */ .word TIM17_IRQHandler /* TIM17 global Interrupt */ .word MDIOS_WKUP_IRQHandler /* MDIOS Wakeup Interrupt */ .word MDIOS_IRQHandler /* MDIOS global Interrupt */ .word JPEG_IRQHandler /* JPEG global Interrupt */ .word MDMA_IRQHandler /* MDMA global Interrupt */ .word 0 /* Reserved */ .word SDMMC2_IRQHandler /* SDMMC2 global Interrupt */ .word HSEM1_IRQHandler /* HSEM1 global Interrupt */ .word 0 /* Reserved */ .word ADC3_IRQHandler /* ADC3 global Interrupt */ .word DMAMUX2_OVR_IRQHandler /* DMAMUX Overrun interrupt */ .word BDMA_Channel0_IRQHandler /* BDMA Channel 0 global Interrupt */ .word BDMA_Channel1_IRQHandler /* BDMA Channel 1 global Interrupt */ .word BDMA_Channel2_IRQHandler /* BDMA Channel 2 global Interrupt */ .word BDMA_Channel3_IRQHandler /* BDMA Channel 3 global Interrupt */ .word BDMA_Channel4_IRQHandler /* BDMA Channel 4 global Interrupt */ .word BDMA_Channel5_IRQHandler /* BDMA Channel 5 global Interrupt */ .word BDMA_Channel6_IRQHandler /* BDMA Channel 6 global Interrupt */ .word BDMA_Channel7_IRQHandler /* BDMA Channel 7 global Interrupt */ .word COMP1_IRQHandler /* COMP1 global Interrupt */ .word LPTIM2_IRQHandler /* LP TIM2 global interrupt */ .word LPTIM3_IRQHandler /* LP TIM3 global interrupt */ .word LPTIM4_IRQHandler /* LP TIM4 global interrupt */ .word LPTIM5_IRQHandler /* LP TIM5 global interrupt */ .word LPUART1_IRQHandler /* LP UART1 interrupt */ .word 0 /* Reserved */ .word CRS_IRQHandler /* Clock Recovery Global Interrupt */ .word ECC_IRQHandler /* ECC diagnostic Global Interrupt */ .word SAI4_IRQHandler /* SAI4 global interrupt */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word WAKEUP_PIN_IRQHandler /* Interrupt for all 6 wake-up pins */ В systeminit добавил Скрытый текст extern size_t __stack_top[]; extern size_t __ram_vectors_start[]; extern size_t __ram_vectors_end[]; extern size_t __reloc_ivt_start[]; size_t * p_src; size_t * p_dst; for (p_src = __reloc_ivt_start, p_dst = __ram_vectors_start; p_dst < __ram_vectors_end; ) { *p_dst++ = *p_src++; } __disable_irq(); SCB->VTOR = __ram_vectors_start; __DSB(); __enable_irq(); __ISB(); МК стартует и при сбросе и при потери питания все вроде нормально. Насколько правильно я все сделал ? Прошу проверить. Изменено 7 сентября, 2021 пользователем Alex_Golubev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_Golubev 0 9 октября, 2021 Опубликовано 9 октября, 2021 · Жалоба решил перенести тело функции в память itcmram. Для этого сделал : Скрытый текст добавил в FLASH.id .itcm_text : { . = ALIGN(4); itcm_text_start = .; *core_*.o(.text*) *(.itcm_text) /**/ *(.itcm_text*) /**/ . = ALIGN(4); itcm_text_end = .; } >ITCM_RAM добавил атрибут к функции void execByteCode(_Manager *manager) __attribute__(( section(".itcm_text") )); Контроллер перестал запускаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 9 октября, 2021 Опубликовано 9 октября, 2021 · Жалоба 2 hours ago, Alex_Golubev said: Контроллер перестал запускаться. Куда переходит при вызове execByteCode ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться