Go Down

Topic: [OT] Welchen Atmelprozessor für "Von Neumann Architektur" ? (Read 4863 times) previous topic - next topic

Schachmann

@jurs: Danke für Deine Antwort. Ich kann Dir leider aber noch nicht ganz folgen. Meinst Du sowas:

Code: [Select]
void my_init (void) __attribute__ ((naked)) __attribute__ ((section (".init4")));

void my_init(void)
{
    // Das hier landet in .init4
}


Wenn ja, was soll denn dann in .init4 drin stehen? So wie ich das sehe werden an der Stelle lediglich Daten aus dem Flash ins RAM kopiert. Wo das RAM aber physikalisch angesiedelt ist, muss vorher schon der Linker festlegen (der bestimmt ja von welcher Adresse an welche Adresse kopiert wird).

Ich denke, ich muss irgendwo noch das Linker-Control-File ändern, da steht z.B.:

Code: [Select]
MEMORY
{
  text      (rx)   : ORIGIN = 0, LENGTH = 1024K
  data      (rw!x) : ORIGIN = 0x802000, LENGTH = 0xffa0
  eeprom    (rw!x) : ORIGIN = 0x810000, LENGTH = 64K
  fuse      (rw!x) : ORIGIN = 0x820000, LENGTH = 1K
  lock      (rw!x) : ORIGIN = 0x830000, LENGTH = 1K
  signature (rw!x) : ORIGIN = 0x840000, LENGTH = 1K
}


Ich finde aber im Moment noch nicht das richtige Control-File für den ATMega2560. Da gibt es jede Menge verschiedene für die verschiedenen Atmel-Controller. Leider heißen die aber nicht so wie die Controller, sondern sind mehr oder weniger einfach durchnummeriert.

Trotzdem, wenn Du weitere Tipps hast, bin ich Dir dankbar!

Gruß,
Ralf

jurs


@jurs: Danke für Deine Antwort. Ich kann Dir leider aber noch nicht ganz folgen. Meinst Du sowas:

Code: [Select]
void my_init (void) __attribute__ ((naked)) __attribute__ ((section (".init4")));

void my_init(void)
{
    // Das hier landet in .init4
}


Wenn ja, was soll denn dann in .init4 drin stehen?


Ich weiß nur, dass in einer .init Sektion VOR .init4 Code drinstehen muß, der im Port MCUCR mindestens ein Bit anders setzt. Schau mal hier:
http://www.avr-asm-tutorial.net/avr_de/beginner/pdetail.html
Und da auf der Seite mal bei MCUCR, Bit 7, Name "Ext.SRAM Enable".
Dieses Bit muß auf "1" gesetzt werden, und zwar während der Initialisierungsphase BEVOR das Programm anfängt zu laufen.

Nur dann betrachtet der Controller die Leitungen, wo das externe RAM angeschlossen ist, auch als externes RAM und nicht als allgemeine I/O Pins.

Wie das technisch gemacht wird, bin ich völlig überfragt. Ich habe wie gesagt nur sehr rudimentäre Vorstellungen vom Compile- und Linkvorgang und weiß nicht, wie man Initialisierungscode in ein Programm einfügt, der ganz am Anfang ausgeführt wird, noch weit vor dem Start der main() oder gar der setup() Funktion, die ja erst starten, wenn alles andere Initialisiert ist: Stackpointer, Heappointer, alle globalen Variablen im RAM-Speicher angelegt etc. Und bei diesen Initialisierungsvorgängen muß dann auch irgendwo das Bit "External RAM enable" gesetzt werden.

Die Codezeile sollte dann ungefähr so gehen, um das externe RAM zu aktivieren:
MCUCR |= (1 << SRE);  // Enable external RAM

Aber wie und wo das unter Arduino und/oder der von Dir installierten alternativen IDE gemacht werden kann: Ich bin da völlig überfragt.

Schachmann

Ah ja, jetzt weiß ich, was Du meinst. Du meinst SRE im External Memory Control Register A. Das kann quasi nach Belieben an- und ausschalten, siehe Kapitel 9.4 im Datenblatt des ATMega2560.

In meinem Programm passiert das einfach durch

Code: [Select]
XMCRA = 0x80;

Das kann man im Programm einfach so setzen, dann greift er auf das XRAM zu oder rücksetzen (XMCRA = 0x00;) dann greift er eben nicht mehr zu. Die Adressierung des externen RAMs lässt sich auf dem Oszilloskop gut ansehen. Es ist sogar möglich das nach Bedarf an- und auszuschalten. Beispiel ich brauche Daten aus dem XRAM, also XMCRA = 0x80; Später im Programm brauche ich kein XRAM mehr, möchte aber Port C als normales I/O-Port benutzen, dann XMCRA 0x00; (Das RAM muss dabei natürlich gegen Zugriffe vom außerhalb geschützt werden, also entweder abschalten oder in einen Tri-State-Zustand bringen.)

Gruß,
Ralf

jurs

#18
Sep 12, 2013, 08:36 pm Last Edit: Sep 12, 2013, 08:40 pm by jurs Reason: 1

Das kann man im Programm einfach so setzen, dann greift er auf das XRAM zu oder rücksetzen (XMCRA = 0x00;) dann greift er eben nicht mehr zu. Die Adressierung des externen RAMs lässt sich auf dem Oszilloskop gut ansehen. Es ist sogar möglich das nach Bedarf an- und auszuschalten. Beispiel ich brauche Daten aus dem XRAM, also XMCRA = 0x80; Später im Programm brauche ich kein XRAM mehr, möchte aber Port C als normales I/O-Port benutzen, dann XMCRA 0x00; (Das RAM muss dabei natürlich gegen Zugriffe vom außerhalb geschützt werden, also entweder abschalten oder in einen Tri-State-Zustand bringen.)


Genau das.

Wenn Du nur "irgendwann im Programm" auf irgendwelche Speicherstellen in einer Speichererweiterung zugreifen möchtest, dann kannst Du das enable-Bit auch "irgendwann im Programm" setzen.

Wenn aber die Speichererweiterung als "externes RAM" dienen soll, das genau so genutzt werden kann wie internes RAM, und in dem sich der Datenbereich befindet und der Heap, dann muß das enable-Bit gesetzt worden sein, bevor die erste Datenvariable im Datensegment angelegt wird und bevor das erste Byte im Heap alloziert wird.

Und das Bit darf im laufenden Programm auch nicht mehr gelöscht werden, sonst entziehst Du dem Programm sowohl den Datenbereich als auch den Heap.

Schachmann

Tja, ich hatte das bisher nicht so verstanden. Ich muss aber sagen, dass Deine Argumentation einiges für sich hat, u.a. wäre es eine wirklich treffende Erklärung dafür, das der ATMega sich so verhält, wie er sich im Moment verhält.

Trotzdem, wenn ich das Bit setze und dann später im Programm dynamisch Speicher alloziere, hat der Controller eigentlich keinen Grund, nicht auf das externe RAM zuzugreifen. Für statische Variablen udgl. die alloziert werden, ehe der eigentliche Programmlauf beginnt, gebe ich Dir aber völlig Recht, das kann so nicht gehen.

Im Moment bin ich nicht mehr an meinem Entwicklungsrechner, aber morgen werde ich auf jeden Fall mal versuchen, das Bit so früh wie möglich zu setzen, mal sehen ob das und was das bringt. Ich weiß jetzt auch nicht aus dem Stegreif wie und was man da mit Code:Blocks tun kann. Mal sehen... Wenn ich ein Ergebnis habe, poste ich es auf jeden Fall hier.

Mein nächster Versuch wäre gewesen, ich habe ja die Speicher-Hardware hier. Meinen Arduino wollte ich eigentlich ganz lassen (also nicht den Bootloader rausfeuern). Ich habe aber noch ein paar ATMega8515 in der Schublade, die haben das gleiche XRAM-Interface. Ich hätte dann mal einen davon auf dem Breadboard aufgebaut und es mal in Assembler probiert - einfach um die Umwägbarkeiten der Arduino-Software und des Bootloaders loszuwerden.

Besten Dank auf jeden Fall für Deine Denkanstöße!

Gruß,
Ralf

Schachmann

So, ich bin schön weiter gekommen - da ich aber nicht mehr Realizers Thread weiter kapern möchte, habe ich hier http://forum.arduino.cc/index.php?topic=187096.msg1389883#msg1389883 beschrieben wie.

Gruß,
Ralf

Realizer

#21
Sep 13, 2013, 10:14 pm Last Edit: Sep 13, 2013, 10:23 pm by Realizer Reason: 1
Danke @Schachmann und Jurs. Das Thema ist trotz Kaperung interessant!
Eine Kuh macht muuhh.
Viele Kuehe machen Muehe

Go Up