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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.