Перейти к содержанию
    

Может кто поделиться примером переноса вектора прерывания в память ITCMRAM на stm32 в gcc

1 час назад, one_eight_seven сказал:

Для переноса векторов вам надо создать место для второй таблицы, и при старте скопировать туда основную.

Вот только при старте ядро ожидает вектора в совершенно конкретном, прибитом гвоздями месте. Поэтому надо не AT> FLASH а AT>регион, расположенный на штатном месте векторов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, one_eight_seven сказал:

Конечно. Они собрались у вас после текста. Для переноса векторов вам надо создать место для второй таблицы, и при старте скопировать туда основную. Или создать сразу две таблицы, в разных секциях.

 

Можно пример. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Сергей Борщ said:

Вот только при старте ядро ожидает вектора в совершенно конкретном, прибитом гвоздями месте. Поэтому надо не AT> FLASH а AT>регион, расположенный на штатном месте векторов.

И? Первая изначально собиралась верно. Я пишу именно про вторую, релоцированную.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

 

 

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня таблица векторов описана на 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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

46 minutes ago, Alex_Golubev said:

Как понял нужна еще одна таблица но созданная в ITCMRAM

 

Вы можете просто зарезервировать для неë место, и заполнить в рантайме. Она, в любом случае, будет заполняться в рантайме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Alex_Golubev сказал:

еще одна таблица но созданная в ITCMRAM

Да, нужна. Для этого опишите и создайте структуру (можно массив или объединение структуры и массива - насколько вам фантазии хватит) вашей таблицы векторов в любом исходном Си-файле проекта. Задайте ей аттрибут размещения в именованной секции. А эту секцию через линкер-скрипт разместите в адресном пространстве ITCMRAM. И не забудьте про требование к выравниванию адреса таблицы векторов.

В рантайме, когда будете делать перенос, просто скопируете содержимое оригинальной таблицы в эту.

С другой стороны, можно инициализировать эту таблицу векторов значениями в момент создания - заполнить её тем же, чем заполняется оригинальная таблица векторов в стартапе. Тогда к моменту входа в main() она уже будет содержать корректные значения. Останется лишь сообщить ядру её новый адрес.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Начало секции сдвиньте на размер таблицы и скопируйте в startup....

Хотя можно с бубном и танцами (см.выше)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему просто нельзя изменить в ".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;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему у вас для массива векторов указаны одинаковые секции "__attribute__((used, section(".flash_vectors"))) "? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, Alex_Golubev said:

Почему у вас для массива векторов указаны одинаковые секции "__attribute__((used, section(".flash_vectors"))) "? 

Опечатка. Разумеется, для RAM нужно `. ram_vectors`

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не догнал работу с линкером.

Скрытый текст

    .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();

 

МК стартует и при сбросе и при потери питания все вроде нормально. Насколько правильно я все сделал ? Прошу проверить. 

Изменено пользователем Alex_Golubev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

решил перенести тело функции в память 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") ));

Контроллер перестал запускаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Alex_Golubev said:

Контроллер перестал запускаться.

Куда переходит при вызове execByteCode ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...