Hallo, bräuchte bitte mal etwas Hilfe zu GCC für ARM. Ich benutze GCC für ARM und möchte die IAP Funktion nutzen. Dazu muss ich den Flashbereich so aufteilen, dass der Code der zu IAP gehört in solche Flashsektoren gelinkt wird, die nicht gelöscht werden. Das habe ich für Funktionen hinbekommen und es klappt. Jetzt benötige ich aber ein Lookup-Table auch in diesen Bereich der nicht gelöscht wird.Da setzt es jetzt aber leider bei mir aus. Entweder die Tabelle wird ins RAM gelegt, oder in einen Codebereich der wieder gelöscht wird. Kann mir bitte mal jemand sagen was ich tun muss, damit die Tabelle in einem bestimmten Adressbereich zum liegen kommt? Danke sehr.
Ich hatte ein ähnliches Problem, bei dem bestimmte Puffer zum Austausch mit der Hardware in einem bestimmten RAM liegen mussten. Im Prinzip müsstest du damit auch in der Lage sein, das ganze in einen Flash zu legen. Im Script, dass du dem Linke mitgibst (.ld) musst werden der Speicher und die Sections angelegt. Folgender Code ist nur ein Auszug und zeigt die Section "Communication_Buffers", die im DSRAM_2 liegen muss.
1 | MEMORY |
2 | { |
3 | DSRAM_2_comm(!RX) : ORIGIN = 0x20000000, LENGTH = 0x6000 |
4 | } |
5 | |
6 | |
7 | SECTIONS |
8 | { |
9 | /* Place communication buffers in correct ram section */ |
10 | Communication_Buffers : |
11 | { |
12 | } > DSRAM_2_comm |
13 | } |
Im Code kannst du dann festlegen, dass bestimmte Daten in dieser Section liegen.
1 | static uint8_t m_aMemory[DMA_MEMORY_SIZE] __attribute__ ((section ("Communication_Buffers"))); |
Danke mal für die Hilfe. Das habe ich aber ja schon für die Funktionen so gemacht und da klappt es auch. D.h. ich habe mehrere Flash Sektoren (bestimmer Adressbereich) in denen IAP Funktionen stehen. Mein Problem ist jetzt dass ich die Tabelle nicht in diesen Bereich bekomme. Das mit dem
1 | __attribute__ .... |
funktioniert bei Funktionen, aber bei der Tabelle nicht. Irgend was mache ich da wohl noch falsch.
Kann es sein, daß die Tabelle einfach nicht const ist. Meiner Erfahrung nach legt der Arm-GCC diese dann sofort .rodata und damit in den ROM-Bereich legt. Anders als bei AVR muß man sonst keine Tricks anwenden. Also erst mal schauen, daß sie überhaupt im FLASH landen und dann in die richtige Section schieben. BTW, mit Code müßte man weniger spekulieren.
Zur Info für ähnliche Fälle. Denke ich habe es hinbekommen. Die Lösung war ein weitere Anweisung im Linker script. (Zeile *(.iapsectio.LT)). Sie hier:
1 | .iapsection : |
2 | {
|
3 | . = ALIGN(4); |
4 | __iapsection_start__ = .; |
5 | *(.iapsection.LT) |
6 | *(.iapsection*) |
7 | __iapsection_end__ = .; |
8 | } > IAP |
Dann klappt das mit dem attribute unter Verwendung von *(.iapsectio.LT) bei Definition der Tabelle.
1 | __attribute__((section(".iapsection.LT"))) const u_char sector_table[] = |
2 | { 0,1,2,3,4,5,6,7, ...... |
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.