|
|
|
Oggi iniziamo una serie di “lezioni” ed
esperienze di laboratorio che ci porteranno alla programmazione e utilizzo
di un microcontrollore cioe` di un computer in miniatura. Il cuore di
questo piccolo computer e’ il microprocessore. |
|
|
|
Per poter arrivare a comprendere come utilizzare
un microcontrollore abbiamo bisogno di qualche lezione ed esercitazione
introduttiva per avere almeno un’idea di massima sulla struttura di un
computer sia dal punto di vista Hardware (HW) che Software (SW). |
|
|
|
HW :
“la plastica, gli integrati, l’alluminio...” tutto cio` che si puo` toccare
(CPU, ROM, RAM, tastiera, mouse...). |
|
SW :
i programmi che fanno fare qualcosa al computer (sistema operativo, drivers
per le periferiche, compilatori, programmi applicativi...). |
|
|
|
|
|
|
|
|
|
|
|
Il C è un linguaggio: semplice (~30 keywords) |
|
strutturato |
|
procedurale |
|
tipizzato |
|
Basso livello (vicino all’architettura del
sistema) |
|
Grande flessibilità (adatto anche a grandi
progetti) |
|
|
|
|
|
|
|
Il C è “case sensitive”: MyFunction ¹ myfunction |
|
La formattazione è libera MA |
|
gli spazi possono essere inseriti SOLO tra un “token”
e l’altro! |
|
è necessario almeno uno spazio tra due tokens
che non siano delimitatori ( parentesi, “ , ‘ , …. ) |
|
|
|
|
Le parentesi graffe { … } racchiudono un gruppo
di istruzioni da trattare come una singola azione:
es.: corpo di una funzione, corpo di un ciclo, ecc.. |
|
Il punto e virgola chiude tutte le istruzioni |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
int main() { |
|
int i; |
|
for(i=0;i<10;i++) |
|
{ |
|
printf("Hello !\n"); |
|
printf(“Lab III !\n"); |
|
} |
|
return
0; |
|
} |
|
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
int main() { |
|
int i =
0; |
|
while(i
<10) |
|
{ |
|
printf("Hello !\n"); |
|
printf(“Lab III !\n"); |
|
i = i
+1; |
|
} |
|
return
0; |
|
} |
|
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
int main() { |
|
int i =
0; |
|
do { |
|
printf("Hello !\n"); |
|
printf(“Lab III !\n"); |
|
i = i
+1; |
|
} while(i <10); |
|
|
|
return
0; |
|
} |
|
|
|
|
|
|
Maggior controllo sui cicli: istruzioni di salto |
|
istruzione break;:
causa l’immediata
uscita dal più interno dei cicli in cui si trova |
|
istruzione continue;:
causa l’esecuzione immediata dell’istruzione di chiusura del ciclo, cui
segue l’iterazione successiva del ciclo |
|
istruzione goto label;:
salto incondizionato all’etichetta label:;
consente l’uscita da molti cicli annidati |
|
istruzione return espr_opz;
esce dalla
funzione corrente ritornando opzionalmente il valore di espr_opz |
|
|
|
|
|
|
|
Assegnamento: operatore = |
|
lvalue = espr; |
|
significato: valuta l’espressione espr
assegna
espr ad lvalue
ritorna espr |
|
è associativo da destra a sinistra |
|
per assegnare il valore 10 alle variabili a e b,
si può scrivere: a = b = 10; |
|
|
|
|
|
Tra tipi numerici: |
|
moltiplicazione e divisione: *, / |
|
resto della divisione : % (es.: 20 % 9 fa 2) |
|
addizione sottrazione: +, - |
|
Non esiste un operatore di elevamento a potenza |
|
Booleiani |
|
Equivalenza (e non) di espressioni logiche: ==,
!= |
|
AND tra espressioni logiche: && |
|
OR tra espressioni logiche: || |
|
NOT di espressione logica: ! |
|
|
|
|
|
|
Operatori di manipolazione dei bit: |
|
AND bit a bit: & |
|
OR ed XOR bit a bit: |, ^ |
|
spostamento a sinistra e a destra: <<,
>> |
|
es.: a: 1000000010101101
a << 2: 10 0000001010110100 |
|
NOT bit a bit (complemento a 1): ~ |
|
Operatori relazionali: |
|
minore e maggiore: <, > |
|
minore o uguale, maggiore o uguale : <=,
>= |
|
|
|
|
|
|
Espressioni di assegnamento in forma compatta: |
|
a = (a + b);
si può anche scrivere |
|
a += b; |
|
L’operatore += si comporta come un operatore di
assegnamento, e quindi ritorna il valore assegnato, es.:
c += a +=
b + 1; significa
a = a + (b + 1); c = (c + a); |
|
Analogamente abbiamo: |
|
-=, *=, /=, %=, &=, ^=,|=, <<=, >>= |
|
|
|
|
|
Operatori di incremento e decremento: |
|
notazione prefissa: |
|
++a; incrementa a e ritorna il nuovo valore |
|
--a; decrementa a e ritorna il nuovo valore |
|
notazione postfissa: |
|
a++; ritorna a e, dopo, lo incrementa |
|
a--; ritorna a e, dopo, lo decrementa |
|
Possono essere applicati a tutti i tipi interi
(e ai puntatori) |
|
|
|
|
|
|
casting: |
|
( type ) espr;
forza l’espressione espr
ad essere interpretata come fosse di tipo type es.: |
|
double f;
f = ( double ) 10; |
|
sizeof: |
|
ritorna la dimensione in bytes di un tipo |
|
unsigned int size;
size = sizeof( float ); |
|
|
|
|
|
|
I vettori sono memorizzati in locazioni di
memoria consecutive |
|
L’indice del primo elemento è 0 |
|
|
|
|
|
|
Tutte le istruzioni del linguaggio C sono di
basso livello. |
|
Le operazioni complesse (compreso l’I/O !) sono
effettuate dalle funzioni delle “librerie standard” (abbiamo visto ad es.: printf(…)) |
|
Le librerie più comunemente usate sono: |
|
Input e output: <stdio.h> |
|
Manipolazione stringhe: <string.h> |
|
Funzioni matematiche: <math.h> |
|
Gestione della memoria ed altre
utilità: <stdlib.h> |
|
|
|
|
|
Per la parte di HW e struttura di
Microprocessore : |
|
- P.
Horowitz W. Hill, The Art of electronics. |
|
Testo sacro: |
|
B.W. Kernighan, D.M. Ritchie:
The C programming language |
|
Altri libri: |
|
I. Pohl: A Book on C |
|
M. Waite, S. Prata: New C Primer Plus (2nd.
Ed.) |
|
Materiale su www: |
|
T. Love:
ANSI C for Programmers on UNIX Systems |
|
(http://www.nd.edu/~cchen/teaching_C/node3.html) |
|