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

VladislavS

Свой
  • Постов

    1 240
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные VladislavS


  1. 1 час назад, Raven сказал:

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

    Какие ассемблерные процедуры?

     

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

    Я не хочу при выходе каждого нового процессора от ST писать новый стартап на си.

    Они отличаются  только набором векторов прерываний.

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

    Конечно, если нет другого выхода, буду сам писать

    Другой выход есть. Есть в природе VisualGDB. В нём есть стартапы на С для GCC и всех процессоров STM32. Вектора прерываний там именно в том виде как у меня в стартапе. Новый стартап для IAR делается простым CTRL-C и CTRL-V.

  2. // STM32G071 IAR Startup file
    
    #include <stddef.h>
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #pragma segment="CSTACK"
    #define __STACK_TOP  ((uint32_t)__sfe( "CSTACK" ))
    void exit(){}
    void __exit(){}
    void abort(){}
    void __cmain();
    
    void Default_Handler() { for(;;); }
    
    void NMI_Handler()                        __attribute__ ((weak, alias ("Default_Handler")));
    void HardFault_Handler()                  __attribute__ ((weak, alias ("Default_Handler")));
    void SVC_Handler()                        __attribute__ ((weak, alias ("Default_Handler")));
    void PendSV_Handler()                     __attribute__ ((weak, alias ("Default_Handler")));
    void SysTick_Handler()                    __attribute__ ((weak, alias ("Default_Handler")));
    void WWDG_IRQHandler()                    __attribute__ ((weak, alias ("Default_Handler")));
    void PVD_IRQHandler()                     __attribute__ ((weak, alias ("Default_Handler")));
    void RTC_TAMP_IRQHandler()                __attribute__ ((weak, alias ("Default_Handler")));
    void FLASH_IRQHandler()                   __attribute__ ((weak, alias ("Default_Handler")));
    void RCC_IRQHandler()                     __attribute__ ((weak, alias ("Default_Handler")));
    void EXTI0_1_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
    void EXTI2_3_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
    void EXTI4_15_IRQHandler()                __attribute__ ((weak, alias ("Default_Handler")));
    void UCPD1_2_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
    void DMA1_Channel1_IRQHandler()           __attribute__ ((weak, alias ("Default_Handler")));
    void DMA1_Channel2_3_IRQHandler()         __attribute__ ((weak, alias ("Default_Handler")));
    void DMA1_Ch4_7_DMAMUX1_OVR_IRQHandler()  __attribute__ ((weak, alias ("Default_Handler")));
    void ADC1_COMP_IRQHandler()               __attribute__ ((weak, alias ("Default_Handler")));
    void TIM1_BRK_UP_TRG_COM_IRQHandler()     __attribute__ ((weak, alias ("Default_Handler")));
    void TIM1_CC_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
    void TIM2_IRQHandler()                    __attribute__ ((weak, alias ("Default_Handler")));
    void TIM3_IRQHandler()                    __attribute__ ((weak, alias ("Default_Handler")));
    void TIM6_DAC_LPTIM1_IRQHandler()         __attribute__ ((weak, alias ("Default_Handler")));
    void TIM7_LPTIM2_IRQHandler()             __attribute__ ((weak, alias ("Default_Handler")));
    void TIM14_IRQHandler()                   __attribute__ ((weak, alias ("Default_Handler")));
    void TIM15_IRQHandler()                   __attribute__ ((weak, alias ("Default_Handler")));
    void TIM16_IRQHandler()                   __attribute__ ((weak, alias ("Default_Handler")));
    void TIM17_IRQHandler()                   __attribute__ ((weak, alias ("Default_Handler")));
    void I2C1_IRQHandler()                    __attribute__ ((weak, alias ("Default_Handler")));
    void I2C2_IRQHandler()                    __attribute__ ((weak, alias ("Default_Handler")));
    void SPI1_IRQHandler()                    __attribute__ ((weak, alias ("Default_Handler")));
    void SPI2_IRQHandler()                    __attribute__ ((weak, alias ("Default_Handler")));
    void USART1_IRQHandler()                  __attribute__ ((weak, alias ("Default_Handler")));
    void USART2_IRQHandler()                  __attribute__ ((weak, alias ("Default_Handler")));
    void USART3_4_LPUART1_IRQHandler()        __attribute__ ((weak, alias ("Default_Handler")));
    void CEC_IRQHandler()                     __attribute__ ((weak, alias ("Default_Handler")));
    
    typedef void(*intvec_elem)();
    
    const intvec_elem __vector_table[] __attribute__((used, section(".intvec"))) =
    { (intvec_elem)__STACK_TOP, &__cmain,
    	&NMI_Handler,
    	&HardFault_Handler,
    	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
    	&SVC_Handler,
    	NULL,	NULL,
    	&PendSV_Handler,
    	&SysTick_Handler,
    	&WWDG_IRQHandler,
    	&PVD_IRQHandler,
    	&RTC_TAMP_IRQHandler,
    	&FLASH_IRQHandler,
    	&RCC_IRQHandler,
    	&EXTI0_1_IRQHandler,
    	&EXTI2_3_IRQHandler,
    	&EXTI4_15_IRQHandler,
    	&UCPD1_2_IRQHandler,
    	&DMA1_Channel1_IRQHandler,
    	&DMA1_Channel2_3_IRQHandler,
    	&DMA1_Ch4_7_DMAMUX1_OVR_IRQHandler,
    	&ADC1_COMP_IRQHandler,
    	&TIM1_BRK_UP_TRG_COM_IRQHandler,
    	&TIM1_CC_IRQHandler,
    	&TIM2_IRQHandler,
    	&TIM3_IRQHandler,
    	&TIM6_DAC_LPTIM1_IRQHandler,
    	&TIM7_LPTIM2_IRQHandler,
    	&TIM14_IRQHandler,
    	&TIM15_IRQHandler,
    	&TIM16_IRQHandler,
    	&TIM17_IRQHandler,
    	&I2C1_IRQHandler,
    	&I2C2_IRQHandler,
    	&SPI1_IRQHandler,
    	&SPI2_IRQHandler,
    	&USART1_IRQHandler,
    	&USART2_IRQHandler,
    	&USART3_4_LPUART1_IRQHandler,
    	&CEC_IRQHandler
    };
    
    #ifdef __cplusplus
    }
    #endif

     

  3. Я как-то на Cortex-M4 поймал HardFault по невыровненному доступу :)

    template<uint32_t fifo_num>
    static inline void WriteFIFO(uint8_t *src, uint16_t len)
    {
      for (uint32_t words2write = (len+3)/4; words2write--; src += 4)
        #if defined(__ARMCC_VERSION)
          // ARMCC v6 на высокой оптимизации на *(uint32_t *)src ставит инструкцию LDM R1!,{R4}
          // которая на невыровненных данных валит в HardFault          
          *otg_dfifo<fifo_num>() = *src + (*(src+1)<<8) + (*(src+2)<<16) + (*(src+3)<<24);
        #else			 
          *otg_dfifo<fifo_num>() = *(uint32_t *)src;
        #endif
    }

     

  4. Ну почему же, возможна. Вот из icf для stm32h743 кусочек

    if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
    {
      // Required in a multi-threaded application
      initialize by copy with packing = none { section __DLIB_PERTHREAD };
    }

    Но в простейших случаях лучше без этого обходиться. Чтобы программе было всё равно с какого адреса стартовать, зачастую, достаточно просто добавить

      extern void(*__vector_table[])();     
      SCB->VTOR = (uint32_t)&__vector_table;

     

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