Flashrom Zelle defekt- ausblenden bei Programmieren

OP #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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.