Il Blog di Fabrizio Mondo

Archive for luglio, 2009

Hardware – I connettori

luglio 29, 2009 2:07 pm

Settantaduesimo articolo dedicato alle web radio

Una delle tantissime critiche che gli amici che mi seguono nella creazione dei miei articoli mi fanno, è quella di dedicarmi ed essermi dedicato pochissimo all’hardware.

Nel cercare di colmare questa lacuna, cominciamo parlando della cosidetta “cavetteria” ossia i connettori.

I connettori più usati in ambito audio, e che troviamo praticamente sempre in qualsiasi web radio più complessa di un semplice winamp + dsp + server shoutcast, sono questi:

  • Connettore RCA
  • Connettore JACK
  • Connetore XLR

RCAIl connettore RCA è uno dei connettori più usati per audio semiprofessionale. Il connettore RCA è mono, viene cablato su cavo coassiale e può trasportare un solo canale alla volta.

Nel caso più comune, il cavo è di tipo maschio/maschio, con una spina a ogni estremità. Un eventuale cavo di prolunga è di tipo maschio/femmina, con presa volante su un’estremità del cavo.

Il connettore è composto da una protuberanza centrale (maschio) o da un foro (femmina), circondati da un anello, separati da un isolante di plastica o ceramica. Il bloccaggio della connessione non è meccanico, ma avviene a pressione, sfruttando la piccola differenza di diametro dell’anello esterno.

Da notare che, a differenza di connettori professionali come il tipo XLR, il polo centrale viene in contatto con l’altro connettore prima della massa, per cui accade spesso che durante la connessione si verifichino ronzii o soffi se questa avviene ad apparecchiature accese.
Connettori audio RCA.

Nel cablaggio di apparati audio, questo connettore si trova frequentemente in configurazioni a Jack-Doppio RCA, che permette di collegare un lettore CD o un PC ad un Mixer; in questo caso i connettori RCA sono colorati in modo diverso, per distinguere il canale destro dal sinistro, il destro è solitamente rosso, mentre il sinistro può essere sia bianco che nero.

(Fonte: Wikipedia)

JACK
Il connettore jack è senza alcun dubbio il connettore più usato per la connettività delle piccole apparecchiature audio. Si distinguono abitualmente tre tipi di connettori jack secondo il diametro :

* Jack 2.5 mm: il più piccolo jack,
* Jack 3.5 mm: il jack classico, corrispondente alla presa cuffia,
* Jack 6.35 mm: il jack usato per la sonorizzazione semi-professionale per collegare gli altoparlanti, gli amplificatori o i microfoni.

Ognuno di questi jack si declina in due versioni :

* jack mono, per le trasmissioni di un suono monofonico. Questo tipo di jack possiede due contatti : una referenza, sul corpo della fiche, e il segnale sulla punta.
* jack stereo, per la trasmissione di un suono stereofonico. Questo tipo di jack possiede tre contatti, cioè gli stessi contatti che il connettore jack nonché un anello supplementare che permette la trasmissione di un altro canale audio.

Questo connettore dispone di tre contatti e quindi può realizzare connessioni audio sbilanciate con 2 canali (sinistro e destro) e connessioni audio bilanciate ad 1 canale.

Il connettore JACK offre un buon contatto elettrico, una buona resistenza meccanica e una pessima resistenza alla trazione.

(Fonti: Dreamvideo, kioskea)

XLRIl connettore XLR fu prodotto per la prima volta negli Stati Uniti dalla Cannon Electric, la sigla XLR deriva dal nome originale Cannon X , a cui furono aggiunte prima un blocco (Latch) di sicurezza, e poi un isolante di gomma (Rubber) attorno ai poli. La sigla XLR è a volte interpretata come “eXtra Long Run”. Un connettore XLR può avere diversi schemi di piedinatura, i tipi più comuni sono a tre, quattro e cinque poli.

Nella sua versione a tre poli, il connettore XLR viene usato normalmente per la terminazione di linee audio bilanciate, ma spesso viene usato anche per segnali sbilanciati creando un corto circuito tra il polo di massa e quello freddo. È praticamente l’unico tipo di connettore impiegato per il collegamento di microfoni, mentre per i segnali a livello di linea è più comunemente usato il jack stereo.

Bisogna fare attenzione alle apparecchiature che usano il polo 3 come caldo, perché può capitare facilmente di invertire la polarità del segnale audio.

Sempre la versione tripolare viene usata per le connessioni audio di tipo digitale: in questo caso il sistema di modulazione usato non pone problemi nel caso di connessioni in controfase.

(Fonte: Wikipedia)

Bourne Again Shell – Bash – Introduzione e alcuni script di prova

luglio 7, 2009 4:00 pm

BASH!Uno dei vari argomenti del corso di sistemi operativi, è lo scripting in ambiente unix. Quello che si studia nel mio corso di laurea è la bash, incentrandosi abbastanza sulle regex.

Qui di seguito proporremo e commenteremo alcuni semplici codici bash per automatizzare delle operazioni, li commenteremo e, permettetemelo, che Dio me la mandi buona…

Rinvio tutti a leggere la pagina di wikipedia per maggiori info storico/letterarie.

Prenderò spunto dal sito http://www.pluto.it/files/ildp/HOWTO/Bash-Prog-Intro-HOWTO/Bash-Prog-Intro-HOWTO.html per gli script di esempio riportati

#!/bin/bash
echo Hello World

Questo script ha solamente due righe. La prima indica al sistema quale programma utilizzare per eseguire il file. La seconda riga è l’unica azione compiuta dallo script, che stampa ‘Hello World’ sul terminale tramite il comando echo.

#!/bin/bash
STR=”Hello World!”
echo $STR

La riga 2 crea una variabile chiamata STR e le assegna la stringa “Hello World!”. Poi il VALORE di questa variabile è recuperato inserendo il simbolo ‘$’ all’inizio.

Threads, Mutex e Semafori in C – La programmazione concorrente – Semafori

luglio 4, 2009 11:26 pm

SemaforoContinuiamo la trattazione della programmazione concorrente presentando un altro listato recuperato su internet che possa stavolta mostrarci come funzionano e lavorano i semafori.

I semafori sono una struttura dati che permette la gestione della mutua esclusione tra processi o nel nostro caso tra threads dello stesso processo. Informazioni più complete sui semafori sono disponibili su wikipedia. Noi ci limiteremo ad esaminare del codice sorgente.

#include
#include
#include
#include

/*!
\mainpage Esempio Semafori con Pthreads
\section intro Introduzione
Esempio di utilizzo semafori

\date 10/05/2006
\version 23.24 04/07/2009
\author A.Dal Palu
*/

static sem_t s1,s2; /// semafori

/*!
\brief Codice del thread1

Il thread fa Ping e fa UP sul semaforo dell`altro thread
*/
void *thread1(void * arg)
{
int i;
for (i=0;i<10;i++){
sem_wait(&s1);
printf("Ping\n");
sem_post(&s2);
}
printf("T1 exit\n");
pthread_exit (0);
}

/*!
\brief Codice del thread2

Il thread fa Pong e fa UP sul semaforo dell`altro thread
*/
void *thread2(void * arg)
{
int i;
for (i=0;i<10;i++){
sem_wait(&s2);
printf("Pong\n");
sem_post(&s1);
}
printf("T2 exit\n");
pthread_exit (0);
}

int main()
{
pthread_t tid1,tid2;
void * ret;

sem_init(&s1,0,1);
sem_init(&s2,0,0);

if (pthread_create(&tid1, NULL, thread1, NULL) < 0)
{ fprintf (stderr, "pthread_create error for thread 1\n");
exit (1);
}

if (pthread_create(&tid2, NULL, thread2, NULL) < 0)
{ fprintf (stderr, "pthread_create error for thread 2\n");
exit (1);
}

pthread_join (tid1, &ret);
pthread_join (tid2, &ret);

printf("Exit\n");
}

Il programma è composto da tre funzioni:thread1, thread2 e il main.

Una volta inseriti gli include e inizializzato le variabili, i semafori, possiamo procedere allo studio del main.

Il main crea i thread, e una variabile d’appoggio chiamata ret, che è un puntatore a void. Dopodichè inizializza i semafori creati e i thread stessi.

Effettua anche il join dei thread e alla fine termina.

La funzione thread1, invece, effettua un altro tipo di operazioni.

La funzione sem_wait sospende il thread chiamante fintanto che il valore del semaforo puntato dall’argomento è diverso da zero. Viene inoltre decrementato automaticamente, ed atomicamente, il contatore. Questo significa che settando il valore del semaforo ad 1 ed effettuando questa chiamata il processo non si arresterà.

Successivamente viene stampato il ping e dopo parte la sem_post.

Al contrario della precedente questa funzione semplicemente incrementa il valore del semaforo passato come parametro. Qualora questo semaforo avesse già raggiunto il massimo numero consentito viene ritornato -1 mentre la variabile ERRNO viene settata ad EINVAL. In caso di successo, invece, viene restituito 0.

Esaminiamo dei possibili scenari di compilazione.

Il codice per come è scritto se viene compilato ed eseguito, restituisce un output del genere:

Ping
Pong
Ping
Pong
Ping
Pong
Ping
Pong
Ping
Pong

T1 exit
Pong
T2 exit
Exit

Questo perchè? Perchè il primo dei due semafori ha come valore iniziale 1. Se si modificano i valori reciproci dei semafori, la situazione cambia non poco.

Ricordiamo intanto quali sono le operazioni che vengono fatte dalle funzioni. All’interno della funzione thread1, che è la prima ad essere invocata, la sem wait diminuisce il valore del semaforo, che non è 0, e per questo il thread non si blocca. Esegue quello che deve eseguire, e invoca la sem post sull’altro thread, che passa da 0 (valore iniziale) a 1.

Il gioco si ripete per il thread 2, proprio come il ping pong ;)

Cosa succede nei casi in cui:
1) I due semafori partono entrambi da 0
2) Il primo parte da 0 e il secondo da 1
3) Partono entrambi da 1
4) Il primo ha un valore molto superiore al secondo
5) Entrambi partono da N

Esaminiamo caso per caso, prima logicamente, poi compilando e vedendo se avevamo ragione o meno…

Se T1 e T2 partono da 0 cosa succede? Viene sempre invocata thread1 per prima, che invoca la wait che incontra un semaforo con valore 0 e blocca il thread. Il quanto finisce e viene fatto lavorare il thread2, che non può non avere lo stesso destino perchè anche lui parte da 0, morale della favola: Deadlock!

Se T1 parte da 0 e T2 parte da 1 cosa succede? Semplicemente il flusso si inverte, e si parte con Pong, piuttosto che con Ping.
Pong
Ping
Pong
Ping
Pong
Ping
Pong
Ping
Pong
Ping

T1 exit
T2 exit
Exit

Questo perchè PRIMA viene eseguita una wait su un semaforo a valore 0.

Se T1 parte da 1 e T2 parte da 1 cosa succede? Non cambia nulla rispetto al partire t1 con 0 e t2 con 0, in quanto comunque t1 avrebbe incrementato t2 prima di terminare la sua esecuzione per cui alla fine, il comportamento è lo stesso.

Se t1 è molto maggiore di t2 in valore iniziale? Semplicemente si vedranno tanti PING consecutivi in base al numero di partenza del semaforo, perchè il ciclo chiamerà sem_wait decrementando un numero che non diventerà 0 prima delle N volte impostate inizialmente. Dopo il ciclo continuerà con un ping pong, fintantochè non si esaurisce il ciclo del primo thread, che muore, e ci saranno da allora solo pong.

Se t1 e t2 partono da N cosa succede? Caso da considerarsi identico al precedente.