Forum: Digitale Signalverarbeitung / DSP / Machine Learning Probleme Flash und RAM Speicherbereich


von Horst (Gast)


Lesenswert?

Hy,

ich habe für den F2812 mit dem Code Composer ein größeres Projekt
entwickelt. Nun habe ich Probleme mit dem Speicherbereich. Zunächst
reichte es, daß der Quellcode (.text) im H0SARAM gespeichert wurde.
Nachdem er zu klein war, habe ich Teile des Quellcodes auskommentiert,
um weiterarbeiten zu können. Nun ist das Projekt so weit, daß ich es
ausprobieren möchte. Dazu habe ich zunächst einen Speicherbereich in
Zone6 eingerichtet, und den Quellcode (.text) zusammen mit den
Konstanten (.econst) dort hin geladen. Wenn das Programm ausgeführt
werden soll, erreicht die CPU nur in der Datei DSP281x_usDelay.asm den
Codebereich:

       .def _DSP28x_usDelay
       .sect "ramfuncs"

        .global  __DSP28x_usDelay
_DSP28x_usDelay:
        SUB    ACC,#1
        BF     _DSP28x_usDelay,GEQ    ;; Loop if ACC >= 0
        LRETR

;There is a 9/10 cycle overhead and each loop
;takes five cycles. The LoopCount is given by
;the following formula:
;  DELAY_CPU_CYCLES = 9 + 5*LoopCount
; LoopCount = (DELAY_CPU_CYCLES - 9) / 5
; The macro DELAY_US(A) performs this calculation for you
;==================================================

und springt dort in einer Art Dauerschleife umher.

Wenn das Projekt in den Flash geladen wird, erreicht der Prozessor
folgende Routine und bleibt in der for()-Schleife hängen.

interrupt void ILLEGAL_ISR(void)   // Illegal operation TRAP
{
  // Insert ISR Code here

  // Next two lines for debug only to halt the processor here
  // Remove after inserting ISR Code
  asm("          ESTOP0");
  for(;;);
}

Ich habe eine Interrptstruktur von 2 Interrupts, die beide periodisch
aufgerufen werden. Dazu gehört aber nicht die ILLEGAL_ISR.

Vielleicht hilft das noch: Beim Compilieren erhalten ich folgende
Warnung:
>> warning: creating output section ramfuncs without SECTIONS
specification
Weiß jemand, was bei mir los sein könnte?

Vielen Dank und Gruß,

Matthias

von Thomas Schlenger (Gast)


Lesenswert?

Du must im *.CMD File noch dem Linker mitteilen wo die ramfuncs liegen
sollen...Eben im RAM.. Desweiteren must du dafür sorgen, daß diese
Funktionen nach dem Einschalten auch dorthin geladen werden. Es gibt
hier schon ne Menge Beispiel...Suchfunktion: 2812 + Flash o.ä.

Gruß
Thomas

von Frank (Gast)


Lesenswert?

Hi Thomas,

vielen Dank für Deine schnelle Antwort. Ich arbeite mit Horst zusammen,
und erlaube mir deshalb auf Deinen Eintrag zu antworten.
Dass wir die ramfuncs in den RAM linken müssen wissen wir.
Befehl:   ramfuncs      {}  >  HOSARAM
Das Projekt läuft ja auch, wenn wir es komplett aus dem RAM starten.
Wir haben bereits diverse Forumseinträge durchsucht, aber keine
passende Antwort gefunden. Was meinst Du mit "....dafür sorgen, daß
diese
Funktionen nach dem Einschalten auch dorthin geladen werden."???

!!! Bevor wir die Interruptebenen programmiert haben, konnten wir das
Projekt noch in den Flash laden und es lief auch einwandfrei, deshalb
glauben wir auch, dass das Problem an den IRs liegt!!!

Wäre schön,wenn Du oder jemand anderst uns weiterhelfen könnte!

Gruß und vielen Dank
Frank

von Patrick Röth (Gast)


Lesenswert?

Hallo,

ich hatte das selbe Problem, das wenn ich das Programm aus dem Flash
starte, das das Programm sich in dieser Illegalen Routine verfängt.
Die Delay Funktion in der "DSP281x_usDelay.asm" Datei wurde bei mir
nur zur Initialisierung, power up usw., der AD Wandler verwendet,
deshalb habe ich diese Funktionen einfach durch for-Schleifen ersetzt
und die Datei "DSP281x_usDelay.asm" gänzlich aus meinem Projekt
entfernt.
Die ADCInit sieht bei mir wie folg aus:

void InitAdc(void)
{
     Uint32 i;

     // Power up bandgap/reference circuitry
     AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3;

     // Delay before powering up rest of ADC
     for (i=0; i<800000; i++) {}

     // Power up rest of ADC
     AdcRegs.ADCTRL3.bit.ADCPWDN = 1;

     // Delay after powering up ADC
     for (i=0; i<4000; i++) {}
}

Danach war für mich das Problem erledigt. Ich hoffe ich kann damit
weiterhelfen!

MFG Patrick

von hebel23 (Gast)


Lesenswert?

Hi, was Thomas S. meint ist folgendes:

-> ins main.c:
--------------
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);

-> ins cmd-File:
----------------
ramfuncs            : LOAD = FLASHD,
                      RUN = RAML0,
                      LOAD_START(_RamfuncsLoadStart),
                      LOAD_END(_RamfuncsLoadEnd),
                      RUN_START(_RamfuncsRunStart),
                      PAGE = 0

Damit werden beim Start alle Funktionen, die mit .sect "ramfuncs"
gekennzeichnet sind aus dem Flash in den RAM geladen.
Das ist natürlich nur dann nötig, wenn das Programm aus dem Flash
läuft, an sonsten sind die Funktionen ja schon im RAM.

Die ILLEGAL_ISR wird aufgerufen, wenn der DSP "abgestürzt ist" oder
illegale Funktionen ausführen soll (z.B. Div/0). Damit wird er in einen
definierten Zustand versetzt (angehalten), damit nicht irgendwelche
unvorhergesehenen Dinge passieren.

Gruß Andreas

von Marcus W. (marcusius)


Lesenswert?

Hallo.

Der Sinn von "ramfuncs" ist wahrscheinlich die schnellere Ausführung, 
oder? D.h., wenn ich eine Funktion nicht als ramfuncs setze, läuft sie, 
allerdings langsamer da aus dem Flah startend?

Marcusius

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.