Not logged in. · Lost password · Register

Page:  1  2  3  next 

All posts by killermiller (41)

topic: Klausur März 2014 (Aufgabe 3)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
Doch, das passt defintiv und reicht auch aus.
Die Musterlösung liest sich nicht viel anders (eigentlich sogar ziemlich genau so.) .
Bei den Freitextfragen bekommt man relativ leicht Punkte, normalerweise braucht's nicht mal so viel Text dazu, Stichpunkte reichen wirklich aus :)
topic: MC Fragen  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 7230
1e) einen "C-Prozessor" gibt es nicht. Wenn es der Präprozessor ist, stimmt 4. Das zweite, auflösen von Referenzen auf Bibliotheken macht (genauso wie 1. binden von o-dateien) der Linker(=Binder). Ungenutzte Variablen werden erst während dem Kompilieren (zwischen Präprozessor und Linker/Binder) entfernt.

1f) bei einer union liegen alle Variablen im selben Speicherbereich, quasi übereinander. Eine Union ist deshalb immer so groß wie die größte vorkommenden Einzelvariable. Die beiden Einzelvariablen sind hier ein 16-bit Integer und eine Structure mit 2x8 Bit, also auch 16 Bit. Deshalb belegt die union "reg" 16 Bit.
Wäre r16 vom typ uint32_t, wäre die ganze union 32 Bit groß, ebenso wenn die beiden "Teilvariablen" lo und hi im struct jeweils 16 Bit groß wären. Wäre lo 8 Bit und hi 16 Bit, wäre die gesamte union 24 Bit groß.
Langer Rede kurzer Sinn: 16 Bit, 2 Byte, 1. Antwort.
Für die Klausur hier aufpassen mit Bits und Bytes (eine int16-Variable belegt 16 _Bit_, das sind 2 _Byte_ (1 Byte=8 Bit).

1g)Ja, 4 ist richtig, wegen Bereichsüberlauf. Die erste ist falsch, kommt auf Compiler und Architektur an (deshalb sollt ihr auch die expliziten Deklarationen verwenden, also in16_t etc). Die zweite ist auch falsch, das Vorzeichenbit geht von den 8 Bit weg, sodass nur noch 7 Bit für die eigentliche Zahlt zur Verfügung stehen. Die dritte ist natürlich falsch, man kann Variablen mit anderen Werten als 0 initialisieren.

1a) Die zweite ist richtig, allerdings können Zeiger unterschiedlich groß sein, je nach Architektur. Also z.B. auf einem AVR-Mikrcontroller und auf einem x86-PC unterschiedlich groß, auf einem AVR aber immer gleich groß. Nur bin ich mir nicht sicher, dass es 4 Byte sind. Eigentlich bin ich mir fast sicher, dass es nicht 4 Byte sind, eher weniger.
This post was edited on 2015-07-24, 18:53 by killermiller.
topic: Multiple-Choice-Fragen  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 7206
Zu zwei:
Das muss jemand anderes beantworten...

Zu drei:
genau.
Bzw...zweite Antwort kann richtig sein, aber "kann richtig sein" reicht nicht; es muss sicher richtig sein, v.a. wenn eine sicher richtige Antwort dabei ist.
topic: Multiple-Choice-Fragen  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 7203
Zu Aufgabe 3:
Parameterlos ist eine Funktion scheinbar nur dann, wenn sie mit f(void) deklariert wurde. Man kann diese hier zwar auch ohne Parameter aufrufen, aber eben auch mit allem anderen, damit fällt die erste Antwort weg.
Die zweite Antwort kanns nur sein, wenn alle anderen defintiv falsch sind.
Der Compiler in der relevanten, verwendeten Version, nämlich der für C, scheint das dann ohne Fehler zu akzeptieren, damit ist auch die dritte Antwort falsch.
Aus Syntaktischer Sicht kann der Rückgabewert -wie bei jeder anderen Funktion- ignoriert werden, damit ist die vierte Antwort "am richtigsten" und wäre hier die gesuchte.

Zu Aufgabe 4:
genau.
topic: Multiple-Choice-Fragen  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 7201
Quote by Raim:
Quote by killermiller:
Zur dritten Frage:
[...] muss nach Ausschlussprinzip und Klausuvorgabe (genau eine ist richtig) die zweite Stimmen.

Eine rekursive Funktion wäre eine, die sich selbst aufruft. Also beispielsweise so eine:

  1. int fak(int n) {
  2.     if (n == 0) return 1;
  3.     return n * fak(n - 1);
  4. }

Es lässt sich aber nicht an der Deklaration ablesen, ob das der Fall ist.

Das war das, was ich mit "lässt sich ohne den inneren Aufbau der Funktion nicht sagen" meinte :)
Wie du richtig sagst, kann man allein aus der Deklaration nichts darüber aussagen.
Man kann's also auch nicht ausschließen. Und wenn die anderen drei falsch sind, bleibt nur noch das.
Zugegeben, das ist unrealistisch.
Aber was stimmt denn jetzt?
Hab die Frage leider in den Altklausuren nicht gefunden, und damit auch die Musterlösung nicht =/
topic: Multiple-Choice-Fragen  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 7199
Zur ersten Frage:
2 ist richtig; das einzige, was "Datentyp" enthält und damit an dieser Stelle zu dem "typedef" passt.


Zur zweiten Frage:
Antwort 3 ist richtig.
Die ganzen #-Sachen macht der Präprozessor, nicht der Linker/Binder

Zur dritten Frage:
Spontan würde ich sagen, mit der richtigen Argumentation kannst du Antworten 1-4 als richtig durchbringen ;)
Die erste Antwort hängt von der Definition von "parameterlos" ab, du kannst der Funktion durchaus keine Parameter übergeben, du kannst aber auch alles beliebige übergeben. Man könnte aber auch sagen, die Funktion ist mit "offenen Parametern" deklariert, dann wäre die Antwort falsch.
Die dritte Antwort kann je nach Compiler-Version richtig oder falsch sein. Irgend ein alter C-Compiler frisst das wahrscheinlich ohne Beschwerden, ein aktueller C++-Compiler bringt mindestens eine Warnung (mit -werror dann auch einen Fehler, wenn nur "Error" als Fehler gezählt wird).
Die vierte Antwort kann je nach Funktion richtig sein, aber rein syntaktisch is se auf jeden Fall richtig, du kannst die Funktion defintiv verwenden, ohne den Rückgabewert weiter zu beachten. Man könnte auch argumentieren, dass der Rückgabewert evtl wichtige Informationen enthält und geprüft werden sollte.
Zur zweiten Antwort kann ohne Kenntnis des inneren Aufbaus der Funktion keine Aussage getroffen werden. Aber wenn ich davon ausgehe, dass die anderen drei falsch sind, muss nach Ausschlussprinzip und Klausuvorgabe (genau eine ist richtig) die zweite Stimmen.
(Ich hoffe, das war jetzt nicht zu falsch)

Zur vierten Frage:
Antwort 2 ist richtig, weil die lokale static-Variable im Speicher wie eine globale Variable behandelt wird, also verfügbar bleibt.
Antwort 3 ist deshalb falsch, weil die Initialisierung nur einmal aufgerufen wird, beim ersten Aufruf der entsprechenden Zeile. Danach wird der vorherige Wert verwendet.


Schreib bei sowas immer dazu, aus welcher Klausur das ist, dann können andere Leute das leichter nachvollziehen bzw. man kann auch mal mit der Musterlösung vergleichen, was laut Vorgabe stimmt.
This post was edited on 2015-07-15, 21:08 by killermiller.
topic: Lösung als hex datei auf das SpiCboard flashen  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 7140
Hast du sicher die .hex-Datei aus dem SPiC-Public-Laufwerk?
Auf dem GSPiC-Laufwerk ist auch eine Musterlösung, da aber gemäß der Aufgabenstellung ohne Richtungswechsel.
topic: Lösung als hex datei auf das SpiCboard flashen  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 7138
Tools->Device Programming (bzw. AVR Programming bei Versionen vor Studio 6)

Dann Programmer/Debugger auswählen, als Device Atmega32, also Interface entweder ISP oder JTAG, je nach Gerät.
Frequenz auf 250kHz oder kleiner.
Dann bei "memories" am linken Rand klicken und bei den drei Punkten im Abschnitt "Flash" die .hex-Datei auswählen.
Anschließend auf "Program" klicken.
Wenn unten dann drei mal "OK" steht, hat alles funktioniert.
topic: Klausur Juli 2012 (Aufgabe 2a: safe)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 7030
Ja, stimmt, MCUCR muss so initialisiert werden, dass beide Interruptquellen bei fallender Flanke auslösen.
Konkrete Werte stehen im Datenblatt oder in der Angabe zur Klausur, aber die zweite Variante (muffdey's) ist wohl eher richtig,
zumal die erste (im langen Lösungsvorschlag) die selben Bits (ISC01 und ISC11 im MCUCR-Register) zuerst auf 1 und dann wieder auf 0 setzt.
topic: Juli 2013 1e.)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 6800
ja, dritte antwort stimmt.

1. is nicht sinnvoll.
2. auflösen wird vom präprozessor gemacht.
3. stimmt.
4. optimierung macht im normalfall der complier.

ja, linken und binden sind dasselbe.
topic: Build läuft nicht  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 6687
Wenn du daheim dein AVR-Studio eingerichtet hast, hast du auch alle Pfade umgestellt, oder?
Das musst du für jede Konfiguration wieder machen, also für Build und Debug getrennt.

Wenn du das nicht für jedes neue Projekt machen möchtest, stells einmal sauber ein, exportier die Einstellungen als Template und importier die dann wieder.
Dann hast du ein neues Template, bei dem alles passt.
topic: Problem beim Flashen (mit Diamex-AVR)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 6682
Kann sein, ist aber unwahrscheinlich.
Noch unwahrscheinlicher ist es, dass es Unterschiede macht, wie (JTAG/ISP) du das Programm auf den µC spielst.

Woran merkst du, dass keine Änderungen mehr erkannt werden?
Selbes Board und identisches Programm wie in der Uni?
Nimm dir mal das "known-good" .hex-file aus der Uni mit und versuchs mit dem.
topic: Problem beim Flashen (mit Diamex-AVR)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 6666
Die 7seg-Anzeige braucht Interrupts (die beiden Anzeigen werden gemultiplext, um Pins zu sparen, das passiert über timer, welche wiederum interruptbasiert sind). Deshalb brauchst du noch ein

#include <avr/interrupt.h>

um die entsprechenden Befehle verfügbar zu machen und ein

sei();
am Anfang deiner main(), um die Interrupts zu aktivieren (Set Interrupt).
Vorsicht, Interrupts haben Fallstricke und Spezialfälle, kommt noch in der VL...
topic: Klausureinsicht / Nachklausur  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 6189
Zur Einsicht muss jemand anderes was sagen, wird die nicht normalerweise während der Klausur bekanntgegeben?
Anmeldung erfolg normalerweise über mein-campus; wenn du wiederholen musst, bist du automatisch und verpflichtend wieder angemeldet.
Die Übungen für nächstes Semester sollten im UnivIs stehn, spätestens kurz vor Beginn des nächsten Semesters :)
Ich weiß nicht, obs regulär Übungen gibt...Wenns wieder so is, dass Morty eine Übung für die Wiederholer anbietet, wird der Termin wahrscheinlich recht unbürokratisch auf nen Zeitpunkt gelegt, wo alle Zeit haben...
topic: Klausur Juli 2010 (Aufgabe 2: Würfel)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
killermiller
Member since May 2011
41 posts
In reply to post ID 6147
Die beiden Sachen, die mir auffallen:
Pointer auf eine Funktion kriegst du, indem du einfach den Namen der Funktion hinschreibst, ohne Klammern und ohne &.
Also in diesem Fall
registerCallbackButton0(btnpressed);

Und man könnte an der Stelle hier
    /* Wuerfelphase */
    while(1){
        button0 = 0;
        uint8_t pos = 0;
die Interrupts für die drei Zeilen freigeben.

Der Rest sieht gut aus...
Close Smaller – Larger + Reply to this post:
Special characters:
Page:  1  2  3  next 
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen