Forum: Mikrocontroller und Digitale Elektronik Flashrom Zelle defekt- ausblenden bei Programmieren


von R. F. (rfr)


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

von Rolf M. (rmagnus)


Lesenswert?

Du kannst was entsprechendes im Linkerskript eintragen.

von Peter D. (peda)


Lesenswert?

Ich würde eher sagen:
- Fehler im Bootloader oder Programmer
- F_CPU zu hoch oder VCC dafür zu klein
- falsche Clock Fusebits
- zu kurze Resetzeit

von Soul E. (Gast)


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

von R. F. (rfr)


Lesenswert?

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

Gruss
+ frohes Fest
Robert

von easy (Gast)


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

von Oliver S. (oliverso)


Lesenswert?

Man könnte auch versuchen, daß eigentliche Problem zu lösen. Genau eine 
defekte Zelle im Flash eines AtMegas wäre schon äußerst ungewöhnlich.

Oliver

von Soul E. (Gast)


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.

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.