-
Постов
1 240 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные VladislavS
-
-
2 часа назад, Makki сказал:
Ладно, пока попробую поискать у IAR или ST стартапы на C.
А на несколько сообщений вверх глаза поднять? Я думаете для кого писал?
-
// 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
-
IAR-овский стартап для STM32 (да вообще для Cortex-M) на С сильно проще такового на ассемблере. Рекомендую скачать/сделать и не парить себе мозги асмом.
-
36 минут назад, Arlleex сказал:
Тут DMB/DSB не помогут.
Нужны не DMB/DSB, а тупо любая задержка.
-
25 минут назад, KnightIgor сказал:
Есть ответ по существу?
Порядок сборки модулей программы не должен влиять на её работу. Если это не так - ищите ошибку.
-
6 часов назад, SII сказал:
Просто const и volatile -- взаимоисключающие параграфы с точки зрения обычной логики
const и volatile совершенно не связаны друг с другом.
-
35 минут назад, dimka76 сказал:
А что за специальный макрос ?
IS_TIM_32B_COUNTER_INSTANCE
-
Можно в заголовочные файлы заглянуть. Там для 32-битных таймеров специальный макрос определён.
-
16 часов назад, jeka сказал:
Когда rtos ставить не хочется,
16 часов назад, jeka сказал:Но тут вырисовывается проблемка в совместимости с RTOS:
Один я нахожу это странным? Может как-то определиться?
-
Какой такой com-порт на HID?
-
Вы наперёд знаете что будет передаваться через эту функцию? Те же дескрипторы можно генерить в constexpr контексте.
-
17 минут назад, Сергей Борщ сказал:
auto pSrc = reinterpret_cast<unaligned<uint32_t> const *>(from);
Это несовместимо с constexpr.
-
10 минут назад, jcxz сказал:
Если только одно это изменение сделать. Для чистоты эксперимента.....
У меня сейчас нет возможности проверить. Попозже. У меня Keil не основной, так подопытный.
-
-
16 часов назад, haker_fox сказал:
Уф, как мне кажется, уважаемый @Arlleex выше даже показал, что нужно сделать)
Между нами девочками,
-
3 минуты назад, jcxz сказал:
читать побайтно и потом склеивать.
Смехуёчки смехуёчками, а компилятор достаточно умный, и на ядрах с поддержкой невыровненного доступа заменяет такие выражения 32-битным доступом.
-
А я считаю, что в том виде как написано, возможность невыровненного доступа очевидна. Не зря же вы все дружно кинулись давать советы как "полечить". Коипилятор тупо прошляпил.
-
3 часа назад, haker_fox сказал:
Так откуда компилятор знает, какой адрес у вас находится в указателе. Он же неизвестен на момент компиляции.
Вот! Как раз в точку. Не знаешь - рассчитывай на худшее.
-
Я как-то на 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 }
-
48 МГц на USB-контроллер подаётся?
-
18 минут назад, haker_fox сказал:
Но у меня нет VTOR(((
Ну нет так нет. Делаем REMAP и устанавливаем вектора в SRAM. :)
#define InstallIRQ(name) void name##Handler(); \ *(volatile uint32_t *)(0x2000'0040 + name##n * 4) = (uint32_t)name##Handler
-
Ну почему же, возможна. Вот из 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;
-
В разных конфигурациях указываем разные icf да и всё.
-
12.09.2020 в 00:24, Eddy_Em сказал:
Как IDE, конечно!
2 часа назад, Eddy_Em сказал:Все равно make из терминала запускать...
Да уж. Странные понятия об IDE. Про отладку боюсь даже спросить.
Подключить .s стартап файлы директивами препроцессора
в IAR
Опубликовано · Пожаловаться
Какие ассемблерные процедуры?
Они отличаются только набором векторов прерываний.
Другой выход есть. Есть в природе VisualGDB. В нём есть стартапы на С для GCC и всех процессоров STM32. Вектора прерываний там именно в том виде как у меня в стартапе. Новый стартап для IAR делается простым CTRL-C и CTRL-V.