Verständniss Frage -> Bootloader Kode

#5852605
Lesenswert?

Moin,

kann mir jemand mal den Sinn dieser Zeile erklären?
1
flash_page = hex_addr - hex_addr % SPM_PAGESIZE;

Hier der Code Ausschnitt.:
1
          /* Parse Zieladresse */
2
          case PARSER_STATE_ADDRESS:
3
          hex_buffer[hex_cnt++] = (uint8_t)c;
4
          if(hex_cnt == 4)
5
          {
6
            uart_putc(XOFF);
7
            parser_state = PARSER_STATE_TYPE;
8
            hex_cnt = 0;
9
            hex_addr = hex2num(hex_buffer, 4);
10
            hex_check += (uint8_t) hex_addr;
11
            hex_check += (uint8_t) (hex_addr >> 8);
12
            if(flash_page_flag)
13
            {
14
              flash_page = hex_addr - hex_addr % SPM_PAGESIZE;
15
              flash_page_flag = 0;
16
            }
17
            uart_putc(XON);
18
          }break;
Beitrag #5852631 wurde von einem Moderator gelöscht.
Gast #5852757
Lesenswert?

Jan H. schrieb:
> Richtig?

Schaue doch bitte in die Spezifikation der Sprache, welche du 
verwendest, wenn du den Antwortenden nicht glauben magst.

In jedem C Buch findest du diese Wahrheit.
In Foren findest du Glauben, Überzeugungen und Meinungen, und diese 
stellst du ja hier Frage...
Gast #5853283
Lesenswert?

Jan H. schrieb:

> Wenn der Controller jetzt sagen wir mal 128 Pages hat.. Darf das
> Ergebnis der Rechnung nicht größer als 128 werden oder?

Du hast nicht begriffen, das die Startadresse einer Seite nicht die 
(fiktive) "Nummer" einer Seite ist, sondern eben diese fiktive Nummer 
multipliziert mit der Größe der Seiten.

Denn genau das braucht der der SPM-Mechanismus. Datenblatt lesen bildet!
#5853285
Lesenswert?

c-hater schrieb:
> Jan H. schrieb:
>
>> Wenn der Controller jetzt sagen wir mal 128 Pages hat.. Darf das
>> Ergebnis der Rechnung nicht größer als 128 werden oder?
>
> Du hast nicht begriffen, das die Startadresse einer Seite nicht die
> (fiktive) "Nummer" einer Seite ist, sondern eben diese fiktive Nummer
> multipliziert mit der Größe der Seiten.
>
> Denn genau das braucht der der SPM-Mechanismus. Datenblatt lesen bildet!

Hätte ich es verstanden, würde ich wohl kaum hier fragen oder?
Unter was muss ich schauen?
Flash Pages?
Gast #5853327
Lesenswert?

Jan H. schrieb:

> Habe hier einen Mega32 vor mir liegen.

Schön für dich. Dann weißt du je wenigstens welches verdammte Datenblatt 
du herunterzuladen nd zumindest dessen Inhaltsverzeichnis durchzusehen 
hast.

Mein Gott, das kann doch nicht so schwer sein, mal wenigstens irgendwas 
selbst zu tun...
Gast #5853724
Lesenswert?

Ich brauchte 20 Sekunden, das Datenblatt zu finden, downzuloaden und die 
Worte "self programming" darin zu finden. Es ist ja wohl nicht zu viel 
verlangt, nach genannten Stichworten selbst zu recherchieren.

So langsam dämmert mir, was unsere Regierungende Industrie mit 
Fachkräftemangel meint. Mir wird Angst und Bange vor den Lenkradlosen 
Autos, die unsere Facebook Generation gerade entwickelt.
Gast #5853780
Lesenswert?

Du könntest ja auch einfach nicht antworten, wenn es so eine Zumutung 
ist.

Oder lässt dein Zwang zu "helfen" das nicht zu? Oder musst du 
Überlegenheit demonstrieren wie eine ganze Reihe anderer Kandidaten 
hier?
#5853809
Lesenswert?

Schnauze schrieb:
> Du könntest ja auch einfach nicht antworten, wenn es so eine Zumutung
> ist.
>
> Oder lässt dein Zwang zu "helfen" das nicht zu? Oder musst du
> Überlegenheit demonstrieren wie eine ganze Reihe anderer Kandidaten
> hier?

Ich mag deine Art. Du weißt doch sicherlich "Hochmut kommt vor dem 
Fall".
Im Netz große Klappe, zu Hause nichts zu sagen.
Gast #5853817
Lesenswert?

Es gibt hier ein paar Menschen, die hassen es, wenn andere mehr 
Hilfsbereitschaft zeigen, als sie selber. Verständlich, denn es fühlt 
sich nicht gut an, zu merken dass man in gewissen Punkten ein 
schlechterer Mensch ist.

Die einen akzeptieren ihre Unvollkommenheit, die anderen hadern ihr 
ganzes Leben damit. Denen sieht man es am Gesicht an und man merkt es 
auch an ihren Äußerungen.
#5854024
Lesenswert?

Ich versuch einfach mal auf die Frage zu antworten.

% ist der Modulo Operator. Der gibt dir den Rest einer Division zurück. 
Hatte man in der Grundschule mal. Ganz einfach ist das, wenn hinterm 
Modulo eine 1 mit vielen Nullen steht. Am Beispiel: 12345%100 = 45. Das 
geht auch Hexadezimal 0x12AB % 0x100 = AB oder Binär 0b1000001010 % 
0b10000 = 0b1010.

Speicher ist of in mehrere Blöcke (pages) fester größe Zerlegt. Also hat 
man beispielsweise 16 Blöcke mit je 1kB. Man kann das entweder mit 
0-16383 addressieren oder mit einer Zahl von 0-15 und einer von 0-1023. 
1kB ist jetzt SPM_PAGESIZE. hex_addr ist eine Adresse im linear 
addressierten Speicher. hex_addr%SPM_PAGESIZE gibt dir die Addresse im 
Block, ist im Beispiel also max 1023 groß. Wenn man den Wert von 
hex_addr abzieht, dann erhält man die Page-Nummer (gefolgt von ein paar 
Nullen).

Blöcke haben praktisch immer die größe einer Zweierpotenz. Binär also 
eine 1 mit einigen Nullen. Damit schließt sich dann der Kreis zur Modulo 
"Erklärung" oben.

Falls das alles schon klar war, dann einfach nochmal fragen.
#5855727
Lesenswert?

Mathias M. schrieb:
> Falls das alles schon klar war, dann einfach nochmal fragen.

Es gibt auch noch nette Menschen ;)

Ich habe das bis jetzt so verstanden..
( Da ich gerade mit einem "Mega32" arbeite, entnehme ich die Daten aus 
dem Datenblatt als Beispiel von dem.. )

Flash Pages = 256
Page Size = 64 Words ( 128 Bytes )

Meine bildliche Auffassung ->
1
Page[0] = 0..127 ( Bytes)
2
Page[1] = 127.. usw.
3
Page[..] = ...
4
Page[255] = ... Ende

Daher habe ich mit dieser Rechnung auch nicht viel anfangen können.
Laut dieser Berechnung kommt nach 128 Bytes, als "flash_page" 128 raus.
Dieser Sprung von 0 -> 128 war / ist mir nicht ganz klar.

In meiner Vorstellung müsste nach der ersten geschrieben Page eine 1 
raus kommen. Es wird wohl aber so nicht adressiert?
(Firma: Vescomp) #5855825
Lesenswert?

Jan H. schrieb:
> Meine bildliche Auffassung ->
> Page[0] = 0..127 ( Bytes)
> Page[1] = 127.. usw.

 Nein.
 Page[0] =   0..127
 Page[1] = 128..255
 Page[2] = 256..383 usw.

 Allerdings sind die Namen etwas unglücklich gewählt.
1
 flash_page_start = hex_addr - hex_addr % SPM_PAGESIZE;  // Absolute adresse an welcher diese Page beginnt
2

3
 und:
4
 flash_page_nummer = (uint8_t) (hex_addr / SPM_PAGESIZE); // Nummer der Page
5
 flash_page_offset = (uint8_t) (hex_addr % SPM_PAGESIZE); // Adresse (Offset) innerhalb dieser Page
Gast #5855842
Lesenswert?

Hab hier vom TO noch keine Frage gesehen die sich nicht jedes Toastbrot 
mit 2min überlegen selbst hätte beantworten können. Also kein Wunder 
dass man da genervt ist. Elektronik ist kein Hobby für jmd der es nicht 
mal schafft, bereits genannte Suchbegriffe in einem Datenblatt zu 
suchen. Und programmieren ist kein Hobby für jmd der erst in einem Forum 
fragen muss um merken, dass Punkt- vor Strichrechnung kommt wenn ein 
Code anders wie schon gemerkt ja keinen Sinn ergibt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren