www.mikrocontroller.net

Forum: Compiler & IDEs PROGMEM an bestimmte adresse ?


Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie bekomme ich eine Tabelle an eine bestimmte Adresse im Flash ?

Konkret:
Ich habe vier uint8_t tabellen mit - jeweils - einer Größe von 512 
Bytes.
Wie bekomme ich die Tabellen hinter die Interrupt-Tabelle an "runde" 
Adressen ?
Also z.b. 0x100, 0x300, 0x500, 0x700 ?

Das Programm könnte dahinter beginnen. Oder Umgegekehrt, erst das 
Programm, dann die Tabellen.
Ich benötige das für einen optimierten Zugriff auf diese Tabellen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Bastler (Gast)

>wie bekomme ich eine Tabelle an eine bestimmte Adresse im Flash ?

Muss man irgendwie dem Linker verclickern. Keine Ahnung.

>Ich benötige das für einen optimierten Zugriff auf diese Tabellen.

Solche Tricks würde ich mir in C verkneifen.

MFG
Falk

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe jetzt mit einer  zus#tzlichen Dummy-Tabelle "getrickst":
const uint8_t dummy_tab [0x100-_VECTORS_SIZE] PROGMEM= {0x0};

const prog_uint8_t sine_tab   [512] PROGMEM= {0x0....

So beginnt sine_tab an 0x100.

Das ist nur für mich, wird nie veröffentlicht, und ein vermutlich wird 
es auch nie ein Update mit anderem Compiler geben.

Aber trotzdem: Das mss doch irgendwie eleganter gehen ?

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst eine neue Section im Linkerscript anlegen und sie an der 
erwünschten Adresse beginnen lassen. Dann legst Du die Tabelle einfach 
in diese Section.

MfG Mark

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups...gibts es dazu irgendwo im Netz ein Tutorial ?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Ich benötige das für einen optimierten Zugriff auf diese Tabellen.
>Solche Tricks würde ich mir in C verkneifen.

Ich auch ! Der Compiler optimiert für dich. Wahrscheinlich
besser als du selber das kannst.

Die unvermeidliche Frage: Wozu soll das gut sein ?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ holger (Gast)

>Die unvermeidliche Frage: Wozu soll das gut sein ?

Ich tippe mal auf Soft-DDS. So wie hier.

http://www.myplace.nu/avr/minidds/index.htm

MFG
Falk

Autor: Ludger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigene sections:

Im C-Quellcode z.B.:

char xyz[] MY_SECTION = {1, 2, 3};

Dem Linker werden Sections wie folgt mitgeteilt:

LDFLAGS=-Wl,-section-start=.MY_SECTION=0xfd00

OBJCOPY benoetigt natuerlich auch die Informatrion welche sections es 
z.B. ins hex File verwursten soll.

$(OBJCOPY)  -j .text -j .MY_SECTION -O $(FORMAT) $< $@

Gruss,
Ludger

P.S.

Wenn man C und Assembler mischt, und die page aligned Daten im Assembler 
definiert, kann man einfach mit:

.align 8
xyz:

xyz auf eine gerade Seitenadresse (0x100 * n) ausrichten.

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ui..danke für den Link.

Genau um sowas geht es :-)

Warum soll ich nicht tricksen ? Alternativ könnte ich Assembler 
programmieren, aber das Ergebnis ist genausowenig portabel.

Der Compiler kann mir das nicht optimieren (glaube ich). Wenn die 
Tabelle an einer "schiefen" adresse Beginnt, ist eine Addition mehr 
fällig. Oder ein zustzliches "IF" wenn die Adresse wieder auf 0 springen 
soll. Bei glatten Adressen reicht ein "and".

Die Tabelle soll im Interrupt von Anfang bis Ende ausggeben werden, und 
das ganze soll danach wieder von vorn beginnen.
Wie würdet Ihr das optimal , ohne Assembler, lösen ?

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Ludger:

Danke !!!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Bastler (Gast)

>soll. Bei glatten Adressen reicht ein "and".

Schon klar, aber.

>Die Tabelle soll im Interrupt von Anfang bis Ende ausggeben werden, und
>das ganze soll danach wieder von vorn beginnen.

Glaub ja nicht, dass der GCC so ultrakompakte Interrupts generiert wie 
man es in ASM kann. Allein schon die Pointerspeicherung in exklusiben 
Registern etc. ist nur mit tierischen verrenkungen drin. Da wird einiges 
an Overhead reingebaut. Da spielt eine Pointerberechnung/ Addition keine 
Rolle mehr. Wenn es wirklich auf hohe Leistung getrimmt werden soll, 
nimm ASM. Ist einfacher und im Ergebnis schneller als alle 
Compilertricks.

MfG
Falk

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk
Ich probier's trotzdem mal :-)

Ich poste das Ergebnis dann hier... ich befürchte aber, Du hast recht 
und ich programmiere anschliessend die Assembler-Version ;-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst ja auch nur die ISR im Assembler programmieren und den Rest
in C.

Sinnvoller ist es übrigens, die Tabelle per eigener section und
-Wl,--section-start ans obere Ende des Flashs zu legen (ggf. unter
den Bootloader, falls du einen hast), dann kollidierst du am
wenigsten mit der Allokation des Flashs durch den Linker, die ja
von unten beginnt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.