Mover código de un ARM M0+ a un ARM M4, ¿qué cambia?

Digamos que tengo un programa muy simple que funciona perfectamente bien en un procesador ARM Cortex M0+. ¿Cuánto tendré que cambiar para que funcione en un procesador ARM Cortex M4, suponiendo que ambos estén fabricados por la misma empresa y que haya importado el nuevo encabezado de núcleos?

Simplemente no puedo pensar en ninguna razón por la que no funcionaría. Utilizan un conjunto de instrucciones similar. Quiero decir que el M4 tiene un conjunto de instrucciones Thumb-2 mucho más ampliado que el M0+. Según mi experiencia, las empresas mantienen el mismo esquema de nombres cuando crean los encabezados de sus dispositivos ARM.

¿Lo has probado? ¿Funcionó?
No lo he hecho, en realidad todavía no tengo un procesador de brazo M4.
Debería funcionar, pero sería estúpido no recompilar y aprovechar las instrucciones de M4. Podría probarlo en un LPC43xx, que tiene un M4 y uno o dos M0, con acceso a los mismos periféricos.
No necesita tener el hardware a mano para intentar compilarlo, aunque si hace la interfaz periférica directamente en lugar de a través de una biblioteca, necesitará el hardware (o un simulador de fidelidad extremadamente alta) para validarlo.

Respuestas (2)

La CPU no debería darte ningún problema, ya que dices que el conjunto de instrucciones de un M4 es un superconjunto del conjunto de instrucciones M0/M0+. Tenga en cuenta que el tiempo puede ser diferente, por lo que el tiempo basado en espera ocupada podría no funcionar igual.

Los periféricos pueden ser un PITA, no asumiría que son iguales a menos que las hojas de datos digan lo mismo.

¡Gracias! Me alegra saber que los conceptos de programación serán más o menos los mismos.
"La CPU Cortex-M0... ejecuta un subconjunto del conjunto de instrucciones Thumb-2. Esto permite una migración ascendente binaria totalmente compatible del código a... Cortex-M3 y M4". -- Hoja de datos de la familia PSoC 4000
De hecho, el "estilo" de la interfaz periférica puede ser drásticamente diferente incluso entre dispositivos de ruta de actualización en su mayoría compatibles con pines del mismo proveedor.

Si su software está en formato ASM/compilado, funcionará (ya que Cortex M4 es un superconjunto de Cortex M0), pero no será óptimo.

Si su software está en C/C++ (esencialmente se puede volver a compilar), tendrá que elegir:

  • compile para M0 (y no use instrucciones más poderosas),
  • compilar para M4 y asegurarse de que otros componentes lo admitan (por ejemplo, RTOS debe guardar el estado de FPU en el contexto de cambio de contexto si se usa FPU),

Sin embargo, tenga en cuenta que los periféricos pueden no ser totalmente compatibles, especialmente si el proveedor no se preocupa por dicha compatibilidad. Si el proveedor se preocupa y su software cambia los bits reservados de los valores de reinicio, es posible que los periféricos no funcionen como se esperaba.