2017-05-16 1 views
0

Ich habe ein Problem gefunden, das ich nicht beantworten kann. Ich habe nach dem Abschnitt eine Tabelle von 3 Byte platzieren, wo mein Programm liegt:Was ist am Ende der Hex-Datei von Keil

const uint8 AppVersion[] __attribute__((at(0x08006E00))) = {1,1,3); 

Was ich in hex erhalten, die von Keil die Tabelle plus extra Daten ist: End of hex file after data added at arbitrary address.

Während ich die oben genannte Tabelle nicht verwende, habe ich die gleichen "extra" Daten (364 Bytes) am Ende des Hex: End of hex file normally.

Können Sie mir sagen, was am Ende der Anwendung platziert ist? Ich habe in der Map-Datei keinen Hinweis gefunden.

Danke! Paweł

+0

Drogi Kolego Pawle - ein Dlaczego Cię zu nehmen Niepokoi. (Ich habe Pawel gefragt, worüber er sich Sorgen macht). Macht es einen Unterschied, was in der Hex-Datei ist? Ich denke, dass tatsächlich Inhalt geladen ist wichtig –

+0

@PeterJ, ich bin nur neugierig. Ich möchte wissen, warum etwas passiert. Das Problem bedeutet nicht, sich hier Sorgen zu machen. –

+0

Haben Sie bereits in der .map-Datei gesucht? – Jeroen3

Antwort

0

Sie müssen in der .map Datei schauen, um zu sehen, was es dort setzt. Es kann aber auch Ihr Code oder eine Bibliothek sein. Sie verwenden eine absolute Adresse, keine relative Referenz zum "Ende des Bildes".

Verwenden Sie stattdessen eine benutzerdefinierte linker file zu explizit verknüpfen Sie diese Tabelle an das Ende des Bildes.

LR_IROM1 0x08000000 0x0007000 { 
    ; Program ROM Area 
    ER_IROM1 0x08000000 (0x0007000-3) { 
     *.o (RESET, +First) 
     *(InRoot$$Sections) 
     .ANY (+RO) 
    } 

    ; Program SRAM Area 
    RW_IRAM1 0x20000000 0x00001000 { 
     .ANY (+RW +ZI) 
    } 

    ; Version area 
    VERSION (0x08000000 + (0x0007000-3)) 0x3 { 
     version.o 
    } 
} 

Ich habe keine Ahnung, über Ihre Ziellayout sich die Zahlen anpassen.
Einmal an einem sonnigen Tag schrieb ich eine little tool, um die Map-Datei zu lesen. Vielleicht klappt es bei deiner Version von keil?

Update:
Sie haben die .sct Datei (Linker-Datei) geteilt.

LR_IROM1 0x08000000 0x00008000 { 
    ER_IROM1 0x08000000 0x00008000 { 
     *.o (RESET, +First) *(InRoot$$Sections) 
     .ANY (+RO) 
    } 
    RW_IRAM1 0x20000000 0x00001000 
    { 
     .ANY (+RW +ZI) 
    } 
} 

Ihr ROM-Region erstreckt sich über LR_IROM1 0x08000000-0x08007FFF.
Daher 0x08006E00 ist nicht das Ende Ihres Bildes und der Linker darf alles (.ANY) nach dem statisch verknüpften Objekt AppVersion setzen.

Wenn Sie das nicht möchten, weisen Sie den Linker explizit an, eine Region nur für Ihr version-Objekt zu erstellen, wie im obigen Beispiel.

+0

Entschuldigung für die späte Antwort. Ich habe es mit dem MapViewer versucht, aber es hat den gleichen Eindruck wie das Lesen der .map-Datei. Keine Informationen über irgendetwas außer diese 3 Bytes am Ende des Speichers (.ARM .__ AT_0x08006E00 der Größe 3, das ist ein Abschnitt und AppVersionE an der gleichen Adresse und der gleichen Größe, die Daten ist). –

+0

@ PawełJ könnten Sie die .sct-Datei teilen? – Jeroen3

+0

Hier gehts: LR_IROM1 0x08000000 0x00008000 {; Ladebereich size_region ER_IROM1 0x08000000 0x00008000 {; Ladeadresse = Ausführungsadresse * .o (RESET, + zuerst) * (InRoot $$ Sections) JEGLICHE (+ RO) } RW_IRAM1 0x20000000 0x00001000 {; RW-Daten .ANY (+ RW + ZI) } } –

Verwandte Themen