Die folgende Tabelle zeigt beispielhaft den Unterschied, wie man bei Cortex-M4 und M7 denselben Code effizient implementiert.
Beim M4 benötigen einzelne Lade- oder Speicheroperationen 2 Taktzyklen, N aufeinanderfolgende Lade- oder Speicheroperationen jedoch nur N+1 Taktzyklen. Der Entwickler sollte daher soviele Lade- oder Speicheroperationen zusammen bündeln, wie möglich.
Da beim Cortex-M7 Lade- und Speicheroperationen parallel zu arithmetischen Berechnungen erfolgen können und zudem einzelne Speicherzugriffe ohne zusätzlichen Taktzyklus erfolgen können, ist hier ein anderes Vorgehen sinnvoll, nämlich Speicherzugriffe mit Berechnungen so gut es geht zu mischen.
Die rechte Spalte der Tabelle zeigt den identischen M4-Code jedoch umgruppiert.
Cortex-M4 | Cortex-M7 |
---|---|
xn1 = pln[0]; | xn1 = pln[0]; |
xn2 = pln[1]; | xn2 = pln[1]; |
xn3 = pln[2]; | xn3 = pln[2]; |
xn4 = pln[3]; | acc1= b0 * xn1 + d1; |
xn5 = pln[4]; | xn4 = pln[3]; |
xn6 = pln[5]; | d1 = b1 * xn1 + d2; |
xn7 = pln[6]; | xn5 = pln[4]; |
acc1= b0 * xn1 + d1; | d2 = b2 * xn1; |
d1 = b1 * xn1 + d2; | xn6 = pln[5]; |
d2 = b2 * xn1; | d1 + = a1 * acc1; |
d1 + = a1 * acc1; | xn7 = pln[6]; |
d2 + = a2 * acc1; | d2 + = a2 * acc1; |
Der Cortex-M7 erlaubt die parallele Verarbeitung von Speicher-Operationen und arithmetischen Berechnungen.