Forum: Mikrocontroller und Digitale Elektronik Verständniss Frage -> Bootloader Kode


von Jan H. (janiiix3)


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;

von moep (Gast)


Lesenswert?

Damit wird wohl die Startadresse der Page berechnet in der sich die 
aktuelle Adresse (hex_addr) befindet.

von Dunno.. (Gast)


Lesenswert?

moep schrieb:
> Startadresse der Page

Oder nur die direkte adresse unter Berücksichtigung einer Adressierung 
mit Page-Offset ?

Beitrag #5852631 wurde von einem Moderator gelöscht.
von Jan H. (janiiix3)


Lesenswert?

Jan H. schrieb:
> Moin,
>
> kann mir jemand mal den Sinn dieser Zeile erklären?
>
1
> flash_page = hex_addr - hex_addr % SPM_PAGESIZE;
2
>
>
> Hier der Code Ausschnitt.:
>
1
>               flash_page = hex_addr - hex_addr % SPM_PAGESIZE;
2
>

hex_addr - hex_addr -> Da kommt doch jedes mal "0" raus oder habe ich 
was verpasst?

von Dunno.. (Gast)


Lesenswert?

Jan H. schrieb:
> hex_addr - hex_addr -> Da kommt doch jedes mal "0" raus oder habe ich
> was verpasst?

Hast du, nämlich:

  % SPM_PAGESIZE

Die Operation kommt zuerst.

von moep (Gast)


Lesenswert?

Jan H. schrieb:
> oder habe ich
> was verpasst?

Ja, die "operator precedence".
Auf gut Schuldeutsch: "Punkt vor Strich"

von Jan H. (janiiix3)


Lesenswert?

moep schrieb:
> Jan H. schrieb:
>> oder habe ich
>> was verpasst?
>
> Ja, die "operator precedence".
> Auf gut Schuldeutsch: "Punkt vor Strich"

Soll heißen ->
1
[1] hex_addr % SPM_PAGESIZE;
2
[2] hex_addr - hex_addr;

Richtig? :D

von Einer K. (Gast)


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...

von Jan H. (janiiix3)


Lesenswert?

moep schrieb:
> Damit wird wohl die Startadresse der Page berechnet in der sich die
> aktuelle Adresse (hex_addr) befindet.

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

von c-hater (Gast)


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!

von Stefan F. (Gast)


Lesenswert?

Jan H. schrieb:
> Richtig?

Nein. Richtig ist: hex_addr - (hex_addr % SPM_PAGESIZE)

von Jan H. (janiiix3)


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?

von c-hater (Gast)


Lesenswert?

Jan H. schrieb:

> Unter was muss ich schauen?

Kommt natürlich auf's konkrete DB an. Aber irgendwas mit "Bootloader 
support" oder "Self-programming the flash" kommt eigentlich überall im 
Titel des/der relevanten Abschnitte vor.

von Jan H. (janiiix3)


Lesenswert?

c-hater schrieb:
> Jan H. schrieb:
>
>> Unter was muss ich schauen?
>
> Kommt natürlich auf's konkrete DB an. Aber irgendwas mit "Bootloader
> support" oder "Self-programming the flash" kommt eigentlich überall im
> Titel des/der relevanten Abschnitte vor.

Habe hier einen Mega32 vor mir liegen.

von Stefan F. (Gast)


Lesenswert?

Jan H. schrieb:
> Habe hier einen Mega32 vor mir liegen.

Sollen wir jetzt für dich vorlesen?

von Jan H. (janiiix3)


Lesenswert?

Stefanus F. schrieb:
> Jan H. schrieb:
>> Habe hier einen Mega32 vor mir liegen.
>
> Sollen wir jetzt für dich vorlesen?

Kannst Du denn lesen?

von Schnauze (Gast)


Lesenswert?

Nicht pampig werden, Stefan. Das Forum ist dazu da Fragen zu stellen.

von c-hater (Gast)


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...

von Jan H. (janiiix3)


Lesenswert?

Schnauze schrieb:
> Nicht pampig werden, Stefan. Das Forum ist dazu da Fragen zu stellen.

Mache haben halt direkt alles in die Wiege gelegt bekommen und sind halt 
neunmalklug.

von Jan H. (janiiix3)


Lesenswert?

c-hater schrieb:
> 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...

Nette Aussage ?

von c-hater (Gast)


Lesenswert?

Schnauze schrieb:

> Nicht pampig werden, Stefan. Das Forum ist dazu da Fragen zu stellen.

Es ist aber nicht dazu da, exzessive chronische eigene Faulheit ohne 
jede Scham darzustellen.

Ja, kann man machen, muss sich dann aber nicht über die Reaktion der 
Fleissigen wundern....

von Jan H. (janiiix3)


Lesenswert?

c-hater schrieb:
> Schnauze schrieb:
>
>> Nicht pampig werden, Stefan. Das Forum ist dazu da Fragen zu stellen.
>
> Es ist aber nicht dazu da, exzessive chronische eigene Faulheit ohne
> jede Scham darzustellen.
>
> Ja, kann man machen, muss sich dann aber nicht über die Reaktion der
> Fleissigen wundern....

Dein Ego scheint sehr groß zu sein, zumindest im Netz.

: Bearbeitet durch User
von Stefan F. (Gast)



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.

von Schnauze (Gast)


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?

von Stefan F. (Gast)


Lesenswert?

Schnauze schrieb:
> Oder lässt dein Zwang zu "helfen" das nicht zu? Oder musst du
> Überlegenheit demonstrieren wie eine ganze Reihe anderer Kandidaten
> hier?

Nach so viel gemecker habe ich Mitleid mit dem TO empfunden.

von Jan H. (janiiix3)


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.

: Bearbeitet durch User
von Stefan F. (Gast)


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.

von Einer K. (Gast)


Lesenswert?

Herrlich!
Eine Eskalation....
Fein!

Darf ich mitmachen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jan H. schrieb:
> Mache haben halt direkt alles in die Wiege gelegt bekommen und sind halt
> neunmalklug.

Falsch. Manche haben sich ihr Wissen hart erarbeitet.

von Mathias M. (matjes)


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.

von Stefan F. (Gast)


Lesenswert?

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

Warum, damit es nochmal erklärt wird?

von Schnauze (Gast)


Lesenswert?

Ach so geh das, Hilfsbereit sein. Stefan, sorry, aber du bist wirklich 
erbärmlich.

von Mathias M. (matjes)


Lesenswert?

Stefanus F. schrieb:
> Mathias M. schrieb:
>> Falls das alles schon klar war, dann einfach nochmal fragen.
>
> Warum, damit es nochmal erklärt wird?

Ich gehe davon aus, dass er dann die Frage nicht 1 zu 1 nochmal postet, 
sondern neu formuliert, was er noch nicht verstanden hat. Hätte ich 
natürlich klarer ausdrücken können, damit du das verstehst.

von Stefan F. (Gast)


Lesenswert?

Mathias M. schrieb:
> dass er dann die Frage nicht 1 zu 1 nochmal postet,
> sondern neu formuliert

So ergibt es mehr Sinn, als wie ich es vorhin aufgefasst habe.

von Jan H. (janiiix3)


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?

von Marc V. (Firma: Vescomp) (logarithmus)


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

von Rofl-Tier (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.