Seit einigen Monaten habe ich einen asynchronen SRAM über den parallelen
Bus XINTF angebunden und dieser funktioniert einwandfrei. Über eine
weitere Zone wollte ich nun ein Ethernet Modul ansteuern. Allerdings
muss ich über bestimmte Adressen Daten lesen oder schreiben und ich weiß
absolut nicht wie ich sowas hinbekommen soll. Im Linker könnte ich die
Adressen hübsch aufteilen, löst aber letztendlich nicht mein Problem.
Gibt es eine Möglichkeit in C++ direkt Adressen anzusteuern?
Eine Idee wäre es, wenn ich mehrere große Arrays einzeln in
Speicherblöcke aufteile und somit letztendlich die Adresse direkt zu
fassen bekomme. Aber ich bin nun mal ganz ehrlich zu mir selbst, die
Lösung scheint nicht wirklich gescheit zu sein.
Ps. Eine weitere Anfängerfrage ;)
> Gibt es eine Möglichkeit in C++ direkt Adressen anzusteuern?
In C gibt es die durchaus - und damit vermutlich auch in C++. Das geht
ganz einfach über Zeiger. Ich habe das bei einem, am XINTF des 2812
angeschlossenen LCD folgendermaßen gemacht:
LCD.h
1
//...
2
#define LCD_BASE_POINTER 0x2000 // define base address
Den Base-Pointer wählst du entsprechend der gewünschten
Chip-Select-Zone. Und wenn du das Ganze ein wenig anpasst, kannst du
mittels, z.B., LCD_KS0066[x] auf entsprechende Register zugreifen, wobei
x dann der "Offset" ist.
Hallo Tim R.
In Deinem Post vom 27.01.2009 schreibst Du, dass Du ein asynchrones SRAM
per XINTF an deinen TMS320F28335 erfolgreich angebunden hast. Ich stehe
vor der selben Aufgabe und komme nicht weiter.
Ich muss die XINTF-Funktion in einem bestehenden Projekt einbinden,
welches über das .cmd-file den Flash als Speicher nutzt. Das
Beispielprogramm für XINTF nutzt jedoch RAM. Kann ich einfach die
SECTION "xintffuncs" aus dem .cmd-File (siehe unten) in das
Flash-basierende .cmd-File einfügen?
Zudem ist mir nicht klar, wie ich später die Daten in das SRAM schreibe.
Danke Jogl
1
SECTIONS
2
{
3
/* Setup for "boot to SARAM" mode:
4
The codestart section (found in DSP28_CodeStartBranch.asm)
5
re-directs execution to the start of user code. */
6
codestart:>BEGIN,PAGE=0
7
ramfuncs:>RAML0,PAGE=0
8
.text:>RAML1,PAGE=0
9
.cinit:>RAML0,PAGE=0
10
.pinit:>RAML0,PAGE=0
11
.switch:>RAML0,PAGE=0
12
13
xintffuncs:LOAD=RAML1,
14
RUN=ZONE7A,
15
LOAD_START(_XintffuncsLoadStart),
16
LOAD_END(_XintffuncsLoadEnd),
17
RUN_START(_XintffuncsRunStart),
18
PAGE=0
19
20
.stack:>RAMM1,PAGE=1
21
.ebss:>RAML4,PAGE=1
22
.econst:>RAML5,PAGE=1
23
.esysmem:>RAMM1,PAGE=1
24
IQmath:>RAML1,PAGE=0
25
IQmathTables:>IQTABLES,PAGE=0,TYPE=NOLOAD
26
IQmathTables2:>IQTABLES2,PAGE=0,TYPE=NOLOAD
27
FPUmathTables:>FPUTABLES,PAGE=0,TYPE=NOLOAD
28
DMARAML4:>RAML4,PAGE=1
29
DMARAML5:>RAML5,PAGE=1
30
DMARAML6:>RAML6,PAGE=1
31
DMARAML7:>RAML7,PAGE=1
32
ZONE7DATA:>ZONE7B,PAGE=1
33
34
.reset:>RESET,PAGE=0,TYPE=DSECT/* not used */
35
csm_rsvd:>CSM_RSVDPAGE=0,TYPE=DSECT/* not used for SARAM examples */
36
csmpasswds:>CSM_PWLPAGE=0,TYPE=DSECT/* not used for SARAM examples */
37
38
/* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */
Diese Anweisung ist nur dafür da, dass Funktionen aus dem externen RAM
ausgeführt werden können. Sie Beschreibt letztendlich den Startpunkt und
den Endpunkt für memcopy. memcopy muss innerhalb der Initialisierung,
also vor der Endlosschleife in main ausgeführt werden.
Ich selber benutze den externen Speicher nur für Statusdaten, ARRAYs und
Variablen. Dann ist diese Code-Schnipsel nicht notwendig, sondern:
1
.extern_prog:>ZONE7APAGE=0
2
.extern_data:>ZONE7BPAGE=1
3
4
MEMORY
5
{
6
PAGE0:
7
ZONE7A:origin=0x200000,length=0x00FC00
8
9
PAGE1:
10
ZONE7B:origin=0x20FC00,length=0x000400
11
}
Im Code selber muss die Variable, bzw. Array einfach per Pragma in den
Speicher zugewiesen werden: