www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MMC/SD karte (Ulrig Radig) datei grösse berechnung


Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir jemmand erklären was genau dieser befehl hier macht?
wobei size die Grösse der datei ist.

tmp = (Size>>9)+1;

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon gefunden dank wiki books!

Rechtsshift >>

Verschiebt den Inhalt einer Variable bitweise nach rechts. Bei einer 
ganzen nicht negativen Zahl entspricht eine Verschiebung einer Division 
durch 2n und Abschneiden der Nachkommastellen(falls vorhanden), wobei n 
die Anzahl der Verschiebungen ist. Das Ergebnis ist 
implementierungsabhängig, wenn der zu verschiebende Wert negativ ist.

Beispiel:

y = x >> 1;
x y
01010111 00101011

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nehmen wir jetzt an tmp ist ein int. dann kann ich ja immer nur volle 
dateien einlesen. d.h. 4096 byte, 2048, 32768...
richtig?

Was ist wenn ich eine datei einlesen möchte die 4350 byte hat?

wie kann ich sowas realisieren?

Weiss es jemand?
Es sind doch mit sicherheit leute hier die eine SD karte schon mal 
angesprochen haben mit einem MC. könnt ihr mir sagen wie ihr das 
realisiert habt?

Bedanke mich im vorraus

Autor: Christian L. (lorio)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Grosse wrote:
> Kann mir jemmand erklären was genau dieser befehl hier macht?
> wobei size die Grösse der datei ist.
>
> tmp = (Size >> 9) + 1;

Ich tippe mal: Die Blockanzahl ausrechnen, die für eine Datei benötigt 
wird.(bei Blockgröße von 512 Byte)

Size>>9 entspricht einer Ganzzahldivision durch 512.
Dann wird noch 1 dazu addiert.

Beispiel:
Dateigröße 768 Byte

tmp = (768 >> 9) + 1
tmp =      1     + 1
tmp =         2

stimmt!


Sonderfall:
Dateigröße ist ein Vielfaches von 512 Byte
Beispiel:

Dateigröße 1024 Byte

tmp = (1024 >> 9) + 1
tmp =      2      + 1
tmp =          3

stimmt nicht, denn es werden nur 2 Blöcke benötigt


Gruß
LORIO

EDIT:

Ein Integer kann jede beliebige Ganzzahl aufnehmen, die innerhalb des 
(unsigned / signed) Integer-Wertebereichs liegt.

Beim GCC sind das bei
signed: 2^16 ... 0 ... 2^16 - 1
unsigned: 0 ... 2^32 - 1

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hast du es ja schon erwähnt

>Dateigröße 1024 Byte

>tmp = (1024 >> 9) + 1
>tmp =      2      + 1
>tmp =          3

>stimmt nicht, denn es werden nur 2 Blöcke benötigt

wie mache ich es den dass es in beiden fählen passt?

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Christian!

                           dateigrosse = (Size%512);
      if(dateigrosse==0)
      {
        // Berechnen der Blockanzahl:
        tmp = (Size>>9);
      }
      else
      {
        // Berechnen der Blockanzahl:
        tmp = (Size>>9)+1;
      }
Damit geht es.


Besten Dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.