¿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 en estos días. El punto de venta de STM32F4 esta vez es el conjunto de instrucciones FPU y DSP. Esta vez quiero probar el rendimiento de punto flotante. de STM32F4 si lo satisface, actualizaré y volaré la estructura de control. Originalmente, se usaba la arquitectura de doble núcleo STM32F103 + 28335 y el F28335 se usaba como procesador de punto flotante. Era problemático depurar, por lo que siempre quise cambiarlo. \x0d\\x0d\El código de prueba utiliza el algoritmo de mi control de vuelo, todos usando operaciones de punto flotante, incluidos dos filtros Kalman de séptimo y noveno orden para actitud y posición, incluida una gran cantidad de operaciones matriciales y algunos algoritmos de navegación. y controladores PID, etc., y algunos IF y SWITCH contienen declaraciones de juicio de salto, que es una operación más completa en comparación con 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\STM32F4: KEIL V4.7, usando biblioteca matemática optimizada para ARM, sin optimización. \x0d\\x0d\Método de prueba:\x0d\F28335: establece un punto de interrupción en la entrada del algoritmo de control de vuelo, borra el contador de CPU CCS (perfil->reloj), luego PASA, registra el recuento de CPU\x0d\STM32F4 : Establezca un punto de interrupción en la entrada del algoritmo de control de vuelo, registre el contador de estados en la ventana Registro, luego PASE, 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: 285964 ciclos, divididos por 168 MHZ, son aproximadamente 1,7 ms, un poco más lento que F28335\x0d\\x0d\La conclusión es Para una aritmética integral de punto flotante que implica relativamente muchos saltos, el STM32F4 no parece ser mucho más lento. \x0d\\x0d\ Deje de lado los factores arquitectónicos y mírelo desde la perspectiva de operaciones puras de punto flotante. Las instrucciones de suma, resta y multiplicación FPU VADD.F32, VSUB.F32 y VMUL.F32 de STM32F4 son todas instrucciones de un solo ciclo, mientras que la división VDIV.F32 requiere 14 ciclos. \x0d\Por ejemplo: a = a / b; el ensamblado generado es:\x0d\0x08000220 ED900A00 VLDR s0,[r0,#0x00]\x0d\\x0d\0x08000224 4804 LDR r0,[pc,#16]; 0x08000238 \x0d\\x0d\0x08000226 EDD00A00 VLDR s1,[r0,#0x00]\x0d\\x0d\0x0800022A EE801A20 VDIV.F32 s2,s0,s1\x0d\\x0d\0x0800022E 4803 LDR r0,[pc,#1 2] ; @0x0800023C\x0d\\x0d\0x08000230 ED801A00 VSTR s2,[r0,#0x00]\x0d\Copiar código F28335: La FPU de F28335 tiene instrucciones de suma, resta y multiplicación, todas las cuales son ciclos dobles. No hay instrucción de división de hardware, F28335 está aquí. Es una división de punto flotante simulada por software. Al compilar, puede ver las palabras LCR $div_f32.asm, que requiere 19 ciclos de reloj.
\x0d\Por ejemplo: a = a * b, el ensamblado generado es:\x0d\0087B2 E203 MOV32 *-SP[4], R0H\x0d\\x0d\0087B4 E2AF MOV32 R1H, *-SP[6], UNCF \ x0d\\x0d\0087B6 E700 MPYF32 R0H, R1H, R0H\x0d\\x0d\0087B8 7700 NOP //La tubería debe esperar a que se complete la operación FPU, por lo que se requiere NOP \x0d\\x0d\0087B9 E203 MOV32 *-SP[4] , R0H\x0d\\x0d\Copiar división de código:\x0d\0087BD E203 MOV32 *-SP[4], R0H\x0d\\x0d\0087BF E2AF MOV32 R1H, *-SP[6], UNCF\x0d\\x0d \0087C1 7640 LCR $div_f32.asm:52:71$\x0d\\x0d\0087C3 E203 MOV32 *-SP[4], R0H\x0d\Copiar conclusión del código:\x0d\Se puede ver que desde la perspectiva de los procesadores de punto flotante únicamente, el F28335 no es tan bueno como el FPU del F4. Sin embargo, dado que F28335 es una arquitectura de Harvard y tiene una tubería larga, puede completar la lectura, el cálculo y el almacenamiento en un ciclo de reloj. Por lo tanto, si el programa se ejecuta continuamente, será mucho más rápido que ARM, por ejemplo, ejecutando a = a. + b solo una vez. Se necesitan 5 ciclos de reloj, pero la desventaja es que una vez que quieras saltar, debes borrar la tubería. Si es\x0d\for(i = 0;i
.