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

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

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

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

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

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


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

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

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


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

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

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


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

// 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

 

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


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

7 часов назад, Makki сказал:

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

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

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

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


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

Ну, может, неправильно добавляю... Всегда пользовался теми же #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

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

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


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

44 minutes ago, Makki said:

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

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

45 minutes ago, Makki said:

Можно легче?

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

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


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

4 minutes ago, haker_fox said:

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

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

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

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


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

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

NMI_Handler()

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

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

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

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


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

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

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

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

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


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

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

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

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

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


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

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

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

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

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


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

16 minutes ago, VladislavS said:

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

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

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


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

24 minutes ago, VladislavS said:

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

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

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


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

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

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

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

 

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

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

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

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

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

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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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