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
Du kannst was entsprechendes im Linkerskript eintragen.
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
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...
Kann ich nicht den Compiler zwingen, eine Konstante genau an diese Adresse zu legen? Die Zelle hat die Adresse 0x1e000. Gruss + frohes Fest Robert
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.