Not logged in. · Lost password · Register

All posts by The_Tricker (12)

topic: SPiC Klausur 26.7 fertig Korrigiert - Ergebnisse gibt es nächste Woche  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
The_Tricker
Member since Jul 2013
12 posts
hui
topic: Multiple Choice  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
The_Tricker
Member since Jul 2013
12 posts
In reply to post ID 6124
danke soweit. Aber was ist es jetzt bei der hier:

März 2012
a) Welche Aussage zum Thema Polling und Interrupts ist richtig?
1 Beim Pollen eines Gerätes muss man selektiv dessen Interrupts sperren,
um explizit Daten zu synchronisieren.
2 Interrupts haben den Nachteil, dass sie nicht mit Präprozessormakros funktionieren.
3 Geräte, die flankengesteuerte Interrupts auslösen können, lassen sich grundsätzlich
nicht pollen.
4 Bei hochfrequenten Geräteereignissen erzeugt Polling eine hohe CPU-Last


Stimmt jetzt die 4, weil man so oft pollen muss ?
topic: Multiple Choice  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
The_Tricker
Member since Jul 2013
12 posts
In reply to post ID 6114
Hier noch die Fragen:
März 2012
a) Welche Aussage zum Thema Polling und Interrupts ist richtig?
1 Beim Pollen eines Gerätes muss man selektiv dessen Interrupts sperren,
um explizit Daten zu synchronisieren.
2 Interrupts haben den Nachteil, dass sie nicht mit Präprozessormakros funktionieren.
3 Geräte, die flankengesteuerte Interrupts auslösen können, lassen sich grundsätzlich
nicht pollen.
4 Bei hochfrequenten Geräteereignissen erzeugt Polling eine hohe CPU-Last


Juli 2008

a) Welche Aussage zu Zeigern ist richtig?
❏ Die Übergabesemantik für Zeiger als Funktionsparameter ist callby-
value.
❏ Die Übergabesemantik für Zeiger als Funktionsparameter ist call-by-reference.
❏ Ein Zeiger kann zur Manipulation von schreibgeschützten Datenbereichen verwendet
werden.
❏ Zeiger vom Typ void* sind am besten für Zeigerarithmetik geeignet, da Sie
kompatibel zu jedem Zeigertyp sind.

d) Welche der folgenden Aussagen bzgl. der Interruptsteuerung trifft zu?
❏ Pegel-gesteuerte Interrupts werden beim Wechsel des Pegels ausgelöst,
daher der Name.
❏ Interrupts sind eine Besonderheit von AVR-Mikroprozessoren. Auf anderen
Architekturen kommen POSIX-Signale zum Einsatz.
❏ Pegelgesteuerte Interrupts müssen durch Polling des Pegels abgefragt werden.
❏ Wurde gerade ein Flanken-gesteuerter Interrupt ausgelöst, so muss erst ein
Pegelwechsel der Interruptleitung stattfinden, damit erneut ein Interrupt ausgelöst
werden kann.


f) Welche Aussage zu folgender Funktion ist richtig?
int *foo() {
static int bar = 0;
bar++;
return &bar;
}
❏ Die Funktion liefert einen Zeiger auf die lokale Variable bar zurück. Dies ist in
C nicht zulässig und führt zu einem Übersetzungsfehler.
❏ Beim Verlassen der Funktion foo() wird die automatic-Variable bar vom Stack
entfernt und der Zeiger verliert seine Gültigkeit. Ein Zugriff durch den Aufrufer
führt zu zufälligen Ergebnissen.
❏ Die Variable bar ist über die Laufzeit der foo()-Funktion hinaus gültig. Daher
kann der zurückgelieferte Zeiger sicher vom Aufrufer verwendet werden.
❏ Die Variable bar enthält beim Verlassen der foo()-Funktion immer den Wert 1,
da bar bei jedem Aufruf von foo() mit 0 initialisiert wird.


g) Was ist keinesfalls eine Eigenschaft eines Hardware-Timers?
❏ Ein Hardware-Timer ist ein Register welches mit der steigenden
oder fallenden Flanke eines angelegten Taktes inkrementiert wird.
❏ Ein Hardware-Timer kann beim Überlauf einen Interrupt generieren.
❏ Durch Vorschaltung einer Prescalereinheit kann die Taktrate des Timers erhöht
werden.
❏ Eine CTC-Einheit (Clear Timer on Compare Match) kann im Zusammenspiel
mit einer Output-Compare-Einheit zur periodischen Generierung von Interrupts
verwendet werden.
topic: Multiple Choice  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
The_Tricker
Member since Jul 2013
12 posts
Subject: Multiple Choice
Juli 2008:
a) Welche Aussage zu zeigern ist richtig?
Ausschlussverfahren:
2 ist wurde mir mal gesagt, dass es falsch ist. aber ich weiß nicht genau wie so (wäre für erklärung dankbar)
3 ist ja müll.
und 4 ist müll, weil die Zeiger ja immer im bezug auf ihren Typ verwendet werden.

also ist die 1 richtig oder?

d) Welche Der folgenden Aussagen bzgl der Interruptsteuerung ist richtig ?
Ausschlussverfahren
1. ist falsch
4. ist falsch
3. würde ich auch falsch sagen, weil da man doch nie abgefragt MUSS oder ?
Meine lösung wäre  2.

f) Welche Aussage zu folgender Funktion ist richtig?
int *foo() {
static int bar = 0;
bar++;
return &bar;
}

1. müll
2. bar ist static => müll
3. bin ich mir nicht sicher. Aber es bleibt doch eigtl nur der Speicherplatz reserviert, nicht die Variable selber?
4. klingt auch sinnvoll. Im zweifelsfall würde ich die hier ankreuzen.
Also ich schwanke noch zwischen 3. und 4.

g) Was ist keinesfalls eine Eigenschaft eines Hardware-Timers?
1. stimmt
4. stimmt
2. kann ein hardware timer überlaufen? klingt aber sonst schon sinnvoll
3. würde ich ankreuzen. Ich weiss, dass durch diese Prescalereinheit die Taktrate des Timers GETEILT werden kann. Dann kann sie dadurch doch nicht erhöht werden oder?

März 2012
a) Welche Aussage zum Thema Polling / Interrupts ist richtig?
3 oder 4
3. klingt logisch, weil die flankengesteuerten Interrupts doch super schnell passieren. die erwischt man doch mit Polling gar nicht, oder?
4. Polling kann doch unheimlich viel speicher verbrauchen, gerade wenn es sehr fein eingestellt ist, also stimmt die aussage damit? hat das was mit den Geräteereignissen zu tun?


Freue mich auf eine Antwort
topic: 10 bit Wert vom Poti gleichmäßig aufteilen / Nebenläufigkeit und Variablen verschiedener Kategorien  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
The_Tricker
Member since Jul 2013
12 posts
In reply to post ID 6065
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.
topic: Juli 2012 2b) stringstack  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
The_Tricker
Member since Jul 2013
12 posts
In reply to post ID 6059
super danke!
topic: Juli 2012 2b) stringstack  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
The_Tricker
Member since Jul 2013
12 posts
In reply to post ID 6042
denkt euch das "struct" in meinem Code vor den elem- Objekten weg :D

die struct schaut übrigens so aus:
struct elem {
   struct elem * next;
   char * str;
}
topic: Juli 2012 2b) stringstack  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
The_Tricker
Member since Jul 2013
12 posts
Subject: Juli 2012 2b) stringstack
Erstmal die Angabe:
Klausur „Systemnahe Programmierung in C“ / Bachelor Mechatronik-Mathematik-Technomathematik Juli 2012
- 10 von 15 -
Aufgabe 2b: stringstack (18 Punkte)
Sie dürfen diese Seite zur besseren Übersicht bei der Programmierung heraustrennen!
Implementieren Sie ein Modul
stringstack
, in dem man Zeichenketten speichern
kann und das die zuletzt hinzugefügte Zeichenkette als erstes wieder zurück gibt.
Im Detail soll das Modul
stringstack
folgendermaßen funktionieren:
– Zur internen Verwaltung der Zeichenketten wird eine verkettete Liste verwen-
det. Der Aufbau der Listenelemente ist vorgegeben (
struct elem
).
– Die Funktion
int pushstr(char* st)
bekommt eine Zeichenkette übergeben,
speichert diese möglichst platzsparend und fügt sie mit Hilfe eines neues Lis-
tenelements am Anfang der verketten Liste ein.
Im Fehlerfall wird -1 zurückgegeben (an dieser Stelle keine Meldung ausge-
ben).
– Die Funktion int popstr(char *buf, int bufsize) überprüft zunächst, ob der
übergebene Puffer für die zu entnehmende Zeichenkette groß genug ist. Ist er
zu klein, wird die tatsächlich benötigte Puffergröße zurückgegeben.
Andernfalls wird das erste Element aus der verketten Liste entnommen und
die zugehörige Zeichenkette in den übergebenen Puffer kopiert.
Im Erfolgsfall wird 0 zurückgeliefert, befinden sich keine Elemente in der
Liste wird -1 zurückgeliefert.
Achten Sie auf die Behandlung möglicher Fehler sowie darauf, dass allokierter Spei-
cher jeweils so bald wie möglich wieder freigegeben wird.

Hier mein Code zur pushstr:

static struct elem head;

int pushstr (char* str) {
    if (st == NULL) {
        return -1;
    }
    struct elem insert;
    insert.str = st;
   
    if(head == NULL){
        head = insert;
    } else {
        struct elem tmp = head;
        while(tmp.next != NULL) {
            tmp = tmp.next;
        }
        tmp.next = insert;
    }
}

Funktioniert das so? Ich verstehe nicht ganz wie die struct elem funktioniert. Wir haben doch einfach bei jeden elem-Objekt einen next-Zeiger und einen String. Also kann ich mir doch einfach mal so nen head erstellen und dann stück für stück durchgehen, an welcher Stelle ich bin.

Krieg ich bei der abfrage "while(tmp.next!= NULL) unter umständen ne Nullpointer exception raus? Das befürchte ich nämlich. Weiss aber nicht wie icch das verhindern kann. Hab leider keine möglichkeit das hier zuhause ordentlich zu kompilieren.

Freue mich über hilfe! :)
topic: Inialisierungsfunktion  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
The_Tricker
Member since Jul 2013
12 posts
In reply to post ID 6035
Quote by ingonör:
Jetzt von mir nochmal eine Frage für Dumme:

Taster gegen Masse verbunden: Interrupt bei fallender Flanke.
Taster mit Masse verbunden: Interrupt bei steigender Flanke.

Richtig?

Das würde mich auch interessieren :)
topic: Inialisierungsfunktion  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
The_Tricker
Member since Jul 2013
12 posts
In reply to post ID 6031
Die Tilde hab ich beim abschreiben vergessen danke :)

Hier die Angabe:

Information über die Hardware
LEDs:
PORTA, Pins 0-7, Start bei LED 1 an Pin 0, eingeschaltet bei low-Pegel
- Pin als Ausgang konfigurieren: entsprechendes Bit in DDRA-Register auf 1
Schloss:
PORTB, Pin 5, offen bei high-Pegel, geschlossen bei low-Pegel
- Pin als Ausgang konfigurieren: entspr. Bit in DDRB-Reg. auf 1
Taster:
PORTD, "Null"-Taster (Taster 0) = Pin 2, "Eins"-Taster (Taster 1) = Pin 3
- Pin als Eingang konfigurieren: entsprechendes Bit in DDRD-Register auf 0
- externe Interruptquellen INT0 und INT1, ISR-Vektor-Makros:
INT0_vect und INT1_vect
- Aktivierung der Interruptquellen erfolgt durch Setzen des INT0 - bzw. INT1 -Bits im Register GICR
- die Taster verbindeen den Pin mit Masse, es müssen die internen Pullup-Widerstände
verwendet werden (entsprechende Bits in PORTD-Register auf 1 setzen).
- Konfiguration der externen Interruptquellen 0 und 1 (Bits in Register MCUCR)

Interrupt 0                     Beschreibung                    Interrupt 1
ISC01 ISC00                                                        ISC11 ISC10
0 0 Interrupt                   bei low Pegel                    0 0
0 1 Interrupt                   bei beliebiger Flanke           0 1
1 0 Interrupt                   bei fallender Flanke            1 0
1 1 Interrupt                    bei steigender Flanke        1 1


meine neue Init:

static void init (void) {
    DDRA = 255;        // LEDs ; auf ausgang
    PORTA = 255;   
    DDRB |= (1<<5);
    PORTB &= ~(1<<5);
    DDRD &= ~((1 << 2) | (1 << 3));        // P2 Nulltaster, P3 eins-taster
    PORTD |= ((1<<2) | (1<<3));
    MCUCR |= (1<<ISC11);    // fallende flanke
    MCUCR &= ~(1<<ISC10);
    MCUCR |= (1 << ISC01);
    MCUCR &= ~(1 << ISC00);
    GICR |= (1<< INT0);    // setze INT0
    GICR |= (1<< INT1); // setze INT1
}
topic: Inialisierungsfunktion  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
The_Tricker
Member since Jul 2013
12 posts
Subject: Inialisierungsfunktion
Klausur Juli 2012

Meine Initialisierungsfunktion schaut wie folgt aus. Wäre super wenn ihr da mal drüber schaut, ob ich das alles so richtig verstandne hab:

static void init (void) {
    DDRA = 255;                                // LEDs ; auf ausgang
    PORTA = 255;   
    DDRB |= (1<<5);
    PORTB &= ~(1<<5);
    DDRD &= ((1 << 2) | (1 << 3));        // P2 Nulltaster, P3 eins-taster
    PORTD |= ((1<<2) | (1<<3));
    MCUCR |= (1<<ISC11);    // fallende flanke
    MCUCR &= ~(1<<ISC10);
    GICR |= (1<< INT0);    // setze INT0
    GICR |= (1<< INT1); // setze INT1
}
topic: Klausur (Gaaaaaaaaaaaanz viele Fragen)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
The_Tricker
Member since Jul 2013
12 posts
Subject: Klausur
Gleich zur 1. Frage.
Juli 2008
A3 d) Erstmal meine Antwort:
high-pegel als Licht einstellen
low-pegel wenn Schranke durchbrochen ist (Schatten)
bei fallender Flanke timer aktivieren und möglichst fein einstellen
im Timer wird hochgezaehlt
bei steigender Flanke Timer canceln und hochgezaehlten Wert auslesen


Ich bin mir nicht ganz sicher, was man da noch schreiben soll. Genügt das schon? Ich will halt immer bei dem Wechsel von dem, dass das Licht nicht durchbrochen ist zum durchbruch nen Interrupt machen, und die Zeit bis dahin wo der Lichtstrahl wieder ununterbrochen ist einen Timer laufen lassen. Dafür muss er natürlich sehr fein eingestellt sein.
Was soll das mit der Prescaler Einheit?
Übersehe ich etwas oder hab ich alles wichtige dastehen?

mfg
The_Tricker
Close Smaller – Larger + Reply to this post:
Special characters:
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen