La documentazione per me è fondamentale quindi il chip deve essere per forza documentato altrimenti non lo prendo in considerazione, io aggiungo anche un ulteriore vincolo, devo avere i toolchain e i programmatori hardware funzionati sotto Linux anche se non ufficialmente rilasciati dal fabbricante. Le ditte che non sono Linux friendly vengono da me ignorate e boicottate

Il compilatore di riferimento per me è il GCC, permette il cross compiler, supporta praticamente tutte le CPU ancora sviluppate e alcune MCU. Come interfaccia per i programmatori hardware esiste un ottimo progetto open source OpenOCD per interfacciarsi al JTAG, sia per programmarlo che per fare il debug via GDB.
http://gcc.gnu.orghttp://openocd.sourceforge.netCome microcontrollori conosco molto bene gli Atmel AVR, ho diversi chip sotto mano, sono tutti ben documentati con documentazione e application note aggiornati. Supporto del GCC è ottimo, esiste una buona libreria C, diversi programmatori hardware, ottimi forum (non italiani) dove si trova di tutto. La casa madre supporta i tool sotto Linux, quindi per me Atmel viene promossa a pieni voti.
Ho tra le mani dei MSP430 della Texas Instruments, non ho mai avuto tempo di fare qualcosa di serio con questi chip, ho il programmatore e il compilatore GCC compilato apposta, se trovo qualcosa di adatto ci farò sicuramente qualcosa. Anche qui tutto ben documentato, al Texas Instruments ha un supporto minimo per Linux, non come Atmel ma c'è.
Gli ARM famiglia Cortex-M, architettura Harvard (tipica delle MCU) con set d'istruzione Thumb-2 a 16 bit, registri a 32 bit. Qui si divide in due la documentazione, la casa madre del ARM documenta molto bene la parte del set d'istruzione poi i vari fabbricanti come STM e Texas Instruments integrano con la propria. Molto spesso si trovano dei datasheet liberamente rilasciati che sfiorano il migliaio di pagine, se si conosce ARM i 2/3 della documentazione si può tralasciare concentrandosi sulle porte di I/O e device interni, questi devono per forza essere documentate. Il GCC supporta molto bene ARM, ultimante anche un altro compilatore molto particolare LLVM ha il supporto per ARM. Le varie case madri hanno un occhio di riguardo per gli utenti Windows ma ci sono una sei di appassionati che adattano i vari tool come OpenOCD al programmatore hardware. Ho tra le mani il LaunchPad Texas Instruments con ARM Cortex-M4 con il floating-point hardware, un vero lusso per chi proviene dalle MCU a 8 bit, il tool di sviluppo ufficiale esiste per Linux ma bisogna installare più dir 3 GB di programmi, i tool alternativi non ufficiali occupano molto di meno
Intel, qui si parla di CPU, i microntrollori come 8051 non gli ho mai usati anche se ho un compilatore SDCC che gli supporta. Le CPU vengono ben documentati ma Intel è famosa per le istruzioni non documentate, ad esempio per il 286/386 per farlo entrare in protected mode velocemente c'è l'istruzione LOADALL:
http://en.wikipedia.org/wiki/LOADALLse uno disassemblava un vecchio driver per MSDOS della Microsoft HIMEM.SYS se la provava quindi, l'Intel alle ditte amiche forniva la documentazione seria, agli altri venivano omesse le istruzione avanzate, anche se poi in qualche modo trapelavano le informazioni. Le CPU Intel dopo il famoso baco della divisione in floating-point hanno un microcodice aggiornabile esternamente, questo microcodice non è documentato ma è possibile scaricarlo dal sito ufficiale Intel e aggiornare la propria CPU. Di solito viene fatto dal BIOS ma se non viene più aggiornato è possibile farlo se il kernel lo permette. Ad esempio se uno al boot legge una cosa del genere:
Atom PSE erratum detected, BIOS microcode update recommended
si informa e scarica il microcodice il quale non viene memorizzato permanentemente nella CPU ma viene caricato ogni volta al boot e aggiornato, ad esempio:
microcode: CPU0 sig=0x106c2, pf=0x4, revision=0x208
microcode: CPU0 updated to revision 0x218, date = 2009-04-10
solo i dipendenti Intel sanno cosa c'è nel microcodice e come programmarlo.
Gli ARM Cortex-A8/A9/A15 sono delle proprie vere CPU con architettura Von Neumann, set d'istruzioni a 32 e 16 bit, registri a 32 bit, istruzioni SIMD chiamate NEON. Anche qui come per i Cortex-M la documentazione è buona, tranne per la parte per il supporto Java (quello della Sun ora Orache) chiamato nelle ultime versioni Jazelle. Queste CPU sono usate in quasi tutti i cellulari con Android, la parte Jazelle se presente non viene usata, ormai in molti chip non è più presente visto che i cellulari Android si programmano in Java ma hanno una propria JVM e JIT molto diversa rispetto a quella ufficiale Oracle.
Le GPU, qui si entra nel modo della totale mancanza di documentazione, molti telefonini sono formati da un CPU e GPU in un unico chip, come le varie versioni del Tegra del nVidia, la CPU è un ARM ben documentata, la GPU non c'è nulla di pubblico, al massimo esistono i driver del fabbricante e una libreria di programmazione per le OpenGL-ES con al documentazione presente nel sito ufficiale:
http://www.khronos.org/opengles/la programmazione della parte 2D e 3D ricalca quelle delle OpenGL classiche ma non si ha una pipe-line fissa come quella presente nelle prime versioni delle OpenGL. Le OpenGL-ES hanno un compilatore interno per i vertex shader e fragment shader per programmare tutti gli effetti che si vedono nei vari giochi di ultima generazione presenti nei cellulari e Tablet.
Quel chip della Broadcom BCM2835 è formata da una vecchia versione del ARM e una GPU, è la GPU non documentata come quella dei concorrenti, c'è una grossa competizione tra i fabbricanti per sviluppare la migliore GPU con basso consumo e alte prestazioni, se si riesce nell'obbiettivo i potenziali guadagni sono enormi visto il numero di telefonini e tablet venduti nel mondo. Il chip viene usato dalla Raspberry PI:
http://www.raspberrypi.org/per quel chip stanno lavorando per migliorare le prestazioni sotto Wayland (un potenziale sostituto del X11) sotto Linux:
http://www.raspberrypi.org/archives/4053per poter sfruttare il più possibile la GPU per tutta la parte grafica liberando ARM da alcuni compiti gravosi.