mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Variablen auf absolute Adresse setzten


Autor: Ruslan K. (idrisk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

habe versucht gerade wie in einem Tut. gelesen bestimmte Variablen auf 
bestimmte Adressen zu setzten mit folgenden Befehl:

unsigned int series[16] absolute 0x1900;

es kommt ein "Syntax Error before absolute", Was mache ich falsch?

Mein System:
dsPIC33FJ128GP710 mit MPlab v8.36 um MPLab C30 als Compiler

Gruß

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Array = Variablen Feld = bei dir 16 unsigned Integer. Soll heißen hinter 
dem Array series[16] stehen insgesamt 16 unsigned Integer Variablen.

Wie sollen 16 unsigned Integer auf eine Speicherzelle passen?

Autor: faustian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier sollte wohl eher der Anfang des Arrays auf 0x1900 gesetzt werden...

Autor: Ruslan K. (idrisk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

habe es in der user Guide zum compiler gefunden:
unsigned int devStat __attribute__((address(0x9400))) = 0x5E00;

so funzt es, aber das Proggi lässt sich net debuggen, geht immer wieder 
ohne meldungen raus!

was ich brauche ist eine art lookup-table.

z.B. über SPI kommen sehr sehr schnell requests. Werte zwischen 0 und 
FFFF

ich brauche aber nur knapp 20 davon. Ich muss die dazugehörige response 
mit dem nächsten Frame schicken.

Req. - Request, Res. - Response

z.b. Req.1 - Res.0
     Req.2 - Res.1
     Req.3 - Res.2
     ...

    0x9400 - 0x5E00
    0x3004 - 0x9205
     ...

meine CPU läuft mit 40 MIPS, ich empfange die SPI-nachricht und muss bis 
zur nächsten Nachricht delaTime ca. 800ns, die Antwort im SPIbuffer 
schon bereithalten.
ich habe es mit switch und case gemacht, aber so ab 4 cases, schafft der 
controller es nicht mehr rechtzeitig?

Deshalb dachte ich, dass ich an bestimmte Speicherstelle (Adresse = 
Reqest) die Respose reinschreibe, so dass ich die SPI-Request als Zeiger 
auf die Speicherstelle setzte, aber irgendwie macht es es nicht!

habt ihr einen tip?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ruslan K. schrieb:

> ich brauche aber nur knapp 20 davon.

Wie sind die verteilt? Welche Nummern genau?

Kann man die einfach und schnell in eine fortlaufende Nummerierung von 0 
bis 20 überführen um damit einen normalen Arrayzugriff zu machen?

Autor: Ruslan K. (idrisk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die request sind bisschen stark verteilt und es sind 30.
hier mal die auflistung:
9400h
4B10h
0B00h
4C03h
8C00h
CD00h
0D00h
CE39h
0E00h
4F00h
8F00h
D005h
1000h
5100h
9100h
D204h
9200h
D300h
1300h
8000h
0100h
0200h
8300h
4C03h
CD00h
8C00h
0D00h
4B10h
7005h
3004h

Mit dem Array dachte ich auch schon, aber wie soll ich das sinnvoll 
umrechnen!?

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CD00h, 4b10h und 0D00h kommen doppelt vor. Dann habe ich aufgehört nach 
Doppelten zu suchen. Kannst Du das mal sortieren und auf doppelte 
überprüfen, bitte? Vielleicht sind es ja doch deutlich weniger als 20.

Ich wuerde versuchen aus der Liste eine boolsche Gleichung zu 
entwickeln, die den Index in eine Tabelle errechnet. Kann aber sein, das 
die auch zu lange braeuchte um berechnet zu werden. Evtl. hilft auch ein 
passend partitionierter Baum mit Teilmengen der Bits.

Wenn ich richtig rechne entsprechen 40Mips 25ns pro Befehl, so das Du 
etwa 32 Befehle Zeit hast. Evtl. waere es gut diesen Part in Assembler 
zu schreiben.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man koennte auch, aus der (sortierten und bereinigten) Liste die 
signifikanten Bits auszusortieren. Das wäre ein 16Bit "und". Dann evtl. 
noch eine Schiebeoperation oder Subtraktion. Das waere in der 
Vorbereitung nicht so aufwendig wie die boolsche Gleichung.

Autor: Ruslan K. (idrisk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Vorschläge!

ich versuche nun die bits zu betrachten und mir die Response ausrechnen!

Werde mich noch melden!

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.