mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Probleme Flash und RAM Speicherbereich


Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Schlenger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick Röth (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hebel23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus Wego (marcusius)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.