Forum: Compiler & IDEs Merkwürdiges Verhalten bei Bitmanipulation


von Paul P. (cesupa)


Lesenswert?

Hallo,

mir ist heute etwas merkwürdiges aufgefallen, als ich versuchte, die 
Bits einer uint64_t Variable zu manipulieren:
1
uart_init(UART_BAUD_SELECT(9600,16000000UL));
2
sei();
3
4
sig=0;
5
sig|=0x1;
6
7
uart_putc((char)(sig & 0x00));   //->00 wird angezeigt, ok
8
uart_putc((char)(sig & 0xFF));   //->00 wird angezeigt, müsste hier nicht 01 angezeigt werden???

unzwar setze ich die Variable auf 1 und lasse sie mir per UART ausgeben 
(mein terminal stellt die Ausgabe in Hex dar). Als erstes wird 00 
angezeigt, als zweites jedoch auch 00, dabei müsste doch die Anweisung 
sig & 0x00 die Variable sig nicht beschreiben, oder? Muss ich da jetzt 
also eine weitere Variable zum zwischenspeichern der ursprünglichen 
Variable verwenden?

Gruß
Paul

von Oliver (Gast)


Lesenswert?

Paul P. schrieb:
> //->00 wird angezeigt, müsste hier nicht 01 angezeigt werden???

müsste es. Das Problem steckt nicht in den gezeigten Zeilen.

0x00 und 0x01 sind allerdings auch kein darstellbaren Zeichen, was genau 
macht denn deine uart_putc?

Oliver

von Paul P. (cesupa)


Lesenswert?

Ich habe die Lib von Peter Fleury benutzt. Die Zeichen werden mir 
Hexadezimal angezeigt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Paul P. schrieb:

> mir ist heute etwas merkwürdiges aufgefallen, als ich versuchte, die
> Bits einer uint64_t Variable zu manipulieren:

Geht's mit einer 32-Bit Variablen?

von Guest (Gast)


Lesenswert?

Paul P. schrieb:
> sig|=0x1;

Versuch mal sig|=0x01; anstatt sig|=0x1;

von Oliver (Gast)


Lesenswert?

Guest schrieb:
> Versuch mal sig|=0x01; anstatt sig|=0x1;

Kann man versuchen, ist aber völlig sinnlos.

Was macht das Programm und der fragliche Parameter denn im Simulator?

Oliver

von Timmo H. (masterfx)


Lesenswert?

Paul P. schrieb:
> Ich habe die Lib von Peter Fleury benutzt. Die Zeichen werden mir
> Hexadezimal angezeigt.
Normalerweise würde ich von einer putc-Funktion erwarten, dass sie 
nicht automatisch eine Integer-Zahl in ein darstellbares Zeichen 
umwandelt.
Versuch mal:
1
uart_init(UART_BAUD_SELECT(9600,16000000UL));
2
sei();
3
4
sig=0;
5
sig|=0x1;
6
7
uart_putc((char)(sig & 0x00)+'0');   
8
uart_putc((char)(sig & 0xFF)+'0');

von Klaus W. (mfgkw)


Lesenswert?

Timmo H. schrieb:
> Normalerweise würde ich von einer putc-Funktion erwarten, dass sie
> nicht automatisch eine Integer-Zahl in ein darstellbares Zeichen
> umwandelt.

darum geht es doch gar nicht.
Er will die Daten nicht als Text übertragen, sondern 0 als 0
und 1 als 1 - und sie dann als Hex-Werte sehen.
Wenn ich ihn richtig verstanden habe.

Obwohl mit dem Begriff hexadezimal ja auch oft Schindluder
getrieben wird; wer weiß?

von Rolf Magnus (Gast)


Lesenswert?

Timmo H. schrieb:
> Paul P. schrieb:
>> Ich habe die Lib von Peter Fleury benutzt. Die Zeichen werden mir
>> Hexadezimal angezeigt.
> Normalerweise würde ich von einer putc-Funktion erwarten, dass sie
> nicht automatisch eine Integer-Zahl in ein darstellbares Zeichen
> umwandelt.

So wie ich es verstanden habe, macht das sein Terminal auf der 
Empfängerseite.

von Tom M. (tomm) Benutzerseite


Lesenswert?

Paul P. schrieb:
> Bits einer uint64_t Variable

Wie ist die byte order bei der avr-libc? Du gibst ja nur das erste Byte 
mittels (char)-Cast aus.

von Stefan E. (sternst)


Lesenswert?

Tom M. schrieb:
> Wie ist die byte order bei der avr-libc?

Irrelevant.

> Du gibst ja nur das erste Byte
> mittels (char)-Cast aus.

Nein, der Cast liefert das niederwertigste Byte.

von Paul P. (cesupa)


Lesenswert?

So, ich hab das ganze mal durch simulavr durchgejagt. Das ganze für 
einen Atmega8 (Atmega32 wird nicht unterstützt, aber es dürfte ja 
weitestgehend das gleiche Ergebnis rauskommen):
1
main.c:282: WARNING: Clock frequency option is not yet implemented.
2
3
Simulating a atmega8 device.
4
5
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TWBR' at 0x0020
6
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TWSR' at 0x0021
7
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TWAR' at 0x0022
8
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TWDR' at 0x0023
9
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ADCL' at 0x0024
10
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ADCH' at 0x0025
11
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ADCSRA' at 0x0026
12
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ADMUX' at 0x0027
13
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ACSR' at 0x0028
14
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'UBRRL' at 0x0029
15
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'UCSRB' at 0x002a
16
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'UCSRA' at 0x002b
17
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'UDR' at 0x002c
18
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'SPCR' at 0x002d
19
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'SPSR' at 0x002e
20
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'SPDR' at 0x002f
21
devsupp.c:332: MESSAGE: attach: IO Reg 'PIND' at 0x0030: created
22
devsupp.c:316: MESSAGE: attach: IO Reg 'DDRD' at 0x0031: ref = 0x0030
23
devsupp.c:316: MESSAGE: attach: IO Reg 'PORTD' at 0x0032: ref = 0x0030
24
devsupp.c:332: MESSAGE: attach: IO Reg 'PINC' at 0x0033: created
25
devsupp.c:316: MESSAGE: attach: IO Reg 'DDRC' at 0x0034: ref = 0x0033
26
devsupp.c:316: MESSAGE: attach: IO Reg 'PORTC' at 0x0035: ref = 0x0033
27
devsupp.c:332: MESSAGE: attach: IO Reg 'PINB' at 0x0036: created
28
devsupp.c:316: MESSAGE: attach: IO Reg 'DDRB' at 0x0037: ref = 0x0036
29
devsupp.c:316: MESSAGE: attach: IO Reg 'PORTB' at 0x0038: ref = 0x0036
30
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'UBRRH' at 0x0040
31
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'WDTCR' at 0x0041
32
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ASSR' at 0x0042
33
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'OCR2' at 0x0043
34
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCNT2' at 0x0044
35
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCCR2' at 0x0045
36
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ICR1L' at 0x0046
37
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ICR1H' at 0x0047
38
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'OCR1BL' at 0x0048
39
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'OCR1BH' at 0x0049
40
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'OCR1AL' at 0x004a
41
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'OCR1AH' at 0x004b
42
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCNT1L' at 0x004c
43
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCNT1H' at 0x004d
44
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCCR1B' at 0x004e
45
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCCR1A' at 0x004f
46
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'SFIOR' at 0x0050
47
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'OSCCAL' at 0x0051
48
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCNT0' at 0x0052
49
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCCR0' at 0x0053
50
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'MCUCSR' at 0x0054
51
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'MCUCR' at 0x0055
52
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TWCR' at 0x0056
53
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'SPMCR' at 0x0057
54
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TIFR' at 0x0058
55
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TIMSK' at 0x0059
56
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'GIFR' at 0x005a
57
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'GICR' at 0x005b
58
devsupp.c:332: MESSAGE: attach: IO Reg 'SPL' at 0x005d: created
59
devsupp.c:316: MESSAGE: attach: IO Reg 'SPH' at 0x005e: ref = 0x005d
60
devsupp.c:332: MESSAGE: attach: IO Reg 'SREG' at 0x005f: created
61
avrcore.c:475: MESSAGE: attach: Internal SRAM from 0x0060 to 0x045f
62
decoder.c:3875: MESSAGE: generating opcode lookup_table
63
main.c:415: MESSAGE: Simulating clock frequency of 16000000 Hz
64
decoder.h:59: WARNING: Unknown opcode: 0x0001
65
decoder.h:59: WARNING: Unknown opcode: 0x0002
66
decoder.h:59: WARNING: Unknown opcode: 0x0053
67
decoder.h:59: WARNING: Unknown opcode: 0x0001
68
decoder.h:59: WARNING: Unknown opcode: 0x0034
69
decoder.h:59: WARNING: Unknown opcode: 0x0084
70
decoder.h:59: WARNING: Unknown opcode: 0x0034
71
decoder.h:59: WARNING: Unknown opcode: 0x0020
72
decoder.h:59: WARNING: Unknown opcode: 0x0002
73
decoder.h:59: WARNING: Unknown opcode: 0x0028
74
decoder.h:59: WARNING: Unknown opcode: 0x0008
75
decoder.h:59: WARNING: Unknown opcode: 0x0005
76
decoder.h:59: WARNING: Unknown opcode: 0x0001
77
decoder.h:59: WARNING: Unknown opcode: 0x0074
78
decoder.h:59: WARNING: Unknown opcode: 0x0005
79
decoder.h:59: WARNING: Unknown opcode: 0x0001
80
decoder.h:59: WARNING: Unknown opcode: 0x0001
81
decoder.h:59: WARNING: Unknown opcode: 0x0060
82
decoder.h:59: WARNING: Unknown opcode: 0x0080
83
decoder.h:59: WARNING: Unknown opcode: 0x0060
84
decoder.h:59: WARNING: Unknown opcode: 0x0080
85
decoder.h:59: WARNING: Unknown opcode: 0x0046
86
decoder.h:59: WARNING: Unknown opcode: 0x0006
87
decoder.h:59: WARNING: Unknown opcode: 0x0001
88
memory.c:259: WARNING: **** Attempt to write invalid io reg: UBRRH at 0x0040
89
memory.c:259: WARNING: **** Attempt to write invalid io reg: UBRRL at 0x0029
90
memory.c:259: WARNING: **** Attempt to write invalid io reg: UCSRB at 0x002a
91
memory.c:259: WARNING: **** Attempt to write invalid io reg: UBRRH at 0x0040
92
memory.c:224: WARNING: **** Attempt to read invalid io reg: UCSRB at 0x002a
93
memory.c:259: WARNING: **** Attempt to write invalid io reg: UCSRB at 0x002a
94
memory.c:224: WARNING: **** Attempt to read invalid io reg: UCSRB at 0x002a
95
memory.c:259: WARNING: **** Attempt to write invalid io reg: UCSRB at 0x002a

Ich lass mir das ganze im Terminal als Hex anzeigen. Da sehe ich ja, ob 
eine 1 reingeschrieben wurde oder nicht.

von Oliver (Gast)


Lesenswert?

Der AVR-Studio-Simulator mit aktueller Atmel-toolchain unter Windows 
schreibt da eine 1 rein.

Oliver

von Paul P. (cesupa)


Lesenswert?

Ich mach das ganze unter Linux und eclipse mit AVR-Plugin. Als compiler 
wird der avr-gcc-4.3.4 verwendet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.