Makki 0 Posted November 17, 2020 · Report post Здравствуйте! Только начинаю работать с EWARM. STM32. Дошел до прерываний. Получилось запустить, работает, но файл с таблицей векторов startup_имя_процессора.s пришлось просто добавить в проект (не прописывая в файлах). Такой подход мне не понравился. Суть в чём, в EWAVR писал для себя файлики, в которых директивами препроцессора подключал нужные .h файлы с таблицами векторов для конкретного процессора. Возможно ли то же самое для ассемблерных .s стартап файлов для STM32? В лоб #include ... не получается - не знает компилятор ассемблера (или всё же знает?) - ошибки выдаёт. Подключать в каждом новом проекте ручками не хочется. Ну и хочется именно от иара или ст готовые использовать, то есть сам заново писать на си (читал, что так можно) пока не хочу. Ткните, пожалуйста, в какую сторону смотреть... Quote Ответить с цитированием Share this post Link to post Share on other sites
haker_fox 0 Posted November 17, 2020 · Report post Не думаю, что здесь можно использовать директиву #include. Но условную компиляцию - запросто, тем более ассемблер иара её поддерживает. Вот только как получить модель МК препроцессором? Что-то я такого в документации не нашёл. Архитектуру - без проблем. Quote Ответить с цитированием Share this post Link to post Share on other sites
VladislavS 0 Posted November 17, 2020 · Report post IAR-овский стартап для STM32 (да вообще для Cortex-M) на С сильно проще такового на ассемблере. Рекомендую скачать/сделать и не парить себе мозги асмом. Quote Ответить с цитированием Share this post Link to post Share on other sites
VladislavS 0 Posted November 17, 2020 · Report post // 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 Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted November 18, 2020 · Report post 7 часов назад, Makki сказал: писал для себя файлики, в которых директивами препроцессора подключал нужные .h файлы с таблицами векторов для конкретного процессора. Возможно ли то же самое для ассемблерных .s стартап файлов для STM32? В лоб #include ... не получается - не знает компилятор ассемблера (или всё же знает?) - ошибки выдаёт Файлы *.s - это файлы исходного кода (как и .c/.cpp), а не заголовочные как .h. Теперь вспоминайте как вы добавляете файлы исходников в проект. Вот так же делайте и с .s. #include - это не про них. Quote Ответить с цитированием Share this post Link to post Share on other sites
Makki 0 Posted November 18, 2020 · Report post Ну, может, неправильно добавляю... Всегда пользовался теми же #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 Почему неправильно? Можно легче? Quote Ответить с цитированием Share this post Link to post Share on other sites
haker_fox 0 Posted November 18, 2020 · Report post 44 minutes ago, Makki said: Почему неправильно? Никогда не встречал использование #include для включения файлов с кодом. Ими включают только заголовочные файлы. В любом случае ваш подход - нестандартный. 45 minutes ago, Makki said: Можно легче? Да. Использовать те же директивы условной компиляции препроцессора, но в самих файлах с исходным кодом. При этом сами файлы вы включаете все в проект. Quote Ответить с цитированием Share this post Link to post Share on other sites
x893 0 Posted November 18, 2020 · Report post 4 minutes ago, haker_fox said: Никогда не встречал использование #include для включения файлов с кодом. Всегда что то происходит в первый раз. Религия не запрещает include исходника сделать. Quote Ответить с цитированием Share this post Link to post Share on other sites
Makki 0 Posted November 18, 2020 (edited) · Report post Ладно, пока попробую поискать у IAR или ST стартапы на C. Поищу в содержимом, например, по NMI_Handler() PS В папках иара пока что нет сишных. Все стартапы для STM .s PPS CubeMX тоже генерит проекты с использованием .s файлов Edited November 18, 2020 by Makki Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted November 18, 2020 · Report post 1 час назад, x893 сказал: Религия не запрещает include исходника сделать. "Не запрещает" когда понимаешь что и зачем делаешь. Здесь не тот случай. ТС - начинающий. И ему сначала нужно изучить общепринятый способ надевания трусов. До изучения альтернатив. Quote Ответить с цитированием Share this post Link to post Share on other sites
Makki 0 Posted November 18, 2020 (edited) · Report post Короче, ищу возможность подключать разные стандартные, не самописные!, а от производителя, стартапные файлы с таблицами векторов в зависимости от объявленного директивой #define типа микроконтроллера. Если это возможно. Более того, далее есть цель ещё и совместить в одном файле AVR и STM... Получить хочется что-то по принципу ардуино, такой типа простенький, но быстрый HAL для EWAVR и EWARM вместе взятых. Функционал, например: #define тип процессора, используемый усарт, его режим, далее просто в программе закидываем данные в стек и всё само работает. C avr такой принцип работает, но благодаря тому, что там все таблицы в .h файлах. С стм пока не получается. Edited November 18, 2020 by Makki Quote Ответить с цитированием Share this post Link to post Share on other sites
VladislavS 0 Posted November 18, 2020 · Report post 2 часа назад, Makki сказал: Ладно, пока попробую поискать у IAR или ST стартапы на C. А на несколько сообщений вверх глаза поднять? Я думаете для кого писал? Quote Ответить с цитированием Share this post Link to post Share on other sites
Raven 0 Posted November 18, 2020 · Report post 16 minutes ago, VladislavS said: А на несколько сообщений вверх глаза поднять? Я думаете для кого писал? Путь суровый, не для новичка. И ведь все равно где-то в проекте нужно будет прописывать файл, содержащий все эти ассемблерные процедуры. Quote Ответить с цитированием Share this post Link to post Share on other sites
Makki 0 Posted November 18, 2020 · Report post 24 minutes ago, VladislavS said: А на несколько сообщений вверх глаза поднять? Я думаете для кого писал? Это я видел и понял. Я не хочу при выходе каждого нового процессора от ST писать новый стартап на си. А стартапы на си сам ST, похоже, не предоставляет (я правильно понял?). Конечно, если нет другого выхода, буду сам писать. Но если писать самому, всегда есть шанс ошибиться, с адресом, например. Поэтому хотелось завязаться на какой-то исходник от производителя. Опять же говорю, если стартапов на си от ST не существует, а подключать по условию .s не получится, буду сам ручками писать. Quote Ответить с цитированием Share this post Link to post Share on other sites
VladislavS 0 Posted November 18, 2020 · Report post 1 час назад, Raven сказал: И ведь все равно где-то в проекте нужно будет прописывать файл, содержащий все эти ассемблерные процедуры. Какие ассемблерные процедуры? 1 час назад, Makki сказал: Я не хочу при выходе каждого нового процессора от ST писать новый стартап на си. Они отличаются только набором векторов прерываний. 1 час назад, Makki сказал: Конечно, если нет другого выхода, буду сам писать Другой выход есть. Есть в природе VisualGDB. В нём есть стартапы на С для GCC и всех процессоров STM32. Вектора прерываний там именно в том виде как у меня в стартапе. Новый стартап для IAR делается простым CTRL-C и CTRL-V. Quote Ответить с цитированием Share this post Link to post Share on other sites