Not logged in. · Lost password · Register

King-Chris
Member since Oct 2012
31 posts
Subject: 10 bit Wert vom Poti gleichmäßig aufteilen / Nebenläufigkeit und Variablen verschiedener Kategorien
Während der Konfigurationsphase wird ein Countdown-Anfangswert durch das
Potentiometer eingestellt, dessen Wert mit der Bibliotheksfunktion
uint16_t poti_read(void);
abgefragt werden kann. Die Funktion liefert einen 10-Bit-Wert zurück. Dessen Wer-
tebereich soll gleichmäßig auf die Werte von 1 und 8 abgebildet werden.

Passt folgende einfache Idee ?

uint8_t wert = poti_read / 128 +1 ;

Rechts rechnet er ja mit 16bit und am Ende kommen ja nur Werte von 1 bis 8 (also sind 8 bit völlig ausreichend) heraus. Wird in C eigentlich immer so gerundet, dass Nachkommastellen abgeschnitten werden ? Dann hätte ich ja als höchsten Wert 1023/128 = 7,999 und das wäre dann quasi 7.

Oder gibt es eine bessere Idee dafür ?

Und zur 2. Frage :

b) Welche Bedeutung haben die unterschiedlichen Gültigkeitsbereiche von Variablen
in einem C-Programm in Bezug auf Nebenläufigkeit bei Interrupts (d. h. wie sind
Variablen der verschiedenen Kategorien von Nebenläufigkeitsproblemen betroffen
und warum ist dies so)? (4 Punkte)

Bei lokalen Variablen könnte es sein, dass sie einfach verloren gehen.
Man sollte ja auf jeden Fall Variablen mit volatile deklarieren, weil ansonsten Änderungen vom ISR in der main nicht sichtbar sind. ( Hier weiß ich allerdings nicht, ob das überhaupt zur Frage passt)
Zudem sollte man die Variablen ja mit static deklarieren, das habe ich allerdings noch nicht ganz verstanden warum.

Kann mir jemand die Fragen beantworten und evtl. ergänzen ? Im Script finde ich zwar die Tabelle zur Sichtbarkeit und Lebensdauer von Variablen und natürlich zu volatile, aber der Zusammenhang mit Nebenläufigkeit erschließt sich mir bis auf die Verwendung von volatile nicht.
This post was edited on 2013-07-23, 15:54 by King-Chris.
killermiller
Member since May 2011
41 posts
Quote by King-Chris:
Während der Konfigurationsphase wird ein Countdown-Anfangswert durch das
Potentiometer eingestellt, dessen Wert mit der Bibliotheksfunktion
uint16_t poti_read(void);
abgefragt werden kann. Die Funktion liefert einen 10-Bit-Wert zurück. Dessen Wer-
tebereich soll gleichmäßig auf die Werte von 1 und 8 abgebildet werden.

Passt folgende einfache Idee ?

uint8_t wert = poti_read / 128 +1 ;

Rechts rechnet er ja mit 16bit und am Ende kommen ja nur Werte von 1 bis 8 (also sind 8 bit völlig ausreichend) heraus. Wird in C eigentlich immer so gerundet, dass Nachkommastellen abgeschnitten werden ? Dann hätte ich ja als höchsten Wert 1023/128 = 7,999 und das wäre dann quasi 7.

Oder gibt es eine bessere Idee dafür ?
Das passt so...
Der besseren Nachvollziehbarkeit halber wäre ne Klammerung der Division nett, aber da Punkt vor Strich gilt, funktionierts auch so.
Deine Erklärung mit 16 und 8 bit ist korrekt so.

Das mit 1023/128=7,9=7 stimmt auch. C macht das allerdings nicht immer so, sondern nur bei Integer-Division, die auf dem µC der Normalfall ist. Willst du explizit mit Kommazahlen arbeiten (Floating-Point-Operationen), musst du das dem Compiler klar machen, z.b. in dem du eine der Zahlen explizit als Kommazahl angibst. Beispielsweise müsste 1023/128.0 funktionieren. Diese Art Berechnung dauert auf dem µC allerdings deutlich länger, da keine eigenen Hardware-Funktionen dafür zur Verfügung stehen und das Ganze in Software aus der normalen Arithmetik "gebastelt" werden muss - mit entsprechend mehr Berechnungen.
Wenn du das Ergebins dann wieder auf int castest, wird alles hinter dem Komma wieder abgeschnitten.
The_Tricker
Member since Jul 2013
12 posts
In reply to post #1
Quote by King-Chris:
Und zur 2. Frage :

b) Welche Bedeutung haben die unterschiedlichen Gültigkeitsbereiche von Variablen
in einem C-Programm in Bezug auf Nebenläufigkeit bei Interrupts (d. h. wie sind
Variablen der verschiedenen Kategorien von Nebenläufigkeitsproblemen betroffen
und warum ist dies so)? (4 Punkte)


Bei lokalen Variablen könnte es sein, dass sie einfach verloren gehen.
Man sollte ja auf jeden Fall Variablen mit volatile deklarieren, weil ansonsten Änderungen vom ISR in der main nicht sichtbar sind. ( Hier weiß ich allerdings nicht, ob das überhaupt zur Frage passt)
Zudem sollte man die Variablen ja mit static deklarieren, das habe ich allerdings noch nicht ganz verstanden warum.

Kann mir jemand die Fragen beantworten und evtl. ergänzen ? Im Script finde ich zwar die Tabelle zur Sichtbarkeit und Lebensdauer von Variablen und natürlich zu volatile, aber der Zusammenhang mit Nebenläufigkeit erschließt sich mir bis auf die Verwendung von volatile nicht.

Ich würde das ganze in global, lokal, static und nicht-static unterteilen. Bin mir ziemlich sicher, dass das so laufen sollte:

Bezüglich lokal/global:
Lokale Variablen existieren ja nur innerhalb der Funktion und sind daher in der Interruptbehandlung überhaupt nicht sichtbar. Dementsprechend gibt es keine Nebenläufigkeit

Globale Variablen:
Static: Sind nur innerhalb des Moduls sichtbar, in dem sie erstellt wurden. Es kann zu Nebenläufigkeit innerhalb des Moduls kommen (static in c entspricht im Prinzip private in Java, falls dir das weiter hilft).
Nicht-Static: Es kann zu Nebenläufigkeit kommen (keine Ahnung, was man da noch spezifizieren kann)


Volatile hat damit doch gar nichts zu tun (zumindest nicht mit Gültigkeit). Klar ist es sinnvoll, wenn die globalen Variablen volatile sind, aber das hat nur den sinn, dass die Variable vor jeder Änderung aus dem Speicher geladen und nach jeder Änderung in den Speicher zurückgeschrieben wird.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
The_Tricker: Stimmt. Bis auf das mit dem volatile: Das hat nichts damit zu tun ob die variable global ist oder nicht. Es macht wirklich nur bei Nebenläufigkeit Sinn - oder wenn man aktiv warten will. - Wobei hier Nebenläufigkeit ja nicht nur durch Interrupts sondern durch die Hardwareregister verursacht werden kann. Für die SPiCler kommt noch das BS und oder andere Threads hinzu.
King-Chris
Member since Oct 2012
31 posts
Ist die Antwort von the Tricker auch schon ausreichend ?

Es gab nochmals eine Frage über den Unterschied von lokalen und globalen static Variablen im Bezug auf Nebenläufigkeit in einem Programm. Die gibt aber 3 Punkte.

Meine Antwort wäre folgende bisher :

Die lokale static-Varibale ist für den Interrupt Handler gar nicht sichtbar. Somit kann es hier auch nicht zu Nebenläufigkeit kommen.
Im Gegenzug dazu kann es bei der globalen static-Variable zu Nebenläufigkeit kommen ( Ich denke mal ein Programm besteht aus vielen Modulen, deshalb würde ich noch erwähnen : Innerhalb dieses Moduls)
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Special characters:
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen