Jump to content

    

VladislavS

Свой
  • Content Count

    912
  • Joined

  • Last visited

Community Reputation

0 Обычный

About VladislavS

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

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

2982 profile views
  1. Судя по ошибке это не так. И это не обязательно пути. Читайте внимательно текст ошибки.
  2. Попрошу не тыкать! Файлы те написаны людьми мало понимающими как работает стандартная библиотека в Keil. К делу, впрочем, это не относится. Скорее что-то с путями к системным файлам и файлам проекта. Конечно не смогу, у меня проекты из одних исходников тремя разными компиляторами собираются, куда уж мне пустой проект в Keil сделать....
  3. Можно подумать, что это я не могу пустой проект скомпилировать.
  4. Потому что ошибка ещё до компиляции main.c возникает.
  5. Я бы внутрь startup_stm32f407xx.s заглянул.
  6. Неужели так трудно без ошибок скомпилировать int main() { } и затем добавлять код и смотреть где ошибка?
  7. Пофиксили. Должно заработать. Но что-то я не уверен в оптимальности того что получается. Вот, например, на "size" VMOV.F32 S0,#8.0 //res16 = (int)(x * 8) + 0x00008000ul; VLDR S1,[R1, #0] VMUL.F32 S1,S1,S0 VCVT.S32.F32 S1,S1 VMOV R3,S1 SUB R3,R3,#+32768 //res32 = (int)(x * 16) + 0x00008000ul; VLDR S0,[R1, #0] VCVT.S32.F32 S0,S0,#+4 VMOV R4,S0 ADD R4,R4,#+32768 А это на "speed" //res16 = (int)(x * 8) + 0x00008000ul; VLDR S0,[R2, #0] VCVT.S32.F32 S0,S0,#+3 VMOV R3,S0 SUB R3,R3,#+32768 //res32 = (int)(x * 16) + 0x00008000ul; VMOV.F32 S0,#16.0 VLDR S1,[R2, #0] VMUL.F32 S1,S1,S0 VCVT.S32.F32 S1,S1 VMOV R3,S1 ADD R3,R3,#+32768 PS: Я правда циклы и загрузки в память из памяти в листинге почикал.
  8. На вкладке Debugger в свойствах проекта.
  9. Там есть кусок кода инициализации из стандартной библиотеки без исходников. Из общих представлений, кончено, можно догадаться что там происходит, но для новичка это сложно.
  10. Припоминаю, что Keil-овская стандартная библиотека на ядре M4F при инициализации использует FPU. Если его не включить в SystemInit, то будет Hardfault-иться и до main() не дойдёт. Проверьте что эта строка не заифдефлена. SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ А оптимальнее вот так SCB->CPACR = ((3UL << 10*2)|(3UL << 11*2)); // set CP10 and CP11 Full Access. И послушайте совет MrBearManul - в пошаговом режиме в окне дизассемблера пройдитесь до ошибки. Это не так уж сложно. PS: Переходите уже на 6-й компилятор. PPS: //__asm volatile ("cpsie i"); __enable_irq();
  11. Я бы начал с volatile unsigned char *from; Затем листинг смотрел. И неплохо бы название контроллера и компилятора узнать.
  12. Что значит нравится, не нравится? Был КОНКРЕТНЫЙ вопрос, дан КОНКРЕТНЫЙ ответ. Это уже другая задача. Которая в общем виде решается так using pVU8 = volatile uint8_t*; using pVU16 = volatile uint16_t*; using pVU32 = volatile uint32_t*; template<uint32_t PM> static inline void write(uint32_t data) { if constexpr (PM==0) return; if constexpr (PM == 0xFFFF) base()->ODR = data; else if constexpr (PM == 0x00FF) *pVU8(&base()->ODR) = data; else if constexpr (PM == 0xFF00) *(pVU8(&base()->ODR) + 1) = data >> 8; else base()->BSRR = (PM << 16) | (data & PM); } //Оптимизация записи по маске 32-битного регистра с возможностью 8 и 16-битного доступа template<uint32_t mask> static inline void writeReg32(pVU32 reg, uint32_t value) { if constexpr (mask==0) return; if constexpr (mask == 0xFFFF'FFFF) *reg = value; else if constexpr (mask == 0x0000'FFFF) *pVU16(reg) = value; else if constexpr (mask == 0xFFFF'0000) *(pVU16(reg) + 1) = value >> 16; else if constexpr (mask == 0x0000'00FF) *pVU8(reg) = value; else if constexpr (mask == 0x0000'FF00) *(pVU8(reg) + 1) = value >> 8; else if constexpr (mask == 0x00FF'0000) *(pVU8(reg) + 2) = value >> 16; else if constexpr (mask == 0xFF00'0000) *(pVU8(reg) + 3) = value >> 24; else if constexpr ((mask & 0xFFFF'FF00)==0) *pVU8(reg) = (*pVU8(reg) & ~mask) | value; else if constexpr (!(mask & 0xFFFF'00FF)) *(pVU8(reg) + 1) = (*(pVU8(reg) + 1) & ~(mask >> 8)) | (value >> 8); else if constexpr (!(mask & 0xFF00'FFFF)) *(pVU8(reg) + 2) = (*(pVU8(reg) + 2) & ~(mask >> 16)) | (value >> 16); else if constexpr (!(mask & 0x00FF'FFFF)) *(pVU8(reg) + 3) = (*(pVU8(reg) + 3) & ~(mask >> 24)) | (value >> 24); else if constexpr (!(mask & 0xFFFF'0000)) *pVU16(reg) = (*pVU16(reg) & ~mask) | value; else if constexpr (!(mask & 0x0000'FFFF)) *(pVU16(reg) + 1) = (*(pVU16(reg) + 1) & ~(mask >> 16)) | (value >> 16); else *reg = (*reg & ~mask) | value; } Но вы же не об этом спрашивали.
  13. Примеров я и сам могу привести. В том числе и из Errata. Только ни о каком общем случае речи не было. Вопрос стоял конкретный:
  14. Как это? Порт указан, контроллер угадан. Что там может не сработать? Не сработает на F1, но речь не про него.
  15. На крайней версии компилятора всё так же. ----------------------------------------- ARM Compiler 6.15, Cortex-M4F 0x20001B00 B081 SUB sp,sp,#0x04 10: i0 += 25 << moFault; 0x20001B02 F2422030 MOVW r0,#0x2230 0x20001B06 F2C20000 MOVT r0,#0x2000 0x20001B0A F2422240 MOVW r2,#0x2240 0x20001B0E 7800 LDRB r0,[r0,#0x00] 0x20001B10 F2C20200 MOVT r2,#0x2000 0x20001B14 2119 MOVS r1,#0x19 0x20001B16 6813 LDR r3,[r2,#0x00] 0x20001B18 FA01F000 LSL r0,r1,r0 0x20001B1C 4418 ADD r0,r0,r3 0x20001B1E 6010 STR r0,[r2,#0x00] 11: volatile int x = i0; 0x20001B20 9000 STR r0,[sp,#0x00] 0x20001B22 BF00 NOP 0x20001B24 E7FE B 0x20001B24 ------------------------------------------ GCC 10.1 , Cortex-M4F, -03 10: i0 += 25 << moFault; 0x200002c4 05 4B ldr r3, [pc, #20] ; (0x200002dc <main()+24>) 0x200002c6 06 4A ldr r2, [pc, #24] ; (0x200002e0 <main()+28>) 0x200002c8 18 78 ldrb r0, [r3, #0] 0x200002ca 11 68 ldr r1, [r2, #0] 0x200002cc 19 23 movs r3, #25 9: { 0x200002ce 82 B0 sub sp, #8 0x200002d0 83 40 lsls r3, r0 0x200002d2 0B 44 add r3, r1 0x200002d4 13 60 str r3, [r2, #0] Мне кажется, это не бага, а компилятор что-то с выравниванием команд мутит.