Forum: Mikrocontroller und Digitale Elektronik Variablen auf absolute Adresse setzten


von Ruslan K. (idrisk)


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ß

von Lehrmann M. (ubimbo)


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?

von faustian (Gast)


Lesenswert?

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

von Ruslan K. (idrisk)


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?

von Karl H. (kbuchegg)


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?

von Ruslan K. (idrisk)


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!?

von Grrrr (Gast)


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.

von Grrrr (Gast)


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.

von Ruslan K. (idrisk)


Lesenswert?

Danke für die Vorschläge!

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

Werde mich noch melden!

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
Noch kein Account? Hier anmelden.