Zwei Bytes zusammenfassen

Gast #4307247
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
@ 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
Lesenswert?
• ▲
▼
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
Moderator #4307537
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
> 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?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.