Flashrom Zelle defekt- ausblenden bei Programmieren

#3936415
Lesenswert?

Hallo,

in einem meiner Systeme befindet sich ein avr atmega 2560, der bei einer 
bestimmten Adresse einen Programmdefekt hat. Ich suche eine Möglichkeit, 
sozusagen drumherumzuprogrammieren, ohne dass der Compiler ds 
wegoptimiert.

Welche Möglichkeiten habe ich in C? In ASM würde ich schreiben

org 0x1e000 ; Adresse der defekten Zelle
db defekt   ; definieren, unbelegt
org start   ; zurückspringen und weitermachen
...

schreiben.

Grüsse + frohes Fest

Robert
Gast #3937575
Lesenswert?

R. Freitag schrieb:

> in einem meiner Systeme befindet sich ein avr atmega 2560, der bei einer
> bestimmten Adresse einen Programmdefekt hat. Ich suche eine Möglichkeit,
> sozusagen drumherumzuprogrammieren, ohne dass der Compiler ds
> wegoptimiert.

Dazu musst Du eine entsprechende section im linker command file anlegen. 
Z.B. .text von 0x0000 bis zum Defekt, den dann freilassen, darüber 
.etext, darüber .rodata, etc.

Dein Linker wird nun versuchen, sämtlichen Programmcode in die section 
.text zu packen und meckert wenn diese voll ist. Wahrscheinlich musst Du 
den Rest des Codes dann von Hand über #pragma-Anweisungen in die .etext 
verschieben. Im worst-case ist das eine Anweisung pro Funktion, im 
besseren Fall eine pro Bibliothek.


Mühsames Geschäft, wenn es nur um einen einzelnen Controller geht...
Gast #3937812
Lesenswert?

man könnte
 - normal übersetzen
 - aus der Map die Funktion raussuchen, in der die kaputte Adresse liegt
 - an den Anfang der Funktion einen Block __asm__("nop"); einfügen
 - wenn's viele werden oder zeitkritsch ist, das erste nop durch einen 
Sprung ans Ende der nops ersetzen
 - neu übersetzen
Gast #3938370
Lesenswert?

R. Freitag schrieb:

> Kann ich nicht den Compiler zwingen, eine Konstante genau an diese
> Adresse zu legen? Die Zelle hat die Adresse 0x1e000.
>

Exakt das tust Du, indem Du im Linker Command File eine entsprechende 
Section anlegst.


Wenn Du nur eine Konstante mit fester Adresse definierst (z.B. ein 
Register), dann hat zwar die Konstante diese Adresse, der Linker wird 
jedoch nicht daran gehindert, den Code in den dafür vorgesehenen Bereich 
zu schieben. D.h. die Adresse wird doppelt belegt, einmal für die 
Konstante und einmal vom Code -- was natürlich in jedem Fall schiefgeht.

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