PDA

View Full Version : C++ e processori Sharc


Cecilia76
13-05-2005, 09:54
Salve a tutti,

qualcuno sa qualcosa sulla programmazione dei processori Sharc DSP in C++? Sto facendo un progetto ma ho problema nella gestione della memoria: ogni volta che faccio una new ho un errore di out_of_memory.

Qualche anima santa??? :mc: :mc:

Cecilia76
14-05-2005, 09:48
Uppettino.

Nessuno sa nulla?

lombardp
14-05-2005, 10:31
Salve a tutti,

qualcuno sa qualcosa sulla programmazione dei processori Sharc DSP in C++? Sto facendo un progetto ma ho problema nella gestione della memoria: ogni volta che faccio una new ho un errore di out_of_memory.

Qualche anima santa??? :mc: :mc:

Ho scritto qualcosina per un DSP della famiglia SHARC, ma erano piccole routine in assembler, ottimizzate per la velocità.

Però posso provare a darti una mano: usi un sistema operativo sul DSP? Lo chiedo perché (da quello che so) per l'allocazione dinamica della memoria probabilmente è necessario o un sistema operativo o comunque qualcosa che gestisca lo spazio di memoria.

Cecilia76
14-05-2005, 10:51
Intanto grazie mille per la risposta.
Dunque, il processore (un ADSP-21161N) è piazzato su una evaluation board collegata al PC (sotto Windows purtroppo) tramite USB.
Io scrivo il codice con VisualDSP++ 4.00: è un programma in C++ con delle routine in assembler che gestiscono l'I/O delle seriali audio. Ti cerco di descrivere il problema.

Sono partito dall'esempio CTalkthru fornito con EZKit lite (il kit per l'evaluation board). Ho trasformato il progetto in un progetto C++ e dopo un pò di modifiche tutto è andato a posto.
Il problema è che sto usando il file LDF per la gestione della memoria di CTalkthru e non so se vada bene. I file LDF sono dei file del linker in cui si indica in che segmento di memoria allocare porzioni di codice.
Ogni volta che uso l'operatore new del C++ per l'allocazione della memoria (ad esempio per creare un oggetto) ho
un messaggio di out_of_memory nel seg_pmco.
Non so proprio che fare perchè la gestione LDF è piuttosto complicata e a me fondamentalmente non interessa:
sarebbe sufficiente potere allocare qualche oggetto e usarne un metodo nella funzione Process_Samples.
Ad esempio:

LoopOscillator* osc;

Process_Samples () {
double v = osc.tick ();
// parti per mandare v alla seriale d'uscita

}

int main () {
// inizializazione del processore
osc = new LoopOscillator ();

//settaggio flag di interrupt a Process_Samples
for (;; )
asm ("idle");

}

LoopOscillator è la mia classe ma quando nel main chiamo l'operatore new ho out_of_memory.
Non so se ho chiarito un pò il problema. Grazie ancora, Cec

lombardp
14-05-2005, 17:26
Purtroppo non ho familiarità con l'ambiente che utilizzi, e la mia esperienza con gli SHARC è molto datata (ADSP-21020) e limitata al solo assembler.

A quanto dici il problema sembra essere l'allocazione dinamica. Avresti problemi ad usare un'allocazione dell'oggetto direttamente come variabile statica senza bisogno del new:

LoopOscillator osc;

Cecilia76
15-05-2005, 00:03
Ciao,

non posso allocare staticamente gli oggetti perche il costruttore richiede obbligatoriamente dei parametri. Dovrei cambiare l'architettura di tutto il sistema per evitarlo. Sarebbe sicuramente più proficuo capire meglio la gestione della memoria.

Cec

lombardp
15-05-2005, 12:28
Ciao,
non posso allocare staticamente gli oggetti perche il costruttore richiede obbligatoriamente dei parametri. Dovrei cambiare l'architettura di tutto il sistema per evitarlo. Sarebbe sicuramente più proficuo capire meglio la gestione della memoria.


Ho capito, dall'esempio che avevi riportato non avevo visto parametri, per cui ti avevo suggerito quella soluzione. Di sicuro capire meglio la gestione della memoria è la via maestra.


Comunque, se utilizzi l'allocazione dinamica "solo" per passare dei parametri al costruttore, non dovrebbe essere troppo problematico passare ad una allocazione statica (da quello che so, l'allocazione dinamica serve obbligatoriamente se non sai a priori "quanti" e "quali" oggetti allocare).


Invece di fare : LoopOscillator* osc;
e poi : osc = new LoopOscillator (par1, par2);

potresti fare : LoopOscillator osc;
e poi : osc.init(par1,par2);