Jump to content

    
Makki

Подключить .s стартап файлы директивами препроцессора

Recommended Posts

Здравствуйте! Только начинаю работать с EWARM. STM32. Дошел до прерываний. Получилось запустить, работает, но файл с таблицей векторов startup_имя_процессора.s пришлось просто добавить в проект (не прописывая в файлах). Такой подход мне не понравился.

Суть в чём, в EWAVR писал для себя файлики, в которых директивами препроцессора подключал нужные .h файлы с таблицами векторов для конкретного процессора. Возможно ли то же самое для ассемблерных .s стартап файлов для STM32? В лоб #include ... не получается - не знает компилятор ассемблера (или всё же знает?) - ошибки выдаёт. Подключать в каждом новом проекте ручками не хочется. Ну и хочется именно от иара или ст готовые использовать, то есть сам заново писать на си (читал, что так можно) пока не хочу.

Ткните, пожалуйста, в какую сторону смотреть...

Share this post


Link to post
Share on other sites

Не думаю, что здесь можно использовать директиву #include. Но условную компиляцию - запросто, тем более ассемблер иара её поддерживает. Вот только как получить модель МК препроцессором? Что-то я такого в документации не нашёл. Архитектуру - без проблем.

Share this post


Link to post
Share on other sites

IAR-овский стартап для STM32 (да вообще для Cortex-M) на С сильно проще такового на ассемблере. Рекомендую скачать/сделать и не парить себе мозги асмом.

Share this post


Link to post
Share on other sites
// 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

 

Share this post


Link to post
Share on other sites
7 часов назад, Makki сказал:

писал для себя файлики, в которых директивами препроцессора подключал нужные .h файлы с таблицами векторов для конкретного процессора. Возможно ли то же самое для ассемблерных .s стартап файлов для STM32? В лоб #include ... не получается - не знает компилятор ассемблера (или всё же знает?) - ошибки выдаёт

Файлы *.s - это файлы исходного кода (как и .c/.cpp), а не заголовочные как .h. Теперь вспоминайте как вы добавляете файлы исходников в проект. Вот так же делайте и с .s.

#include - это не про них.

Share this post


Link to post
Share on other sites

Ну, может, неправильно добавляю... Всегда пользовался теми же #include

Например, в EWAVR

#ifdef USE_USART0
  #ifdef DEBUG
    #define USART0_MODE_1W_AT
  	#include "Serial_Osc_debug.c"
  #else
    #define USART0_MODE_1W_MODBUS
  	#include "Modbus.с"
  #endif
  #include "AVR_usart.c"
#endif

Почему неправильно? Можно легче?

Share this post


Link to post
Share on other sites
44 minutes ago, Makki said:

Почему неправильно?

Никогда не встречал использование #include для включения файлов с кодом. Ими включают только заголовочные файлы. В любом случае ваш подход - нестандартный.

45 minutes ago, Makki said:

Можно легче?

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

Share this post


Link to post
Share on other sites
4 minutes ago, haker_fox said:

Никогда не встречал использование #include для включения файлов с кодом.

Всегда что то происходит в первый раз.

Религия не запрещает include исходника сделать.

Share this post


Link to post
Share on other sites

Ладно, пока попробую поискать у IAR или ST стартапы на C. Поищу в содержимом, например, по

NMI_Handler()

PS В папках иара пока что нет сишных. Все стартапы для STM .s

PPS CubeMX тоже генерит проекты с использованием .s файлов

Edited by Makki

Share this post


Link to post
Share on other sites
1 час назад, x893 сказал:

Религия не запрещает include исходника сделать.

"Не запрещает" когда понимаешь что и зачем делаешь. Здесь не тот случай. ТС - начинающий. И ему сначала нужно изучить общепринятый способ надевания трусов. До изучения альтернатив.

Share this post


Link to post
Share on other sites

Короче, ищу возможность подключать разные стандартные, не самописные!, а от производителя, стартапные файлы с таблицами векторов в зависимости от объявленного директивой #define типа микроконтроллера. Если это возможно. Более того, далее есть цель ещё и совместить в одном файле AVR и STM...

Получить хочется что-то по принципу ардуино, такой типа простенький, но быстрый HAL для EWAVR и EWARM вместе взятых. Функционал, например: #define тип процессора, используемый усарт, его режим, далее просто в программе закидываем данные в стек и всё само работает. C avr такой принцип работает, но благодаря тому, что там все таблицы в .h файлах. С стм пока не получается. 

Edited by Makki

Share this post


Link to post
Share on other sites
2 часа назад, Makki сказал:

Ладно, пока попробую поискать у IAR или ST стартапы на C.

А на несколько сообщений вверх глаза поднять? Я думаете для кого писал?

Share this post


Link to post
Share on other sites
16 minutes ago, VladislavS said:

А на несколько сообщений вверх глаза поднять? Я думаете для кого писал?

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

Share this post


Link to post
Share on other sites
24 minutes ago, VladislavS said:

А на несколько сообщений вверх глаза поднять? Я думаете для кого писал?

Это я видел и понял. Я не хочу при выходе каждого нового процессора от ST писать новый стартап на си. А стартапы на си сам ST, похоже, не предоставляет (я правильно понял?). Конечно, если нет другого выхода, буду сам писать. Но если писать самому, всегда есть шанс ошибиться, с адресом, например. Поэтому хотелось завязаться на какой-то исходник от производителя. Опять же говорю, если стартапов на си от ST не существует, а подключать по условию .s не получится, буду сам ручками писать.

Share this post


Link to post
Share on other sites
1 час назад, Raven сказал:

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

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

 

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.