Zwei Bytes zusammenfassen

Gast #4307247
Wenn 256 Bytes Platz im Flash ist, kann man eine Tabelle verwenden:

neues_byte = (table[byte0] << 4) + table[byte2];

Das Schieben könnte man auch noch einsparen, wenn man nochmal 256 Bytes 
Flash spendiert.
Gast #4307257
Fridel schrieb:
> Byte 0          Byte 2
> 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
>
> Neues Byte
> 7 5 3 1 7 5 3 1

Byte A
a7 a6 a5 a4 a3 a2 a1 a0

Byte B
b7 b6 b5 b4 b3 b2 b1 b0

Neues Byte
a7 a5 a4 a3 a1 b7 b5 b3 b1


Das geht nicht einfach, da must du jedes Bit manuell an die richtige 
Stelle schieben:

Wolfgang R. schrieb:
> neues_byte = byte0&0x80 + ((byte0&0x20)<<2) + ((byte0&0x08)<<4) + ...
Gast #4307271
@ Wolfgang

Das Prinzip funktioniert. Verschlingt allerdings 50 Bytes.
1
nb  = (b0 & 0x80)
2
   + ((b0 & 0x20) << 1)
3
   + ((b0 & 0x08) << 2)
4
   + ((b0 & 0x02) << 3)
5
   + ((b1 & 0x80) >> 4)
6
   + ((b1 & 0x20) >> 3)
7
   + ((b1 & 0x08) >> 2)
8
   + ((b1 & 0x02) >> 1);
Gast #4307489
Keine Ahnung :-)
1
; result in R0, byte 1 in R1, byte 2 in R2
2
; destroys R1 and R2 ! 22 CLKs!
3

4
rol R1  ; bit to carry
5
rol R0  ; carry to result
6

7
rol R1  ; skip one bit
8
rol R1  ; bit to carry
9
rol R0  ; carry to result
10

11
rol R1  ; skip one bit
12
rol R1  ; bit to carry
13
rol R0  ; carry to result
14

15
rol R1  ; skip one bit
16
rol R1  ; bit to carry
17
rol R0  ; carry to result
18

19
rol R2  ; bit to carry
20
rol R0  ; carry to result
21

22
rol R2  ; skip one bit
23
rol R2  ; bit to carry
24
rol R0  , carry to result
25

26
rol R2  ; skip one bit
27
rol R2  ; bit to carry
28
rol R0  ; carry to result
29

30
rol R2  ; skip one bit
31
rol R2  ; bit to carry
32
rol R0  ; carry to result
Gast #4307509
Hallo,

ernsthafte Frage (ganz ohne Ironie):

Fridel, wofür soll das gut sein? Was kommt da heraus ausser das ein Byte 
verschwindet - steckt da irgendeine clevere Logik dahinter?

mfg
C-Beginner
Moderator #4307537
In C (mit AVR-Builtin __builtin_avr_insert_bits):

1
#include <stdint.h>
2

3
uint8_t oddbits(uint8_t byte0, uint8_t byte2) {
4
  byte0 = __builtin_avr_insert_bits (0x7531ffff, byte0, byte0);
5
  byte0 = __builtin_avr_insert_bits (0xffff7531, byte2, byte0);
6
  return byte0;
7
}


Das ergibt:

1
oddbits:
2
  mov r0,r24
3
  bst r0,1
4
  bld r24,4
5
  bst r0,3
6
  bld r24,5
7
  bst r0,5
8
  bld r24,6
9
  bst r22,1
10
  bld r24,0
11
  bst r22,3
12
  bld r24,1
13
  bst r22,5
14
  bld r24,2
15
  bst r22,7
16
  bld r24,3
17
  ret
Gast #4307587
Yalu X. schrieb:

> In C (mit AVR-Builtin __builtin_avr_insert_bits):
[...]

D.h.: Mit der doch recht speziellen Kenntnis einer einzigartigen 
Besonderheit des AVR-GCC kann man in C immerhin (nicht ganz) die 
Performance erreichen, die in Assembler möglich ist, wenn man einfach 
nur die rund hundert simplen Instruktionen des AVR kennt und beherrscht 
(statt der hunderte Seiten füllenden Details von C an sich und der 
weitere hunderte Seiten füllenden Beschreibungen eines speziellen 
Compilers bezogen auf ein spezielles Target-System)?

Außerdem: Sollten die angeblich doch so hocheffizent optimierenden 
C-Compiler nicht einfach alleine herausfinden können, wann der Einsatz 
der spezialisierten Macros sinnvoll wäre? Algorithmisch sehe ich da 
jedenfalls kein Problem. Es muß also wohl daran liegen, dass die 
Compiler doch nicht so gut sind, wie die C-Apologeten immer behaupten, 
dass sie es wären...
Gast #4307611
> D.h.: Mit der doch recht speziellen Kenntnis einer einzigartigen
> Besonderheit des AVR-GCC kann man in C immerhin (nicht ganz) die
> Performance erreichen, ...

Deinem Beitrag entnehme ich, dass es in Assembler noch besser umzusetzen 
ist (kürzer?, schneller?). Kannst du ein Programm posten?
Gast #4307618
Das von Knut Ballhause. Wenn man wie Yalu X. ein Quellbyte mit dem 
Zielbyte überschreibt, dann kann man Byte0 durch Byte2 ersetzen, die 
ersten beiden Zeilen weglassen, und ist bei 14 Takten.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.