Not logged in. · Lost password · Register
Forum: Grundstudium 2. Semester Informatik (GDI II) SPiC RSS
Fragen zum Vorlesungsskript und den Übungsfolien
Panos #1 -- for 2 months · 18 posts
Show profile · Link to this post
Subject: Fragen zum Vorlesungsskript und den Übungsfolien
1) Folie D.33: Bei den Vorrangregeln bei Operatoren steht in der Spalte Assoziativität: von rechts nach links bzw. von links nach rechts. Was ist damit gemeint?

2) Folie E.3: Beim Programmadressraum steht 2 Byte pro Adresse und beim Datenadressraum steht 1 Byte pro Adresse. Heißt das, dass der Inhalt eines Zeigers mit einer Adresse aus dem Programmspeicher 2 Byte groß ist und einer aus dem Datenspeicher 1 Byte groß ist?

3) Folie E.12: Der Interrupt-Vektor enthält Informationen zur Bearbeitung des Interrupts. Laut Skript, einen Maschinenbefehl oder eine Adresse einer Bearbeitungsfunktion. Wo ist da der Unterschied?

4) Folie F.14 : Ein Feld kann durch eine Liste von konstanten Ausdrücken, die durch Komma getrennt sind, initialisiert werden. Wieso müssen das konstante Ausdrücke sein? Kann ich nicht mit Variablen initialisieren?

5) Folie F.26: Wieso sind die Parameter-Deklarationen int p2[] und int *p2 äquivalent? int p2[] ist doch ein konstanter Zeiger auf das erste Element des Feldes und int *p2 ein Zeiger der veränderbar ist.

6) Folie G.13: Wenn vor sleep_cpu() ein Interrupt auftritt, wieso ensteht dann das Lost-wakeup-Problem?

7) Übungsskript Folie 5.28: Da die Variable event 8 bit ist (atomar) und in der while Schleifenbedingung nur gelesen wird, wäre die while-Schleife dann auch so richtig?

  1. while(event==0) {
  2.     cli();
  3.     sleep_enable();
  4.     sei();
  5.     sleep_cpu();
  6.     sleep_disable();
  7. }
This post was edited on 2010-07-24, 16:53 by Panos.
morty (Administrator) #2 -- since Sep 2003 · 730 posts · Location: Erlangen
Show profile · Link to this post
1:
Das ist worauf sich das Bezieht.
  1. a = !b;
  2. a = -b;
Hier bezieht sich der Operator auf den Nachfolgenden Ausdruck. Also von rechts nach links.
Von links nach rechts bedeutet hingegen das mit dem linken Ausdruck gearbeitet wird
a << 4
Hier wird das a, welches links vom Shift steht verändert. Meist macht man das intuitiv richtig. Interessant wird es dann wenn man unterschiedliche Wertebereiche der variablen hat. Aber das würde hier zu weit führen.

2:
Nein, der Zeiger selber ist beim AVR immer 16bit groß. Allerdings hat beim Datenspeicher jedes Byte eine Adresse.  (Man kann den AVR mit externem RAM auf 2^64 = 64K Adressraum erweitern.) Im Programmspeicher ist es aber so, dass nur jedes zweite Byte adressiert werden kann. Das hat damit zu tun, dass jeder Befehl 2 Byte groß ist - Man adressiert also die Befehle. Um Daten aus den Programm in den Datenspeicher zu kopieren gibt es deshalb auch zwei unterschiedliche Befehle: Einen für das untere und einen für der obere Byte. Deshalb ist der "größte" ATmega auch der  ATmega128 mit 128K Programmspeicher.

3:
Adresse: Die Adresse wird aus dem Vektor geladen und angesprungen.
Maschinenbefehl: Der entsprechende Eintrag wird ausgeführt. Da steht dann im Normalfall: Springe zu Adresse soundso. Theoretisch kann da aber jeder beliebige Befehl stehen.
Beide Ansätze haben vor und Nachteile, allerdings hat das hauptsächlich mit der Architektur zu tun.

4:
Nein, das müssen Konstanten sein, weil der .data - Segment in dem die initialisierten Variablen liegen vor dem Start des Programms einfach in den Arbeitsspeicher kopiert werden. Eine variable Initialisierung muss zur Laufzeit, zum Beispiel in der Init-Funktion statt finden. Dann landet die Variable auch im .bss - Sebment, der am Anfang einfach nur genullt wird und deshalb keinen Platz in der Programmdatei einnimmt (dafür ist die init Funktion größer).

5:
Ja, C ist nicht immer logisch. ;) (Gibt aber noch deutlich schlimmeres.)

6:
Weil es dann sein kann, dass es genau einen Interrupt gibt, diese aber nie behandelt werden wird. Das haben wir eigentlich in der Übung durchgekaut.

7:
Nein, weil dann die Gefahr des Lost-Wakeup bestehen würde. (Was was eigentlich anhand der Folien zu vermitteln gewesen wäre ;-) )

6&7:
Am besten mal von einem Kommilitonen nochmal erklären lassen wo das Problem ist.
Panos #3 -- for 2 months · 18 posts
Show profile · Link to this post
Danke für die schnellen Antworten.

Eine Frage zu 1 nochmal: a = ++b; hier wird doch erst b inkrementiert und dann a zugewiesen. a = b++; hier wird erst a = b gesetzt und dann b inkrementiert. Wieso ist das im 2. Fall so? ++ Operator kommt doch vor dem = Operator... Hat das auch mit der Assoziativität zu tun?
morty (Administrator) #4 -- since Sep 2003 · 730 posts · Location: Erlangen
Show profile · Link to this post
Jep. https://secure.wikimedia.org/wikibooks/de/wiki/C%2B%2B-Pr…
Wobei die links-Assoziativität eine höhere Priorität hat als die rechts-Assoziativität: a+++b ist also (a++)+b. Man sollte aber zu Gunsten der Lesbarkeit lieber Klammern setzen.
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
Unclassified NewsBoard 1.6.4 © 2003-5 by Yves Goergen
Page created in 510.2 ms (302.8 ms) · 62 database queries in 64.7 ms
Current time: 2010-09-10, 04:10:46 (UTC +02:00)