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