Jump to content

    

VladislavS

Свой
  • Content Count

    851
  • Joined

  • Last visited

Community Reputation

0 Обычный

About VladislavS

  • Rank
    Знающий
  • Birthday 05/07/1976

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

2857 profile views
  1. Вы наперёд знаете что будет передаваться через эту функцию? Те же дескрипторы можно генерить в constexpr контексте.
  2. Это несовместимо с constexpr.
  3. У меня сейчас нет возможности проверить. Попозже. У меня Keil не основной, так подопытный.
  4. И вот ещё. 5-я версия ARM компилятора, знающая про __packed, вот что в её описании даёт
  5. Между нами девочками,
  6. Смехуёчки смехуёчками, а компилятор достаточно умный, и на ядрах с поддержкой невыровненного доступа заменяет такие выражения 32-битным доступом.
  7. А я считаю, что в том виде как написано, возможность невыровненного доступа очевидна. Не зря же вы все дружно кинулись давать советы как "полечить". Коипилятор тупо прошляпил.
  8. Вот! Как раз в точку. Не знаешь - рассчитывай на худшее.
  9. Я как-то на 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 }
  10. 48 МГц на USB-контроллер подаётся?
  11. Ну нет так нет. Делаем REMAP и устанавливаем вектора в SRAM. :) #define InstallIRQ(name) void name##Handler(); \ *(volatile uint32_t *)(0x2000'0040 + name##n * 4) = (uint32_t)name##Handler
  12. Ну почему же, возможна. Вот из 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;
  13. В разных конфигурациях указываем разные icf да и всё.
  14. Да уж. Странные понятия об IDE. Про отладку боюсь даже спросить.
  15. И даже ещё меньше. Только stack pointer и reset - 8 байт. Остальные вектора в ОЗУ, раз уж таблица туда переехала.