Forum: Mikrocontroller und Digitale Elektronik Keil und Speicher reservieren


von Johannes (Gast)


Lesenswert?

Hallo,
programmiere mit keil einen XC167

wenn ich ein array anlege, das in einen bestimmten Speicherbereich
soll, dann mache ich das so:
char idata test[20];


so, jetzt habe ich bei Options L166 Locate eine eigen Classe angelegt:
MeineDaten(0xED0000-0xFEFFFF)

so, und wie lege ich jetz da einen array hinein??
char MeineDaten test[65535]

funktioniert nicht. Wie geht das? wie lege ich einen Array in dieses
Speicherbereich??


Johannes

von Andreas Horn (Gast)


Lesenswert?

Hallo Johannes,

ich habe vor kurzem ein XC167CI Starter Kit erworben und versuche dies
nun in Betrieb zu nehmen. Bisher habe ich aber noch keine Verbindung
zwischen meinem Board und der Software herstellen können. Ich verwende
µVision2 von Keil. Kannst Du mir vielleicht weiterhelfen und mir sagen,
welche Einstellungen ich vornehmen muss?

Mfg

Andreas

von Thomas (Gast)


Lesenswert?

> MeineDaten(0xED0000-0xFEFFFF)

und wie soll der Compiler wissen was du im Linker machen willst

wie wäre es mit folgendem

char test[65535] at 0xED0000;


das sollte funktionieren.

Thomas

von Johannes (Gast)


Lesenswert?

Hallo,
hatte damals mit dem StarterKit eine CD mitbekommen. Da war ein
Beispiel namens "Blinky.uv2" dabei. Von dem aus habe ich das Board
mit Jumper usw. mal eingestellt, und dann gieng es erst richtig los.

das würde ich an deiner Stelle auch mal versuchen. wenn nicht klappt,
dann meld dich.

johannes

von Johannes (Gast)


Lesenswert?

Hallo Thomas!

Nun, ich dache eben das der Linker das aus der Zeile

char MeineDaten test[65535];
char idata test[20];


weis. Weil es eben mit der Klasse idata funktioniert aber mit meiner
eigenen Klasse MeineDaten nicht. Und genau das war je meine Frage, wie
ich das dem linker angeben muß.

Habe dein Zeile Probiert, aber mein Keil kann mit dem Schlüsselwort
at nichts anfangen


johannes

von Thomas (Gast)


Lesenswert?

Hallo Johannes,

> Nun, ich dache eben das der Linker das aus der Zeile

nein MeineDaten ist dem Comiper unbekannt das ist ja erst im Linker
definiert.

Du hast recht at gibt es nur beim 51er
aber char xhuge test[65535];  funktioniert

Danach sollte es möglich sein test wie gewünscht mit dem Linker zu
plazieren.

Thomas

von Johannes (Gast)


Lesenswert?

Hallo,

ja das funktioniert. Aber dann sucht der Linker die Adresse ja wieder
selber raus, es liegt halt irgendwo im xhuge bereich, und ich will sie
aber von hand angeben.

habe es aber rausgefunden:

atei namens Test.c anlegen
In dieser eine variable definieren:
<i>unsigned char huge Packet[65535];</i>
Variable mit <i>extern</i> einbinden

In den Linkereinstellungen folgendes eintragen:
<i>?FD0?TEST(0xED0000-0xFEFFFF)</i>

dann klappt es.

Bis dann und danke für die Hilfe

johannes

von Johannes (Gast)


Lesenswert?

hallo,

shit nein, meine obige lösung wird zwar compiliert, aber der Linker
legt das dann doch nicht an diese Adresse, so ein schrott. Funktioniert
doch nicht, auch wenn das im UsersGuide so steht.

also, wer hat noch Lösungsvorschläge?

Johannes

von Martin (Gast)


Lesenswert?

Hallo Johannes!

Ich hatte vor Kurzem dasselbe Problem. Ich habe es so gelöst.

Zuerst musst du in L166 Locate deine eigene Klasse angeben. Das hast du
schon richtig gemacht.

Danach musst du für die Variablen, die in dem angegebenen
Speicherbereich sein sollen ein eigenes C-File erstellen.
Es kann so aussehen.
Z.B:
#pragma RENAMECLASS (XDATA=MeineDaten)
#pragma NOINIT

 unsigned char xhuge hallo;

In diesem C-File benennst du die XDATA - Klasse auf die
MeinDaten-Klasse, die du selbst angegeben hast, um. Dadurch werden alle
Variablen, die du mit Xhuge in diesem einen C-File definierst in den
angegebenen Speicherbereich geschoben. Um diese Variablen jedoch auch
im Hauptprogramm nutzen zu können, muss du die Variable im Haupt-C-File
als Globale Variable mit dem Wörtchen "extern" definieren.
Z.B:
extern unsigned char xhuge hallo;

So hat es bei mir funktioniert. Wenn du es nicht hinbekommst schreib
mir einfach wieder.

Tschüss!

Martin

von Martin (Gast)


Lesenswert?

Eine kurze Frage noch:
Hattet ihr eigentlich bei eurem XC-Board Datenbücher dabei oder nicht?
In meinem Paket waren nur CD's.
Das Datasheet und die User-Manuals musste ich mir selbst ausdrucken.
Das ist natürlich nicht gut, denn ein Buch ist viel besser zu handhaben
als ein Ordner voller Ausdrucke.

Danke für eure Antwort!

Martin

von Andreas (Gast)


Lesenswert?

Hallo Martin,

bei meinem Board waren ebenfalls nur CD's dabei. Find ich auch
ziemlich schwach, da ich noch ein Board von Motorola habe, beí dem
sowohl CD's als auch Bücher dabei waren.

Mfg

Andreas

von Johannes (Gast)


Lesenswert?

Bei mir waren auch nur CD's dabei. Habe es gar nicht ausgedruckt, komme
mit so ausdrucken nicht zurecht. Als pdf kann man es am Bildschirm zwar
auch nicht kompfortabel lesen, aber man knn wenigstens die "suchen"
funktion benutzen!

johannes

von Murrai Doga (Gast)


Lesenswert?

Ha Ha Ha Ha Ha!
Entschuldigt meinen Lachanfall.

Hallo Leute!

Aber das ist noch gar nichts.
Habt ihr euch schon mal die Schematics-Pläne angesehen. Und dann
betrachtet euch mal die CAN-Einheit. Spätestens dort sieht man, dass
mancher Entwickler kein Gehirn hatte.
Also kurze Erklärung:
Der XC167 hat einen Twin-Can. Also zwei Can-Schnittstellen. Wenn man
z.B. eine Can-Schnittstelle initialisiert, dann hat man zu Beginn die
Möglichkeit, diese auf bestimmte Portpins zu legen. Bei CAN-1 hat man
beim Senden 4 Pins zur Auswahl und beim Empfangen 3. Bei CAN-2 hat man
3 Pins beim Senden und 3 beim Empfangen zur Auswahl.
Und was haben die Entwickler gemacht? Alle diese lustigen Pins wurden
miteinander verbunden.
Was heißt das? Das heißt das es völlig wurst ist, welchen Pin man zum
Empfangen oder Senden nimmt, da man die anderen sowieso dann nicht mehr
verwenden darf. Sonst kommt es nämlich zu Kurzschlüssen und dann ist
das teure Board leicht defekt. Auch im Manual habe ich keine Warnung
gefunden. Ist anscheinend nicht so wichtig.
Wenn man sich den Plan nochmal etwas genauer ansieht, kann man
erkennen, dass P4.7 ein Empfangspin für CAN1 ist und gleichzeitig ein
Sendepin für CAN2. Das heißt, dass man zwar zwei Can-Schnittstellen
hat, man aber dadurch, dass die Pins miteinander großzügig verbunden
sind, nur eine benutzen kann. Wenn man trotzdem beide benutzt, dann
empfängt CAN-1 alle Daten, die von CAN-2 abgeschickt werden.

Ich habe auch schon mal in die Atmel-Welt etwas reingeschnuppert, aber
dort ist so ein Pfusch nie passiert.

Murrai

von Johannes (Gast)


Lesenswert?

Ist mir egal, mache nichts mit dem Can.

Aber wenn ihr mal die Tabelle der Belegung des Pheripherals Stecker
anschaut, und dann mal versucht dort was anzuschliesen, werdet ihr
merken, das das überhaupt nicht passt.

Tipp: Im Schaltplan ist es richtig

Johannes

von Johannes (Gast)


Lesenswert?

Hallo,
Nunja, um vom lästern wieder weg zu kommen, mal noch eine Frage zum
Speichermodel:

Lass mein Programm im Flash laufen, so, und suche jetz internen
Speicher und möglichst viel, also wohin mit den Daten??

Es würde jetzt mal den <i>Programm SRam</i> geben. Hätte ich mal
2kbyte.
Und dann noch die eigentlich dazu gedachte <i>Data memory Area<i>, so
und daraus werd ich nicht so richtig schlau.

Also:

ab 0x00 0000    External Memory

ab 0x00 8000    <i>Reserved for Internal Data SRAM</i>, oder einmal
steht auch <i>reserved for Data SRAM</i> (also nicht internal, was
dann), dann steht mal <i>are used for the internal Data SRAM </i>
so, nun meine Frage, ist der Speicherbereich jetzt nur reserviert,
vieleicht für spätere verwendung oder ist da wirklich schon Speicher
oder ???


ab 0x 00C000 <i> Data SRAM</i> oder <i> IRAM</i> Ok, da ist Speicher,
juhu. Sicher? Hat das jetzt jemand schon getestet.

Also, um mal zusammen zu fassen: Habe jetzt: 2kbyte Programm SRAM +
16kbyte(vieleicht oder auch nicht Data Sram) +  4kbyte Data SRAM=
22kByte. Stimmt das jetzt??


So, jetzt habe ich in euren Augen sicher viel falsches geschrieben,
darum hoffe ich, jemand rechnet mir mal vor, wieviel Speicher ich wo
jetzt tatsächlich intern habe. Ich blick auf jeden Fall nicht mehr
durch.


johannes

von Johannes (Gast)


Lesenswert?

hallo,
so, wollte mal eben das Programm Sram testen. Im Listing(*.m66) steht
für mein Array nun folgendes:

0E0000H     Packet       VAR   ---  MEINEDATEN  ?XD?PACKET


und noch
0E0000H     PUBLIC    VAR       ---     ---   Packet

so, und jetzt ist doch 0E0000H die Startadress vom Programm SRAM oder
nicht???????? Warum sehe ich dann ide zugriffe mit dem Logicanalyzer?

Johannes

von Martin (Gast)


Lesenswert?

Hallo!

@Murrai:
Hei du hast ja recht. Das Problem besteht aber nicht nur wenn man das
Can-Interface einsetzt, sondern auch dann, wenn man mehrere Ports
gleichzeitig verwenden will.
Wenn man z.B. P4.7 benutzt, dann darf man folgende Pins nicht mehr
verwenden, da es sonst zum Kurzschluss kommt: P4.5, P9.1, P9.2, P7.5,
P7.6...
Das ist aber wirklich ein Witz. Woher soll man das wissen?

@Johannes:
Was meinst du für einen Pheripheral-Stecker? Kannst du mir das genauer
erklären? Meinst du das Debugg-Interface?

Oh. Das mit dem Ram ist so eine Sache. Also ich sag dir mal wie ich das
verstanden habe.
Man hat ab F600H ein SRAM von 2K. Dieser wird für den Stack verwendet.
Man kann aber auch Daten hineinspeichern.
Ab C000H beginnt ein SRAM von 4K. Dies war früher das XRAM. Es kann für
Daten verwendet werden. Also hast du im Ganzen 6K für Daten.

Dann gibt es noch ein weiteres SRAM. Dies beginnt ab E0&#8217;0000H und
hat 2K. Es wird über dieselbe Einheit wie das Flash angesprochen. Es
kann dafür verwendet werden, um Programme auszutesten. In diesem Ram
läuft das Programm genauso schnell wie im Flash.

Das was ab 8000h im Datenblatt steht, nämlich "Reserved for internal
data sram" - damit ist gemeint, dass dieser Bereich reserviert ist.
Nämlich für µC-Typen, die mehr Speicher haben (Für die Zukunft
reserviert). Mit anderen Worten von 8000H bis BFFFH gibt es keinen
Speicher. Es kann jedoch sein, dass es Typen geben wird, die dort einen
Speicher haben. Dann ist einfach das XRAM größer.

Deine letzte Frage verstehe ich nicht ganz. Warum soll E0000H die
Startadresse für dein Programm sein? Möchtest du dein Programm dort
hineinspielen und austesten? Oder wie? Dein Array ist in diesem
Bereich.

Tschüss!

Martin

von Norbert (Gast)


Lesenswert?


von Andreas Renner (Gast)


Lesenswert?

Servus Fedi,
wenn du ein Problem hast dann melde dich doch gleich bei mir!!!!!

von Johannes (Gast)


Lesenswert?

Hallo Martin,

Pheripherals Stecker: Wenn du das Board vor die liegen hast, mit dem
Spannungsversorgungsstecker links vorne, dann ist rechts vorne ein 80
Poliger Stecker: Pheripherals.

Auf Seite 29 des *.pdf files XC16x Board ist eine Tabelle mit der
Pinbelegung. Und diese stimmt überhaupt nicht. aber im schematic ist
sie richtig.

Das mit den RAMs, habe mir gedacht, dass ich in den eigentlich für
Programme reservierten Speicher ab 0xE0 0000 mal Daten rein lege,
müsste eigentlich gehen. Oben habe ich dann mal einen Auszug aus meinem
Listing gemacht, damit ihr seht, das mein Array wirklich da ist. Und
das Programm funktioniert auch, aber ich sehe die zugriffe mit dem
Logikanalyzer auf dem externen Datenbus. Aber der Speicher ist intern.

Johannes

von Martin (Gast)


Lesenswert?

Hallo Johannes!

Sowas ähnliches kenne ich auch.
Die Pinbelegung des Prozessors im Datasheet auf Seite 5 stimmt
hoffentlich.
In den Schematics-Plänen ist die Belegung nämlich eine völlig andere.
Dies war auch schon beim alten C167.
Eigenartig ... Kaum beginnt man über C167 oder XC167 zu sprechen,
beginnt man nach kurzer Zeit auch über sie zu schimpfen.

Martin.

von Johannes (Gast)


Lesenswert?

Hi,
das ist doch bei allen sachen so, man sieht nur das negative, über das
positive unterhält man sich nie. und der XC hat sehr viele gute
seiten(meine technische Innovationen)

Johannes

von Martin (Gast)


Lesenswert?

Ja,
du hast recht. Ich habe mal gehört, dass manche Menschen nur deshalb
unglücklich sind, weil sie sich immer auf die negativen Dinge
konzentrieren und diese versuchen wegzudrängen. Manche Dinge lassen
sich aber nicht ändern.

Oh, sind wir jetzt vom Thema abgewichen?


Um mal was Positives zu sagen. Ich glaube, dass der XC167 einer der
leistungsfähigsten 16-Bit Kontroller überhaupt ist. Wenn jemand einen
noch besseren oder schnelleren 16-Bit Kontroller kennt, bin ich gerne
bereit die Information zur Kenntnis zu nehmen.

Martin

von Johannes (Gast)


Lesenswert?

ja, und schau mal an was hier so gemeckert haben, wir schimpfen über die
Koku, und das Board, aber der Controller selbst ist eigentlich nicht
kritisiert worden.

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.