Endian-Problem auf STM32

Endian-Problem auf STM32

Eingebettete Systeme werden immer das Big-Endian/Little-Endian-Problem haben. Mein persönlicher Ansatz bestand darin, den internen Speicher immer mit der nativen Endianität zu codieren und alle Swaps direkt beim Ein- oder Austritt von Daten vorzunehmen.

Indem Sie [0] als MSB laden, codieren Sie den Wert als Big-Endian.

Dies zeigt an, dass der Prozessor Little-Endian ist.

Wenn Sie stattdessen den ersten Wert in [2] laden und zurück zu [0] arbeiten, haben Sie die eingehende Zahl als Little-Endian codiert und im Wesentlichen den Austausch vorgenommen, wenn die Zahl eingeht. Sobald Sie mit der nativen Darstellung arbeiten, können Sie zu Ihrem ursprünglichen Ansatz zurückkehren, arithmetische Operationen zu verwenden. Stellen Sie einfach sicher, dass Sie es wieder auf Big-Endian umstellen, wenn Sie den Wert übertragen.


In Bezug auf Kopfgeld „Ich möchte wirklich etwas über den Big-Endian-Modus von srm32f4 wissen“ gibt es auf diesem Chip keinen Big-Endian-Modus. STM32F4 führt alle Speicherzugriffe in Little Endian aus.

Das Benutzerhandbuch http://www.st.com/web/en/resource/technical/document/programming_manual/DM00046982.pdf erwähnt dies auf Seite 25. Aber es gibt noch mehr. Auf Seite 93 sehen Sie, dass es Endian-Swapping-Anweisungen gibt. REV und REVB für Reverse und Reverse-Bit. REV ändert die Endianess für 32-Bit-Daten und REV16 für 16-Bit-Daten.


Hier ist ein Codeschnipsel für einen Cortex M4, kompiliert mit gcc

/*
 * asmLib.s
 *
 *  Created on: 13 mai 2016
 */
    .syntax unified
    .cpu cortex-m4
    .thumb
    .align
    .global big2little32
    .global big2little16
    .thumb
    .thumb_func
 big2little32:
    rev r0, r0
    bx  lr
 big2little16:
    rev16   r0, r0
    bx  lr

Von C aus kann der Aufruf sein:

 extern uint32_t big2little32(uint32_t x);
 extern uint16_t big2little16(uint16_t x);

 myVar32bit = big2little32( myVar32bit );
 myVar16bit = big2little16( myVar16bit );

Ich weiß nicht, wie ich es schneller machen soll :-)