Bei wortadressierbaren Maschinen werden Festkommazahlen natürlich wortweise von der CPU behandelt. Das bedeutet, dass jede ganze Zahl in wortgroßen Speicherzellen gespeichert wird und dass Sie auf ein ganzes Wort zugreifen müssen, um eine einzelne ganze Zahl zu lesen oder zu schreiben. Aber wie wäre es mit kleineren Dateneinheiten als Zeichen, die üblicherweise als 8-Bit-Datenstücke codiert sind? Da ein Wort aus mehreren Bytes besteht, ist die CPU in der Lage, mehrere Zeichen in einem einzigen Wort zu speichern und sie als einzelne Datenstücke zu behandeln? Wenn ich beispielsweise 4 Zeichen (mit einem 8-Bit-Schema codiert) in einem 32-Bit-langen Wort speichere, kann die CPU sie dann als eine Menge mit 4 Elementen verstehen? Oder ist es notwendig, ein einzelnes Zeichen in einem ganzen Wort zu speichern? Gibt es einen Standard oder gehen verschiedene Architekturen unterschiedlich damit um?
Ja, du kannst. Zum Beispiel sind die MSP430-Reihen von Texas Instruments 16-Bit-Prozessoren und haben 16-Bit-Wörter. Eine Vielzahl von Registern sind 16 Bit lang, können aber auch als 8-Bit-Register adressiert werden. Sein Speicherbus ist jedoch 16 Bit breit. Sie können problemlos 8-Bit-Bytes zum Speicher hinzufügen. Und verwenden Sie beide Bytes eines Speicherplatzes unabhängig voneinander oder zusammen, wenn Sie möchten.
Wenn Sie in C programmieren, hat ein Zeichen normalerweise die gleiche Größe wie die kleinste adressierbare Speichereinheit. Wenn die kleinste Sache, die Sie adressieren können, ein 16-Bit- oder 32-Bit-Wort ist, dann ist das ein Zeichen. In den meisten modernen Architekturen sind Zeichen 8 Bit lang und können in ein 32-Bit-Wort im Speicher gepackt werden. Aber in einigen wenigen (einigen DSPs) werden größere Bytes verwendet.
Es ist immer möglich, mit AND-, OR- und Shift-Operationen an einem Wortstück zu arbeiten, das kleiner als ein Byte ist. Auf diese Weise könnten Sie ASCII-Werte in 8 Bit packen, unabhängig davon, wie die Adressierung funktioniert. Das wäre jedoch nicht sehr portabel oder einfach zu handhaben.
Klingt sehr danach, als würden Sie über Gewerkschaften im C-Stil sprechen. In Kombination mit etwas Strukturmagie können Sie so dieselbe Sammlung von Bytes auf unterschiedliche Weise interpretieren, während Sie die Typen beibehalten. Der Compiler erledigt die Magie des Bitshifting/Bitmasking für Sie.
union data{
struct{
uint8_t byte1;
uint8_t byte2;
uint8_t byte3;
uint8_t byte4;
} bytes_individual;
uint32_t bytes_all;
}
union storage;
storage.bytes_all = 0x04030201;
storage.bytes_individual.byte1 == 0x04; // true
storage.bytes_individual.byte2 == 0x03; // true
// etc
Ich habe hier eine Little-Endian-CPU angenommen, also wird die niederwertigste Adresse zuerst gespeichert oder "LSB zuerst".
Ich habe auf diesen Link verwiesen, wenn Sie ein bisschen mehr recherchieren möchten: https://www.tutorialspoint.com/cprogramming/c_unions.htm
Wenn Sie Daten auf diese Weise komprimieren möchten, liegt dies bei Ihnen. Das Mikro wird tun, was Sie ihm sagen. Es kann sogar Anweisungen zum Manipulieren von 8-Bit-Datenstücken enthalten. Möglicherweise gibt es dafür bereits Bibliotheken. Es kann sein, dass Sie, wenn Sie einen C-Compiler/eine C-Bibliothek verwenden, die dafür geschrieben wurde, dies mit Daten der Zeichengröße zu tun, und Sie nicht einmal mit Low-Level-Routinen umgehen müssen.
Wenn Sie jedoch mit einem Cortex arbeiten, haben Sie wahrscheinlich genug RAM, sodass dies kein Problem darstellt.
Brian Carlton
Brian Carlton
Humberto Fioravante Ferro
Spannungsspitze
Brian Carlton