¿Cuál es la diferencia entre stm32f407 y tms320f28335? Comparación vista en el foro. \x0d\Acabo de recibir la placa de evaluación STM32F4 estos días. El punto de venta de STM32F4 esta vez es el conjunto de instrucciones FPU y DSP, al que he estado prestando atención durante mucho tiempo. Esta vez quiero probar el rendimiento de punto flotante de STM32F4. Si cumple con los requisitos, actualizaré mi arquitectura de control de vuelo. Originalmente usé la arquitectura de doble núcleo STM32F103+28335 como procesador de punto flotante, y F28335 era más problemático de depurar, por lo que siempre quise cambiarlo. \x0d\\x0d\El código de prueba se basa en mi algoritmo de control de vuelo, todos usando operaciones de punto flotante, incluidos los filtros Kalman de actitud y posición de orden 7 y 9, una gran cantidad de operaciones matriciales, algunos algoritmos de navegación y controladores PID, algunos IF y SWITCH contienen sentencias de juicio de salto, que son operaciones más completas que los algoritmos puros. \x0d\x0d\Entorno de prueba:\x0d\f28335: CCS v3.3, usando la biblioteca matemática optimizada de TI, sin optimización, el programa se ejecuta en RAM. \x0d \x0d\STM32F4:KEIL V4.7, usando la biblioteca matemática optimizada para ARM, sin optimización. \x0d \ Establezca un punto de interrupción en la entrada del algoritmo de control de vuelo, registre el contador de estados calculado en la ventana de registro, luego realice un solo paso y registre el nuevo valor del contador, y réstelo del valor anterior para obtener el recuento de CPU\x0d \x0d\resultado de la prueba:\x0d\F28335:253359 ciclos de CPU, divididos por 150 MHZ, son aproximadamente 1,69 ms\x0d\STM32F4\x0d\\x0d\ Dejando de lado los factores arquitectónicos, desde la perspectiva de las operaciones de punto flotante puro. Instrucciones de suma, resta y multiplicación FPU VADD. F32,VSUB. F32 y VMUL. F32 de STM32F4 son instrucciones de un solo ciclo, mientras que VDIV es división. F32 requiere 14 ciclos. \x0d\ Por ejemplo: a = a/b; el ensamblado generado es: \x0d \x08000220ed900a 00vldrs0, [r0, #0x 00] \x0d \x0d \x 08000224 4804 ldrrr 0, [PC, #16]; 08000238\x0d\\x0d\0x 08000226 edd 00 a 00 VLDR s 1,[r0,# 0x 00]\x0d\\x0d\0x 0800022 a ee 801a 20 VDIV. F32 s2,s0,s 1\x0d\\x0d\0x 0800022 e 4803 LDR r0,[pc,# 12]; ] \ x0d \ FPU con código copiado F28335: f28335 tiene instrucciones de suma, resta y multiplicación, todas las cuales son doble ciclo. Como no hay ninguna instrucción de división de hardware, F. \x0d\Por ejemplo: a = a * b, el ensamblaje generado es: \x0d\0087b2e203mov32 *-sp[4], r0h\x0d\x0d\0087 be 2 afmov 32 r 1h, *-sp[6], UNC.
0087 B6 E700 MPY F32r0h, r1h, r0h\x0d\0087 B8 7700 NOP//La canalización necesita esperar a que finalice la operación FPU, por lo que NOP\ \x0d\Copiar división de código:\x0d\0087bde203mov32*-sp[4] , r0h\X0duncf\x0d\x0d\0087c 1 7640 LCR $div_f32.ASM:52:71$\x0d\x0d\0087c 3203 mov 32 *-sp[4], r0h\x0. Sin embargo, debido a que F28335 es una arquitectura de Harvard y tiene una larga canalización, puede completar la lectura, el cálculo y el almacenamiento en un ciclo de reloj, por lo que si el programa se ejecuta continuamente, será mucho más rápido que ARM. Por ejemplo, solo se necesitan 5 ciclos de reloj para ejecutar a = a+b una vez, pero la desventaja es que una vez que se realiza un salto, la canalización debe borrarse. si\x0d\for(I = 0;i