Newsgroup: it.hobby.elettronica.digitale
Titolo: (Difficile) - Quale micro ?

Stò cercando un microcontroller per far girare un software che richiede una
certa capacità di calcolo, e non sò quale scegliere.
Quello che devo far girare è una routine di compressione (scritta in C,
occupa circa 25k  se compilata per processori x86), serve anche (almeno)
1Mbyte di RAM per tenere a memoria i dati originali e quelli compressi.
Per la RAM non ho particolari problemi, ma per il micro... non sò cosa
scegliere. Scarterei subito, però, i micro ad 8 bit vista la potenza di
calcolo richiesta.
Sono una buona scelta gli LPC210x di Philips (ammesso sia possibile usarli
con memorie esterne)?
Qualcuno ha esperienza o idee???
Ringrazio chi saprà consigliarmi.
Enzo

 con memorie esterne)?
Non li conosco. Mi sa che a te serve come minimo una cpu a 16 bit
con istruzioni matematiche in hardware e interfacciabile con memorie
esterne. Forse potrebbe essere idoneo un pc embedded, ma
bisognerebbe sapere qualcosa di piu' del tuo progetto.

 memoria i dati originali e quelli compressi.
Credo che un ARM7 possa andare bene (anche se non hai
specificato a che velocità deve comprimere i dati, e che tipo di
compressione devi fare...). Soprattutto se il codice è in C non
dovresti avere nessun problema a farlo girare (per micro più
piccoli a volte è necessario un minimo di "tuning" per ottenere
prestazioni decenti). Ne esistono moltissime versioni, sotto
forma di "microcontrollori", e alcune hanno perfino 1MB di
memoria interna! Fare l'elenco dei produttori e dei modelli sarebbe
troppo lungo (e non mi vengono in mente tutti), comunque
dai un'occhiata a quelli di Philips e Atmel (ce ne sono di più
dotati prodotti da altri, ma forse sono un pò difficili da reperire,
soprattutto in piccole quantità).
A.D.

Ciao, grazie per la risposta.
Quanto devo fare è comprimere una immagine in JPEG : non sapendo da dove
cominciare, dopo aver scartato i compressori hardware esistenti (costosi,
difficili da usare, e forse non adattabili alle mie esigenze) ho trovato una
routine scritta in C che sembra poter fare al caso mio.
L'ho fatta girare prima sul pc (vc++) per adattarla al mio scopo (l'immagine
di partenza è in formato YCbCr), e poi l'ho portata su un MicroBlaze (un
"soft" processor a 32 bit per FPGA).
Funziona, ma con ottimizzazioni varie e clock a 87.5MHz, impiega circa 35
secondi a comprimere una immagine di 320x240 pixel, e io la dovrei usare con
immagini VGA.  (:-(
Da quanto ho letto, il mio processore da 65 DMIPs ne ha solo 6 o 7 se fatto
girare con memorie esterne : ne deduco che mi serva qualcosa di più potente.
Penso che l'accesso a memorie esterne, anche le SRAM più veloci, limiti la
velocità del processore : così penso di prendere un processore "veloce" e
con abbastanza FLASH interna da poter contenere la routine di compressione +
le tabelle di lookup, così accederebbe alla memoria esterna solo per la
lettura dell'immagine da comprimere e la scrittura di quella compressa. E'
una buona idea??
   ~ - ~ - ~
Per la mia applicazione potrei usare un LPC2214 (256KB FLASH, memorie
esterne) : tanto che ci siamo, sapresti consigliarmi qualche link da
"curiosare" per cominciare?
Saluti.
Enzo

 "curiosare" per cominciare?
mmmm mesà non hai letto quello che ha detto Valeria vero?
Per sta roba si usano i DSP non i micro...
Guarda sul sito Texas o Analog Devices ad esempio.
coals
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 consigliarmi qualche link da "curiosare" per cominciare?
Riguardo al micro non mi viene in mente nessun sito... però
ti consiglio di dare un'occhiata al materiale che si trova in rete
per la programmazione del GameBoy Advance, che contiene
un ARM7, e in cui spesso viene usata proprio la compressione
JPEG per salvare le immagini (alcune routine ausiliarie sono
perfino nella BIOS). Ci sono dei compilatori appositi per
sviluppare videogames, che tra le varie librerie hanno anche funzioni
molto ottimizzate per la compressione/decompressione JPEG.
Tra l'altro molti sono gratuiti. Dai un'occhiata su 
www.gbadev.org
Ciao,
A.D.

 difficili da usare, e forse non adattabili alle mie esigenze)
Hai visto questo? 
http://www.analog.com/en/prod/0%2C2877%2CADV202%2C00.html
Ce l'ha persino Digikey e non mi sembra cosě impossibile da usare, e
supporta JPEG2000. L'unico inconveniente č che č disponibile solo in
formato BGA.
Altrimenti tutto dipende dalle prestazioni che ti servono, cosa
fondamentale che ti sei dimenticato di dire. L'ADV202 č in grado di
comprimerti in tempo reale una sorgente PAL, e se ne metti due in parallelo
pure una sorgente HDTV. Se ti servono prestazioni simili, tira pure una
croce sopra sui microcontrollori generici e su qualsiasi cosa a 16 bit...
-- 
asd

Grazie nuovamente per la risposta.
Continuando le prove, ho visto che quello che richiede più tempo è
l'esecuzione della DCT, per la quale nel listato che stò facendo girare è
usato il metodo AA&N (5 moltiplicazioni e 29 addizioni floating point).
Le stesse righe le ho trovate nelle routines del JPEG Indipendent Group, ed
anche nei sorgenti di altri compressori.
Ho rovistato anche in 
gbadev.com
, dove ho visto che sono più utilizzate la
routines di decompressione. La compressione, ovviamente, è usata per
sfruttare al meglio lo spazio sulle cartucce.
Consiglio di visionare questo sito anche a chi dice che la compressione JPEG
si possa fare con soli DSP, scopriranno (come ho fatto io) qualcosa di
nuovo.
:-)
Per pura curiosità, mi piacerebbe sapere se anche un DSPIC riesce a
comprimere in tempi "umani"...
Tornando a gbadev, ho visto che alcuni sorgenti fanno riferimento alle
librerie FreeImage, che ho scaricato, e tra quelle dedicate al JPEG... ci ho
trovato nuovamente la DCT eseguita con metodo AA&N. Ce ne sono anche altre,
ma (da quanto ho capito) sono più veloci della mia perchè usano degli interi
a 32 bit o numeri fixed point anzichè i float, in questo caso i tempi di
esecuzione diminuiscono molto ma la qualità dell'immagine peggiora
visibilmente (rimanendo comunque accettabile per un videogioco).
Seguendo i tuoi consigli, ho deciso di rimanere sul MicroBlaze.
Ho abilitato moltiplicatore e barrel shifter; non ho SDRAM bensì della SRAM
(256K x 32) per codice e dati, ed ora ho allocato la routine che esegue la
DCT, assieme alle variabili che usa, nella Block RAM interna.
Il tempo di esecuzione per la compressione di una immagine 320x240 è
diminuito da 35 a circa 15 secondi (circa 10ms per tile), ma non è comunque
poco...
Aggiungendo al MicroBlaze un coprocessore matematico o un blocco hardware
che esegue la DCT senza dubbio si velocizzerebbe il tutto, il problema è che
non sò come farlo! Purtroppo non ho troppa familiarità col VHDL e non ho
idea di come interfacciarmi al MicroBlaze.
Ma non mi arrendo adesso...
Grazie per l'aiuto che mi hai dato finora!
Enzo

 velocizzerebbe il tutto, il problema è che non sò come farlo!
Il coprocessore matematico (inteso come FPU) lo escluderei,
perchè oltre ad occupare tanto, poi avresti problemi col
compilatore. Un coprocessore DCT invece potrebbe aiutare
moltissimo! Basterebbe anche un semplice moltiplicatore SIMD
per accelerare abbastanza. Se non hai particolare urgenza forse
potrei aiutarti... Che FPGA stai usando? Hai ancora qualche
moltiplicatore hardware libero?
A.D.

 moltiplicatore hardware libero?
Vincoli di tempo non ne ho perchè tutto è puramente a scopo hobbystico,
quanto vorrei fare è comprimere l'immagine fornita da una microcamera VGA
(di quelle usate nei cellulari). Se per caso ti può interessare della
documentazione... chiedi pure.
Di seguito le risorse usate, ho ancora 9 moltiplicatori, della bram, e
qualcosina ancora. Il mio FPGA è uno XC3S200.
   Number of External IOBs            78 out of 173    45%
   Number of LOCed External IOBs   78 out of 78    100%
   Number of MULT18X18s                3 out of 12     25%
   Number of RAMB16s                   4 out of 12     33%
   Number of Slices                 1676 out of 1920   87%
   Number of SLICEMs              323 out of 960    33%
   Number of BSCANs                    1 out of 1     100%
   Number of BUFGMUXs                  4 out of 8      50%
   Number of DCMs                      1 out of 4      25%
I sorgenti sono qui :
http://www.geocities.com/b94_1999/camera/jpeg_encoder.zip
sono possibili varie ottimizzazioni, ma per ora vorrei solo capire quanto
(per l'esattezza quanto, se, ed anche come) è possibile accelerare i
processi di DCT e quantizzazione, che sono quelli che chiedono più tempo.
Ti ringrazio nuovamente per l'aiuto che mi stai dando.
Ciao.
Enzo

 che sono quelli che chiedono piů tempo.
Per la DCT, con un coprocessore riusciresti ad elaborare un
blocco 8x8 in qulche decina di cicli di clock (diciamo massimo
50 cicli), mentre lui lavora potresti recuperare i dati dalla
memoria, e trasferire il risultato precedente, lavorando in pipeline.
Praticamente riusciresti a trasformare l'intera immagine in qualche
millisecondo! [Stima grossolana ma realistica]
Per la quantizzazione non saprei, non mi ricordo bene che
operazioni bisogna fare... ma mi pare che sia meno pesante
della DCT...
Ciao,
A.D.
P.S. Hai abilitato l'ottimizzazione del compilatore? (-o2 o -o3)