tutorial c iulie2004
TRANSCRIPT
-
8/19/2019 Tutorial C Iulie2004
1/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 1Siemens VDOSiemens VDO
Programarea în limbajul C
Programarea C pentru aplicaţii dincategoria automotive
Iulie 2!
-
8/19/2019 Tutorial C Iulie2004
2/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 2Siemens VDOSiemens VDO
Cuprins
Introducere în limbajul C
Introducere în limbajul de asamblare (C16x)
Programarea în limbaj C la nivel scăzut pentru aplicaţiiautomotive
Programarea C de nivel înalt pentru aplicaţii automotive
eguli algoritmice
C"#$
-
8/19/2019 Tutorial C Iulie2004
3/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 3Siemens VDOSiemens VDO
"% Introducere în limbajul C
"% Introducere în limbajul C
-
8/19/2019 Tutorial C Iulie2004
4/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 4Siemens VDOSiemens VDO
Caracteristicile limbajului C
!imbaj pentru aplicaţii de uz general" Conceput de către programatori# pentru programatori" !imbaj universal" $ste e%icient în comparaţie cu alte limbaje de a treia generaţie
(Pascal)" $ste dependent# ca putere# de biblioteci"
A doua generatie A treia generaţie A patra generaţie
C&&' Ada' (avaAsamblor C PASCAL
-
8/19/2019 Tutorial C Iulie2004
5/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 5Siemens VDOSiemens VDO
C ) limbaj de nivel înalt sau sc*+ut ,
$ste considerat limbaj de nivel înalt doar prin comparaţie cu
asamblorul" &intre limbajele de nivel înalt# are nivelul cel mai scăzut" 'pre deosebire de alte limbaje# programatorul trebuie să cunoască
comportamentul compilatorului"
-n Pascal . i/ 0cond" A1D cond2
-n C i/ 0cond" 33 cond2
Cond" se evaluea+* prima
-
8/19/2019 Tutorial C Iulie2004
6/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 6Siemens VDOSiemens VDO
Comparaţie C 4 Assembler
Ce este comun ambelor limbaje odularizarea programelor *i a datelor Constante# variabile *i etic+ete de program simbolice 'tructuri de programare de tip macro
Ce există în C# dar nu *i în ,ssembler 'tructuri de date elaborate
- *iruri# tablouri# structuri- pointeri- enumeraţii
'tructuri de control elaborate- I% else
- .ucle- Case /uncţii cu parametri# recursivitate"
-
8/19/2019 Tutorial C Iulie2004
7/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 7Siemens VDOSiemens VDO
Comparaţie C 4 Assembler
!imite ale limbajului C cînd se programează la nivelscăzut !imbajul în sine este independent de ma*ină# dar o implementare
anume este dependentă de biblioteci" ,par di%icultăţi sau elemente nestandard atunci cînd este necesar
accesul nemijlocit la resursele +ard0are"- egistre- ,drese %izice- ntreruperi
-
8/19/2019 Tutorial C Iulie2004
8/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 8Siemens VDOSiemens VDO
Comparaţie C 4 C&&
Ce există în C22# dar nu *i în C
Programare orientată către obiecte- Clase# încapsulare (privat# public)- o*tenire- Polimor%ism
,lte mecanisme- 3ipizare puternică- Conversii avansate- $xcepţii- 4abloane de proiectare
&ezavantaje ale C în programarea la nivel înalt &i%icultăţi în reutilizarea programelor (lipsa mo*tenirii) &i%icultăţi în programarea generică (lipsa *abloanelor)
-
8/19/2019 Tutorial C Iulie2004
9/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 9Siemens VDOSiemens VDO
Conte$tul aplicaţiilor automotive
ulte obiective 5biective de mentenabilitate 5biective de reutilizabilitate
ulte constrîngeri
Constrîngeri de e%icienţă Constrîngeri de robusteţe *i %iabilitate
-
8/19/2019 Tutorial C Iulie2004
10/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 10Siemens VDOSiemens VDO
Impactul conte$tului automotive
/olosirea programării la nivel scăzut pentru a atinge obiectivele dee%icienţă
/olosirea unor elemente de nivel înalt pentru a îmbunătăţi mentenabilitatea robusteţea reutilizabilitatea
&e ce se %olose*te limbajul C C este singurul limbaj care are medii de dezvoltare a aplicaţiilor pentru
microcontrolerele %olosite în aplicaţiile automotive $xistă *i unele extensii C22"
-
8/19/2019 Tutorial C Iulie2004
11/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 11Siemens VDOSiemens VDO
Versiuni ale limbajului C
'tandardele 78 # ,9'I" Programare la nivel scăzut" !imitări %oarte mari în ceea ce prive*te accesul direct la resursele +ard0are"
:ersiunile native C" 'e caracterizează prin aceea că compilatorul rulează pe acela*i procesor pe
care va rula *i programul compilat" :ersiunile C cross;compilate"
Compilatorul rulează pe alt procesor decît cel pentru care compilează" $xistă multe produse de calitate inegală" &epind de %urnizor# de numărul de licenţe ac+iziţionate etc"
3endinţe curente" C nativ C este înlocuit de C22#
-
8/19/2019 Tutorial C Iulie2004
12/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 12Siemens VDOSiemens VDO
2% Introducere în limbajulde asamblare
al microcontrolelelor dinseria C"#$
2% Introducere în limbajulde asamblare
al microcontrolelelor dinseria C"#$
C"#$
-
8/19/2019 Tutorial C Iulie2004
13/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 13Siemens VDOSiemens VDO
Structura C"#$
1ucleul CP56O7intern
6A7intern
C"#$
6A7e$tern
6O7e$tern
-
8/19/2019 Tutorial C Iulie2004
14/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 14Siemens VDOSiemens VDO
Structura CP5
6egistre de stiv*
6egistre pipeline
6egistre de paginare 8i segmentare
7D9 4 7DL
6egistre de u+ general de "# biţi
6A7Intern
6egistre de conte$t
C"#$
AL5
-
8/19/2019 Tutorial C Iulie2004
15/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 15Siemens VDOSiemens VDO
Caracteristici ale seriei de microcontrolere
5rganizare pe principiul I'C" Principii de adresare
>tilizarea pre%erenţială a registrelor pentru operaţiile aritmetico?logice Pentru instrucţiile 5: un operand este în memorie iar altul într;un
registru ,dresare pe cîmpuri de biţi" /azele execuţiei unei instrucţii
Pre;%etc+ $xecuţia propriu;zisă
,dresare segmentată *i paginată"
C"#$
-
8/19/2019 Tutorial C Iulie2004
16/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 16Siemens VDOSiemens VDO
Instrucţiile limbajului de asamblare Instrucţii ,! standard
aritmetice
- ,& '>.# ,'@ - :ariante de lungime ,&&.- ,lte variante ,&&C
logice- ,9#'@!
combinate
- 5:.A# 5:.' Instrucţii ,! nestandard
5peraţii pe bit- .5:# .5:9# .'$3# .C!
nmulţire *i împărţire- >!# &I:# >!># &I:>
Instrucţii de salt"
C"#$
-
8/19/2019 Tutorial C Iulie2004
17/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 17Siemens VDOSiemens VDO
7odurile de adresare
&irectă (pe 16 biţi)5: Bu#
Imediată (pentru operanzi sau adrese)5: 1#D65: E#DBa
Indirectă5: Bu#FEG
elativă5: H#(B'2)
Indexată5: FH2DBCG#!5: FJ2G#!5: F;JG#!
C"#$
-
8/19/2019 Tutorial C Iulie2004
18/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 18Siemens VDOSiemens VDO
:impul de e$ecutie(Minim)
Instrucţia Cicluri de tact Durata (ns) la 20!"
C#$$I% C#$$# 2 100C#$$&% C#$$' 4 200% C% *** 2 100P& 4 200P#% PI 2 100
+$ 10 500DI, 20 1000-, 'n% .'/ 4 200' 4 200'#P 4 200
#ltele 2 100
C"#$
-
8/19/2019 Tutorial C Iulie2004
19/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 19Siemens VDOSiemens VDO
:ipuri de date speci/ice microcontrolerului
&e%inite ca variabile# în %i*iere +eader >tilizabile în cod sursă C 'e re%eră la registre care au %uncţii speciale în microcontroler
Kspecial %unction registersL s%r
Kspecial %unction registers bitsL s%rbit
C"#$
-
8/19/2019 Tutorial C Iulie2004
20/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 20Siemens VDOSiemens VDO
;estiunea tas
-
8/19/2019 Tutorial C Iulie2004
21/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 21Siemens VDOSiemens VDO
@% Programarea în limbaj C lanivel sc*+ut pentru aplicaţii
automotive
@% Programarea în limbaj C lanivel sc*+ut pentru aplicaţii
automotive
C t î li b j C l i l * t
-
8/19/2019 Tutorial C Iulie2004
22/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 22Siemens VDOSiemens VDO
Ce este programarea în limbaj C la nivel sc*+utpentru aplicaţii automotive ,
3e+nicile de programare sînt alese pentru o cît mai maree%icienţă" 'e %olose*te limbajul C" 'e ţine cont de comportamentul compilatorului"
'e %olosesc resurse +ard0are ale microcontrolerului# prinintermediul variabilelor speci%ice" ,cest capitol se bazează pe compilatorul .'5 pentru
microcontrolere din seria C16x" Principiile sînt portabile *i pentru alte compilatoare# dacă acestea
răspund acelora*i constrîngeri"
C"#$
-
8/19/2019 Tutorial C Iulie2004
23/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 23Siemens VDOSiemens VDO
Structura unui program C
uncţii apelate
Date locale
Declaraţii de dateuncţia main
DeclaraţiiInstrucţii?locuri
uncţii apelateDeclaraţiiInstrucţii?locuri
i8ierulprincipal
i8ieresecundare
-
8/19/2019 Tutorial C Iulie2004
24/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 24Siemens VDOSiemens VDO
Declaraţii simpleDeclaraţii simple
-
8/19/2019 Tutorial C Iulie2004
25/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 25Siemens VDOSiemens VDO
Declaraţii de variabile 0"
/iecare variabilă are un nume" /iecare variabilă are un tip" Principalele tipuri
întreg (int) este tipul implicit- pe acest microcontroler este =5& (16 biţi)
Caracter# sau octet (c+ar) 9umăr real (%loat) (nu se %olose*te în programarea de nivel scăzut)
,lte tipuri (nestandard) .it Cîmp de biţi
3ipul de bază al unei variabile poate %i modi%icat în mod explicit" odi%icatori de lungime
s+ort
long ,tenţie pe procesoare de 16 biţi# int *i s+ort int sînt ec+ivalente" &oar tipul
c+ar are are lungimea de un octet (bMte)"
C"#$
-
8/19/2019 Tutorial C Iulie2004
26/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 26Siemens VDOSiemens VDO
Declaraţii de variabile 02
odi%icatori de semn unsigned signed
odi%icator de volatilitate" volatile o dată se nume*te volatilă dacă poate %i modi%icată în mod asincron
de către mai multe procese" odi%icatori de vizibilitate
Implicit# orice variabilă este locală# adică vizibilă doar în interiorul %uncţieisau blocului în care a %ost declarată"
static o variabilă statică este locală# dar î*i păstrează valoarea la părăsireadomeniului de vizibilitate"
extern o dată declarată în alt %i*ier sau modul"
-
8/19/2019 Tutorial C Iulie2004
27/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 27Siemens VDOSiemens VDO
Declaraţii de variabile 0@
'intaxaNtipO NnumeO
sauNmodi%icatorO NtipO NnumeO
sau NtipO N9ume1O# N9umeO# """
$xempleint x
bit bs+ort int xstatic c+ar xunsigned c+ar x
volatile int x#M ,tenţie la utilizarea tipului implicit în declaraţii combinate
unsigned x# M ?Q M este signed Q?
-
8/19/2019 Tutorial C Iulie2004
28/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 28Siemens VDOSiemens VDO
Domeniul de repre+entare al tipurilor simple
intdimensiune octeţi (dependent de +ard0are)
alte nume signed# signed intdomeniu ;E#R6S pînă la E#R6R (pentru octeţi)
unsigned intdimensiune octeţi (dependent de +ard0are)alte nume unsigneddomeniu J pînă la E#R6R (pentru octeţi)
c+ar dimensiune 1 octetalte nume signed c+ar domeniu ;1S pînă la 1R
unsigned c+ar
dimensiune 1 octetalte nume ;;;domeniu J pînă la
-
8/19/2019 Tutorial C Iulie2004
29/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 29Siemens VDOSiemens VDO
Domeniul de repre+entare al tipurilor simple 02 s+ort
dimensiune octeţi (independent de +ard0are)
alte nume s+ort int# signed s+ort intdomeniu ;E#R6S pînă la E#R6R
unsigned s+ortdimensiune octeţi (independent de +ard0are)alte nume unsigned s+ort intdomeniu J pînă la E#R6R
long dimensiune H octeţi alte nume long int# signed long int domeniu ;#1HR#HSE#6HS pînă la #1HR#HSE#6HR
-
8/19/2019 Tutorial C Iulie2004
30/167
D l ţii d t t 0"
-
8/19/2019 Tutorial C Iulie2004
31/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 31Siemens VDOSiemens VDO
Declaraţii de constante 0"
/iecare constantă are un nume"
/iecare constantă are un tip" /iecare constantă are o valoare" :aloarea unei constante este dată printr;un KliteralL (nu se
acceptă expresii pentru iniţializare)"
&eclaraţia unei constante poate conţine modi%icatori" 5 constantă este alocată în memorie (se rezervă memorie
în zona de 5)" 3ipul unui literal
3ipul implicit este întreg" Poate %i modi%icat la unsigned (>) sau long (!)"
D l ţii d t t 02
-
8/19/2019 Tutorial C Iulie2004
32/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 32Siemens VDOSiemens VDO
Declaraţii de constante 02
'intaxa const NtipO NnumeO T NvaloareO
$xemple corecte const unsigned int t T 1U> const unsigned int j T JJ1 ?Q octal Q? const unsigned int V T Jx// ?Q @exa Q? const long e T 1! const c+ar c T WcW const c+ar d T WXJJRW ?Q 5ctal Q?
$xemple incorecte 9everi%icate de către compilator
- const unsigned int t T ;1JJ- const c+ar a T JJ
:eri%icat de către compilator - const c+ar b T a21
Alt mod de a de/ini valori constante.
-
8/19/2019 Tutorial C Iulie2004
33/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 33Siemens VDOSiemens VDO
Alt mod de a de/ini valori constante.de/inirea de simboluri
5rice simbol are un nume" 5rice simbol are o valoare" :aloarea trebuie să %ie un literal# ca *i la constante" >n simbol nu este alocat (nu se rezervă spaţiu în 5)" &e%iniţia simbolurilor va %i detaliată mai tîrziu în curs
(capitolul despre preprocesare)" 'intaxa
Dde%ine 9CBCY!B9 H
Alt d d d /i i l i t t
-
8/19/2019 Tutorial C Iulie2004
34/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 34Siemens VDOSiemens VDO
Alt mod de a de/ini valori constante.de/inirea de valori enumerate
3ipul KenumeraţieL este un tip de%init de utilizator *i constă într;un set de valori constante#numite enumeratori" Implicit# primul enumerator are valoarea zero# iar următorii se obţin prin incrementare# dacă nu se speci%ică explicit alte valori"
/iecare enumerator este tratat ca o constantă *i trebuie să aibă o denumire unică în cadruldomeniului de de%iniţie"
$xempluenum Aile Z ?Q&eclaratie de tip AileQ? 'imbata# ?Q 'imbata T J# implicitQ?
&uminica T J# ?Q &uminica T J (la %el ca 'imbata)Q? !uni# ?Q !uni T 1Q? arti# ?Q arti T Q? iercuri# ?Q etc"" Q?
-
8/19/2019 Tutorial C Iulie2004
35/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 35Siemens VDOSiemens VDO
:ipul enumeraţie
3ipul enumeraţie este ec+ivalent cu tipul întreg" >n enumerator poate %i atribuit unei
variabile întregi" 3otu*i# conversia inversă necesită un cast explicit iar valoarea obţinutănu este întotdeauna de%inită" $xemplu
int ieri T
-
8/19/2019 Tutorial C Iulie2004
36/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 36Siemens VDOSiemens VDO
enum EEPSTATE {EEP_IDLE, EEP_BEF_PROG,EEP_PROG,EEP_AFT_PROG1,EEP_AFT_PROG2};
.../* State = I!e */ "u#_Ee$P%mState = EEP_IDLE;...
&'(t) +"u#_Ee$P%mState { e-au!t #-&&e""_"&t+E_E2P; #"ea0; )a&e EEP_IDLE #ee$mana_(!e+; #"ea0; )a&e EEP_BEF_PROG #ee$mana_#e-$"%+; #"ea0;
)a&e EEP_PROG #ee$mana_$"%+; #"ea0; )a&e EEP_AFT_PROG1 #ee$mana_a-t$"%1+; #"ea0; )a&e EEP_AFT_PROG2 #ee$mana_a-t$"%2+; #"ea0; }
...(- + "u#_Ee$P%mState == EEP_IDLE { "u#_IneB!)0 = "u'_3umB!)0; #ee$mana_!a_(ma%e+; "etu"n+TR4E; }
Iniţiali+area unei variabile
-
8/19/2019 Tutorial C Iulie2004
37/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 37Siemens VDOSiemens VDO
Iniţiali+area unei variabile
$ste posibil să iniţializăm o variabilă la de%inirea sa" 'intaxa
NtipO NnumeO T NexpresieO
$xempluint iT1
$%ect compilatorul va genera o secvenţă speci%ică de
cod pentru a iniţializa variabila" 9u se recomandă %olosirea" ,tenţie nu con%undaţi o constantă cu o variabilă
iniţializată"
Detalii privind alocarea datelor
-
8/19/2019 Tutorial C Iulie2004
38/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 38Siemens VDOSiemens VDO
Detalii privind alocarea datelor
n programarea C pentru microcontrolere datele trebuie alocate precis" &e%iniţi secţiuni di%erite pentru di%erite tipuri %izice de
memorie" &e%iniţi secţiuni în %uncţie de persistenţa datelor"
/olosiţi directiva C!,'' pentru a de%ini *i selecta o anumesecţiune pentru un anume set de date" 9estandard C %olosiţi directive KpragmaL"
C"#$
C"#$
Conceptul de secţiune
-
8/19/2019 Tutorial C Iulie2004
39/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 39Siemens VDOSiemens VDO
Conceptul de secţiune
5rganizarea logică a datelor"
i8ier "Secţiunea Aint a"int a2Secţiunea ?int a@
i8ier 2Secţiunea Aint b"Secţiunea Cint b2
i8ier @Secţiunea Cint c"Secţiunea ?int c2
Secţiunea Aa"a2b"
Secţiunea ?a@c2
Secţiunea Cb2c"
Conceptul de secţiune în ?SO
-
8/19/2019 Tutorial C Iulie2004
40/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 40Siemens VDOSiemens VDO
Conceptul de secţiune în ?SO
'ecţiunea :ariabile" class biT.I3B'$C3I59B$\,P!$
class baT.I3=5&B'$C3I59B$\,P!$ class nbT9$,B&,3,B'$C3I59B$\,P!$ class %bT/,B&,3,B'$C3I59B$\,P!$ class +bT@>]$B&,3,B'$C3I59B$\,P!$
'ecţiunea Constante" class ncT9$,BC59'3,93B'$C3I59B$\,P!$ class %cT/,BC59'3,93B'$C3I59B$\,P!$ class +cT@>]$BC59'3,93B'$C3I59B$\,P!$
'ecţiunea Cod" class prTC5&$B'$C3I59B$\,P!$
,ltele în %uncţie de aplicaţie" Partiţionarea %izică a memoriei anagementul logic al memoriei
C"#$
B$emple de declaraţii
-
8/19/2019 Tutorial C Iulie2004
41/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 41Siemens VDOSiemens VDO
B$emple de declaraţii5(n)!ue 6e-"am#.6 /* Ste$ - te (a%n&t() &te$ ma)(ne */PRI7ATE_DATA T_4B8TE "u#_9'$:ana%eSte$;
ETER3 T_BIT "#(_D(a%Runn(n%;
5(n)!ue 6e-"am#.6ETER3 T_4B8TE "u#_Se"e u&(n% Su")e Statement
-
8/19/2019 Tutorial C Iulie2004
42/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 42Siemens VDOSiemens VDO
Expresii Expresii
B$presii aritmetice 8i logice
-
8/19/2019 Tutorial C Iulie2004
43/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 43Siemens VDOSiemens VDO
B$presii aritmetice 8i logice 5peratori *i operanzi
x2Mx 8 1
5peranzi variabile constante simboluri literale
5peratori
5peratorii clasici binari *i unari2#;#Q#?#^# etc""88#__#`# etc""
5peratori speci%ici- &e acces la date (structuri# tablouri# pointeri)- Pentru apelul %uncţiilor
$xpresiile pot %i des%ăcute în expresii mai simple# %olosind parantezele dacă estenecesar" $xemplu
(x2M) Q g
Bvaluarea e$presiilor
-
8/19/2019 Tutorial C Iulie2004
44/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 44Siemens VDOSiemens VDO
Bvaluarea e$presiilor
'e %ace respectînd anumite
priorităţi"
5rdinea evaluării termenilor ai întîi termenul din stînga pentru
operatori binari" ai întîi termenul din dreapta pentru
operatori unari sau atribuiri" Prioritatea operatorilor
ai întîi înmulţirea *i împărţirea ,poi adunarea *i scăderea
,poi operatorii logici ,poi operatorii de comparaţie ,poi atribuirea
$xemplu a 2 bQc 2 d
întîi a apoi b apoi c
apoi bQc apoi a 2 bQc apoi d n %inalîntreagaexpresie
:ipuri de e$presii
-
8/19/2019 Tutorial C Iulie2004
45/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 45Siemens VDOSiemens VDO
p p
/iecare parte a unei expresii are untip"
3ipul unei expresii este calculat dintipul operanzilor (*i doar aloperanzilor)" $xemplu
c+ar x#M
const int g T
long int p (x 2 M) Q g 2 p
x2 M e de tip c+ar (S biţi# cu semn)
(x2M)Qg e de tip int (16 biţi# cusemn) (casting implicit)
(x2M)Qg2p e de tip long int (E biţi#cu semn) (casting implicit)
&i%erenţe %aţă de assembler
3ipul unei expresii este de%init detipul operatorilor >! xQM# tipul este in%luenţat deoperandul >!
3ipul unei expresii poate %i modi%icat princasting
'intaxa (NtipO) NexpresieO $xemple de casting
((long) (x2M))Qg 2p(E biţi pentru x2M)
((long)x 2M)Qg2p(E biţi pentru întreaga
expresie)
Atribuirea 0"
-
8/19/2019 Tutorial C Iulie2004
46/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 46Siemens VDOSiemens VDO
0
$ste un operator de tip particular" ,tribuie rezultatul expresiei unei variabile
'intaxa T $xemplu
r T (x2M) Qg 2p
3ipul destinaţiei trebuie să %ie compatibil cu tipul expresiei" $xemple
c+ar x#M
const int g T long int p
r T (x 2 M) Q g 2 p
Corect- &acă r a %ost declarat de tip long int (E biţi)
Incorect (*i neveri%icat de către compilator)- &acă r a %ost declarat de tip c+ar sau int- &acă r a %ost declarat unsigned
Atribuirea 02
-
8/19/2019 Tutorial C Iulie2004
47/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 47Siemens VDOSiemens VDO
0
,tribuirea presupune un casting implicit"
$xemplu r codat pe E biţi x2M codaţi pe 16 biţi- n expresia rTx2M doar partea lo0 a lui r (16 biţi) este a%ectată deatribuire" Partea +ig+ este setată prin extensie la 1 sau la J %uncţie desemnul lui x2M"
>n casting explicit se poate %ace înaintea atribuirii"
$xemplu r codat pe E biţi x2M codaţi pe 16 biţi- r T (long) x 2 (long) M expresie evaluată pe E biţi
- r T (long) (x 2 M) expresie evaluată pe 16 biţi (dummM casting)
,tribuirea este un operator care poate %i %olosit în cadrul uneiexpresii" ezultatul atribuirii este valoarea atribuită însă*i" $xemplu
- tT (r T (x2M) Qg)
:ipul boolean implicit
-
8/19/2019 Tutorial C Iulie2004
48/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 48Siemens VDOSiemens VDO
9u este cu adevărat un tip deoarece nu există o declaraţie explicită" 5rice dată poate %i evaluată ca booleană dacă se poate de%ini pentru ea o
valoare în care toţi biţii sînt zero" $ste un tip implicit %olosit pentru operaţii logice *i condiţionale
J (întreg 16 biţi) este %als Caracterul KnullL (XJ) este %als pointerul 9>!! este %als
9umărul real (%loat) J este %als 5rice altă valoare este adevărat
1 este adevărat ;1 este adevărat caracterul WsW este adevărat >n pointer care a %ost iniţializat cu orice adresă este adevărat
,cest tip este ec+ivalent cu tipul bool din C22"
Operatori booleeni
-
8/19/2019 Tutorial C Iulie2004
49/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 49Siemens VDOSiemens VDO
/olosesc tipul boolean implicit" 5peratori logici
88 (4I)# __ (',>) # ` (9$],$) 5peratori de comparare
TT ($],!)# ̀ T(I9$],!) N# NT# O# OT
Cînd o dată prime*te valoarea KadevăratL# valoarea ei e%ectivă depinde deimplementarea compilatorului"
$xempleint a#b#r
r T (aTTb) ?Q r este 3>$ dacă a este egal cu bQ?r T (aN1) 88 (bO) ?Q corect Q?r T (a`Tb) 2 E ?Q posibil dar """ Q?
Operatori pe bit
-
8/19/2019 Tutorial C Iulie2004
50/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 50Siemens VDOSiemens VDO
!ucrează asupra codului datei la nivel de bit" 'înt dependenţi de declaraţia datei *i de implementarea ei prin intermediul
compilatorului pe +ard0are" 'înt operatori logici
8 (4I)# _ (',>)# (',> exclusiv)# (complement %aţă de 1) $xemple
int a#b#r aT1 bT r T a 8 b ?Q r este zero Q?
aT1 bT E rT a 8 b ?Q r este 1 Q?
B$emple de operatori
-
8/19/2019 Tutorial C Iulie2004
51/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 51Siemens VDOSiemens VDO
,ritmetici2 ,dunare
; 'cădere
Q nmulţire
? mpărţire
^ odulo Incrementare *i decrementare
22 incrementare (pre sau post)
;; decrementare (pre sau post)
5peratori compu*i2T ,dunare;T 'cădere
QT nmulţire?T mpărţire^TodulNNT deplasare la stîngaOOT deplasare la dreapta8T4I pe bitT ',> exclusiv pe bit_T ',> pe bit
Signed Addition and Subtraction
;; C Declarations :
Signed Addition and Subtraction /01
;; C Source Statement :
C"#$
-
8/19/2019 Tutorial C Iulie2004
52/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 52Siemens VDOSiemens VDO
;; C Declarations :char x,y,z,t ;
;; C Source Statement : z = x+y ;;; Generated Assembler :
!"# $%&,'xADD# $%&,'y!"# 'z,$%&
;; C Source Statement : z = x + ( ;;; Generated Assembler :
!"# $%),'x!"# 'z,$%)
;; C Source Statement : z = x * y ;;; Generated Assembler :
!"# $%),'xS## $%),'y!"# 'z,$%)
;; C Source Statement : z = y * y ;;; Generated Assembler = -on o.timized
!"# $%&,'yS## $%&,'y!"# 'z,$%&
;; C Source Statement : t = z + x ;;; Generated Assembler :
ADD# $%&,'x
!"# 't,$%&
;; C Source Statement : t += x ;;; Generated Assembler = Same Code
ADD# $%&,'x!"# 't,$%&
;; C Source Statement : x ++ ;;; Generated Assembler = se o2 ones register
S## 'x,!-3S
;; C Source Statement : ++ x ;;; Generated Assembler :
S## 'x,!-3S
;; C Source Statement : x = x ++ ;;; Generated Assembler = 4riority 4roblem
!"# $%),'xS## 'x,!-3S!"# 'x,$%)
;; C Source Statement : z = *x ;;; Generated Assembler = !.timized usage o2 -eg
-3G# $%)!"# 'z,$%)
;; C Source Statement : z = *506 ; z = *z ;;; Generated Assembler = Correct
!"# $%7,8(95h!"# 'z,$%7!"# $%),8(6h!"# 'z,$%)
;; C Source Statement : z = *509 ; z = *z ;
;; Generated Assembler = S.eci2ic treatment o2 (9(h!"# $%7,8(9(h!"# 'z,$%7!"# $%),8(9(h!"# 'z,$%)
C"#$
-
8/19/2019 Tutorial C Iulie2004
53/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 53Siemens VDOSiemens VDO
Signed ord Addition and Subtraction
;; C Declarations :int x,y,z,t ;
;; C Source Statement :
z = x+y ;;; Generated Assembler = Same .rinci.les as #ytes
!" $&,'xADD $&,'y!" 'z,$&
nsigned ord Addition and Subtraction
;; C Declarations :unsigned int x,y,z,t ;
;; C Source Statement : z = *5 ;;; Generated Assembler = Same .rinci.les as #ytes
!" 'z,!-3S
;; C Source Statement : z = x+y ;;; Generated Assembler =
-
8/19/2019 Tutorial C Iulie2004
54/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 54Siemens VDOSiemens VDO
;; Generated Assembler = ?uite !.timized @ith neg!"#S $0,'x!" $7,$0-3G $7!"# 'z,$%7
;; C Source Statement :
z >= *5 ;;; Generated Assembler = non !.timized in this case
!" $0,8(h!"#S $&,'z% $&,$0!" $&,D%!"# 'z,$%&
;; C Source Statement : z = z > 7 ;;; Generated Assembler = !.timized
!"#S $&,'z!" $),$&
S% $),8(0hS# $),$&!"# 'z,$%)
;; C Source Statement : z >= 7 ;;; Generated Assembler = -on !.timized
!" $&,8(7h!"#S $),'z% $),$&!" $),D%!"# 'z,$%)
,y,
;; C Source Statement : z = x > y;;; Generated Assembler :
!"#S $&,'x!"#S $),'y% $&,$)
!" $&,D%!"# 'z,$%&
;; C Source Statement : z = x > (;;; Generated Assembler = ?uite !.timized
!"# $%&,'x!"# $%&,8((h!"# 'z,$%&
;; C Source Statement : z = x > 5;;; Generated Assembler = !.timized
!"# $%&,'x!"# 'z,$%&
;; C Source Statement : z = x > 0;;; Generated Assembler = !.timized
!"#S $&,'xS% $&,8(5h!"# 'z,$%&
;; C Source Statement : z = x > 59;;; Generated Assembler = !.timized
!"#S $&,'x!" $),$&S% $),8(7hADD $),$&S% $),8(5h!"# 'z,$%)
Signed #yte Diide
;; C Declarations :
Signed ord ulti.lication
;; C Declarations :
C"#$
-
8/19/2019 Tutorial C Iulie2004
55/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 55Siemens VDOSiemens VDO
olatile char x,y,z ;char nx ;
;; C Source Statement : z = x B y;;; Generated Assembler :
!"#S $&,'x!"#S $),'y!" D%,$&D
-
8/19/2019 Tutorial C Iulie2004
56/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 56Siemens VDOSiemens VDO
olatile int x,y,z ;
;; C Source Statement : z = x B y;;; Generated Assembler :
!" $&,'x!" $),'y
!" D%,$&D
-
8/19/2019 Tutorial C Iulie2004
57/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 57Siemens VDOSiemens VDO
;; C Source Statement :x = 5 ;
;; Generated Assembler :!" $&,8(5h!" 'x,$&
;; C Source Statement :y = 5 ;
;; Generated Assembler :!" $),8(5h!" 'y,$)
;; C Source Statement : x = y = 5;; Generated Assembler :
!" $&,8(5h!" 'x,$&!" 'y,$&
char sb5;char sb0 ;unsigned char ub5 ;unsigned char ub0 ;int s@5;int s@0 ;unsigned int u@5 ;
unsigned int u@0 ;
;; C Source Statement : sb0 = sb5 5 ;;; Generated Assembler = !.timized
!"#S $&,'sb5AS$ $&,8(5h!"# 'sb0,$%&
;; C Source Statement : sb0 = sb5 HH 5 ;;; Generated Assembler = !.timized
!"#S $&,'sb5
S% $&,8(5h!"# 'sb0,$%&
;; C Source Statement : ub0 = ub5 5 ;;; Generated Assembler =
-
8/19/2019 Tutorial C Iulie2004
58/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 58Siemens VDOSiemens VDO
Funcţii Funcţii
1oţiunea de /uncţie în C
-
8/19/2019 Tutorial C Iulie2004
59/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 59Siemens VDOSiemens VDO
'e implementează prin instrucţia Call (din assembler)"
5 %uncţie este de%inită de un +eader (nume# tip# parametri %ormali)
>n corp
5 %uncţie are tipul scalar (c+ar# int# long sau pointer) %uncţie propriu;zisă
void asimilabilă unei proceduri din P,'C,!
/uncţiile non void returnează un rezultat de tipul respectiv" $xemplu
- add (x#M) returnează x 2 M
/uncţiile de tip void nu returnează nici un rezultat"
9eaderul /uncţiei 0"
-
8/19/2019 Tutorial C Iulie2004
60/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 60Siemens VDOSiemens VDO
'intaxa
NvizibilitateO
Nmodul de pasare a parametrilorONtipO
NnumeO
(Nlista parametrilorO) :izibilitatea
odi%icatorul KstaticLpoate %i %olosit pentru a %ace ca %uncţia să %ie vizibilă doar în interiorul
%i*ierului în care a %ost declarată"
odul de pasare a parametrilor
Implicit# parametrii sînt pasaţi prin registre# în limita registrelor disponibile# apoi prin stivă"
5pţiunea KstacVparmL %orţează pasarea tuturor parametrilor prin stivă"
3ipul
void pentru proceduri
scalar (implict int)
C"#$
9eaderul /uncţiei 02
-
8/19/2019 Tutorial C Iulie2004
61/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 61Siemens VDOSiemens VDO
!ista parametrilor Poate %i vidă K()L sau K(void)L dacă nu se transmite nici un parametru"
Prezenţa parantezelor este obligatorie" !ista parametrilor este o listă de declaraţii de date"
,ce*ti parametri# numiţi parametri %ormali# sînt consideraţi variabile locale# vizibile doar îninteriorul corpului %uncţiei"
'înt disponibile două tipuri de parametri
- 3ransmi*i prin valoare (de intrare)" !a apel# programul apelant trimite %uncţiei o copie
a valorii parametrului actual"- 3ransmi*i prin adresă (de intrare?ie*ire) " !a apel# programul apelant trimite %uncţieiadresa parametrului actual (un pointer)# %apt marcat prin operatorul Q"
$xemple de +eadere 5 %uncţie % care are un parametru întreg x *i returnează un întreg
- int % (int x)
5 procedură g care are un parametru de intrare x *i un parametru de intrare?ie*ire z"- void g(int x# int QM)
Corpul /uncţiei
-
8/19/2019 Tutorial C Iulie2004
62/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 62Siemens VDOSiemens VDO
$ste delimitat de acolade# Z [# ca *i orice alt bloc de program C"
Permite declaraţii de variabile locale
Implicit de tip automatic# alocate dinamic în registre sau stivă" odi%icatorul static %orţează alocarea în zona de date statice"
odi%icatorul register sugerează alocarea în registru"
&acă tipul %uncţiei nu este void# ea include cel puţin o instrucţie return. Instrucţia return %orţează părăsirea %uncţiei"
:aloarea returnată este cea care rezultă din evaluarea expresiei din instrucţia return" $xemplu
return x 2 1
Parametrii transmi*i prin valoare sînt %olosiţi ca atare"
Parametrii transmi*i prin adresă pot %i modi%icaţi# prin efect lateral # de către%uncţie"
Apelul de /uncţie
-
8/19/2019 Tutorial C Iulie2004
63/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 63Siemens VDOSiemens VDO
,pelul unei %uncţii se %ace prin numele %uncţiei# urmat de lista parametrilor actuali "
Prezenţa parantezelor este obligatorie" eguli pentru parametrii actuali
Parametrii transmi*i prin valoare pot %i substituiţi cu expresii de acela*i tip" Parametrii transmi*i prin adresă necesită existenţa unei variabile declarate# a
cărei adresă (pointer) se extrage cu operatorul 8" /uncţii inline
Cre*te viteza de execuţie în dauna spaţiului de memorie" Corpul %uncţiei (în cod ma*ină) este copiat la %iecare apel din cod sursă" 'e evită procedura de apel?retur care consumă timp"
&oar pentru %uncţii statice"
uncţii. B$emplul "
-
8/19/2019 Tutorial C Iulie2004
64/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 64Siemens VDOSiemens VDO
/uncţie cu parametru transmis prin valoare"int % (int x)
Z return x21
[ ,pelul
int a
const b T 1H
int r
aTE
r T % (a) ?Q r devine H Q?
r T %(b2r;1) ?Q r devine 1S Q?
uncţii. B$emplul 2
-
8/19/2019 Tutorial C Iulie2004
65/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 65Siemens VDOSiemens VDO
/uncţie cu parametru transmis prin adresă"void g (int QM# int x)
Z
QM T x21
[ ,pelul
int a
const b T 1H
int r
aTE
g(8r#a) ?Q r devine H Q?
g(8r#b2r;1) ?Q r devine 1SQ?
g(r#a) ?Q incorect Q?
uncţii. B$emplul @
-
8/19/2019 Tutorial C Iulie2004
66/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 66Siemens VDOSiemens VDO
/olosirea eronată a unui parametru transmis prin valoare# pentru areturna rezultate prin e%ect lateral"
void g (int M# const int x) Z M T x21 [
,pelul
int aconst b T 1H int rrTJaTE
g(r#a) ?Q r nu va %i a%ectat Q?g(8r#a) ?Q deasemenea %ără e%ectul scontat Q?
Detalii de implementare Parametrii !a C16x primii patru parametri se trimit prin 1 1E 1H 1
C"#$
-
8/19/2019 Tutorial C Iulie2004
67/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 67Siemens VDOSiemens VDO
!a C16x primii patru parametri se trimit prin 1# 1E# 1H# 1" Pentru %uncţii cu mai mult de patru parametri se %olose*te stiva" 1# 1E# 1H *i 1 nu sînt adresabile la nivel de octet"
n cazul %uncţiilor terminale (lea% %unctions)# ordinea parametrilor poate %ioptimizată" $xemplu
void % ( long a# int b #long c # c+ar Qd)- a 1;1E- b 1H
- c stiva- d stiva void g ( long a# int b #c+ar Qd# long c)
- a 1;1E- b 1H- d 1- c stiva
n cazul %uncţiilor neterminale ese necesară o analiză interprocedurală a codului pentru a putea %ace o optimizare" &e obicei se %olose*te stiva"
Detalii de implementare ) Variabilele locale
C"#$
-
8/19/2019 Tutorial C Iulie2004
68/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 68Siemens VDOSiemens VDO
!a C16x se %olosesc 6# R# S# U pentru primele patru variabile
locale" n continuare se %olose*te stiva" S *i U nu sînt adresabile la nivel de octet" U este %olosit de obicei pentru variabile de tip bit" 1# 1E# 1H *i 1 pot %i %olosite dacă sînt disponibile"
n cazul %uncţiilor terminale# datele locale pot %i optimizate" n cazul %uncţiilor neterminale ese necesară o analiză
interprocedurală a codului pentru a putea %ace o optimizare" &eobicei se %olose*te stiva"
-
8/19/2019 Tutorial C Iulie2004
69/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 69Siemens VDOSiemens VDO
VizibilitateVizibilitate
Vi+ibilitatea datelor 0"
3 i l li ă i ibil t d t
-
8/19/2019 Tutorial C Iulie2004
70/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 70Siemens VDOSiemens VDO
3rei localizări posibile pentru date
7odul7odul
7odul
uncţie
uncţie
?loc
Vi+ibilitatea datelor 02
-
8/19/2019 Tutorial C Iulie2004
71/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 71Siemens VDOSiemens VDO
5 dată este vizibilă în interiorul %i*ierului (dată de nivel global)# %uncţieisau blocului în care a %ost declarată"
5 dată de nivel global poate %i %ăcută vizibilă *i pentru alte %i*iere (module)" odi%icatorul extern:
$ste %olosit într;un %i*ier# pentru a %ace posibil accesul la o dată care a %ostdeclarată în alt %i*ier pe nivel global"
'intaxaextern Ndeclaraţie de datăO
$xempluextern int r
odi%icatorul static: $ste %olosit pentru a ascunde o dată globală %aţă de alte module (%i*iere)" 'intaxa
static Ndeclaraţie de datăO
$xemplustatic int r
Vi+ibilitatea /uncţiilor 0"
$ i tă d ă ti i d i ibilit t
-
8/19/2019 Tutorial C Iulie2004
72/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 72Siemens VDOSiemens VDO
$xistă două tipuri de vizibilitate
i8ier ?
uncţia local* /
uncţia e$portat* b
i8ier A
uncţia a
Vi+ibilitatea /uncţiilor 02 odi%icatorul extern.
$ t % l it î t %i i t % ibil l l % ţi % t d %i ită î lt
-
8/19/2019 Tutorial C Iulie2004
73/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 73Siemens VDOSiemens VDO
$ste %olosit într;un %i*ier# pentru a %ace posibil accesul la o %uncţie care a %ost de%inită în alt%i*ier"
'intaxa
- extern N+eader de %uncţieO $xemplu- extern int % (int x)
,tenţie- &eclaraţia extern este obligatorie dacă tipul %uncţiei este altul decît int# alt%el este opţională"- &eclaraţia extern este recomadabilă deoarece %orţează compilatorul să veri%ice tipul %uncţiilor"
odi%icatorul static. $ste %olosit într;un %i*ier pentru a ascunde o %uncţie %aţă de alte %i*iere" 'intaxa
- static N +eader de %uncţie O $xemplu
- static int % (int x) Z ?Qcorpul %unctieiQ? [ Prototipuri"
>n prototip este un +eader de %uncţie %olosit pentru a declara o %uncţie externă" ntr;un prototip# numele parametrilor %ormali pot %i omise"
$xemplu- extern int % (int) Protipurile %uncţiilor externe de uz larg sînt stocate în %i*iere +eader ("+)"
Vi+ibilitatea la nivel de tas<
C"#$
-
8/19/2019 Tutorial C Iulie2004
74/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 74Siemens VDOSiemens VDO
odi%icatorul public. $ste %olosit pentru a declara o dată care poate %i accesată în mod concurent de către mai multe
tasVuri"
AS= :as< 07ain
Sistemde operare
:as
-
8/19/2019 Tutorial C Iulie2004
75/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 75Siemens VDOSiemens VDO
Structuri de control Structuri de control
?locuri instrucţie 'intaxa
-
8/19/2019 Tutorial C Iulie2004
76/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 76Siemens VDOSiemens VDO
Z
NdeclaraţiiO
Ninstrucţiune 1O """ Ninstrucţiune nO [
'înt utile pentru a declara date locale *i pentru a încapsula un anume procedeu" Compilatorul de C16x nu asigură optimizarea alocării datelor" $xemplu
int i#j
Z
int i
jTi ?Q i este data locală Q?
[
C"#$
I 8i I BLSB
'intaxa
-
8/19/2019 Tutorial C Iulie2004
77/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 77Siemens VDOSiemens VDO
'intaxa
i% NexpresieO NinstrucţiuneO
i% NexpresieO Ninstrucţiune 1O else Ninstrucţiune O
unde Nexpresie O este /,!'$ dacă expresia evaluată este zero (tipul este booleanimplicit)"
$xemplei% (iN1) iTi21 else iT1
i% (iN1) Z
jTV
VTi
iTi21 [
Structura CASB 'intaxa
-
8/19/2019 Tutorial C Iulie2004
78/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 78Siemens VDOSiemens VDO
'0itc+ (Nexpresie întreagăO) Z
case Nvaloare 1O
NinstrucţiuneON instrucţiuneO
breaV
case Nvaloare O
N instrucţiuneO
breaV
de%ault
N instrucţiuneO
[ $xpresia evaluată trebuie să %ie de tip întreg sau enumerare" Cazul default este opţional"
break este optional dar lipsa sa sc+imbă modul de execuţie" Instrucţia switch poate %i înlocuită cu o tabelă de salturi sau cu o listă imbricată deinstrucţii i%;else"
-
8/19/2019 Tutorial C Iulie2004
79/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 79Siemens VDOSiemens VDO
S
-
8/19/2019 Tutorial C Iulie2004
80/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 80Siemens VDOSiemens VDO
p ţ p
eturnează un rezultat"
'intaxaNcondiţieO Nexpresie I/(condiţie este 3>$)O Nexpresie $!'$O
$xemplu /uncţia ax (x#M)
xNMMx
>tilitatea Codul generat este optimizat în unele cazuri# %aţă de implementarea cu instrucţii i% (depinde de
compilator)"
5peratorul este acceptat de toate compilatoarele compilatoarele"
,tenţie $xprimarea este concisă dar greu de citit"
Pot apărea e%ecte laterale"
C"#$
-
8/19/2019 Tutorial C Iulie2004
81/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 81Siemens VDOSiemens VDO
Com.arison bet@een i2 and Q
;; C Source Statement : i2 /xy1 z=y ; else z=x ;;; Generated Assembler = -ot !.timized
!" $&,'xC4 $&,'yK4$ cc'S%3,'R!" $&,'y!" 'z,$&K4$ cc'C,'6
'R:!" $&,'x!" 'z,$&
'6:
Com.arison bet@een i2 and Q
;; C Source Statement : z=xyQy:x ;;; Generated Assembler = !.timized
!" $&,'xC4 $&,'yK4$ cc'S%3,'9
'L:!" $&,'y
K4$ cc'C,'5('9:
!" $&,'x'5(:
!" 'z,$&
Structuri iterative 0"
3rei tipuri de bucle
-
8/19/2019 Tutorial C Iulie2004
82/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 82Siemens VDOSiemens VDO
=+ile- &e%iniţie
Instrucţiunea se execută iterativ cît timp expresia evaluată este non;zero" $xpresia seevaluează înainte de execuţie"
- 'intaxa
0+ile (NexpresieO) NinstrucţiuneO
&o;=+ile- &e%iniţie
Instrucţiunea se execută iterativ cît timp expresia evaluată este non;zero" $xpresia seevaluează după de execuţie"
- 'intaxa
do NinstrucţiuneO 0+ile (NexpresieO)
Structuri iterative 02
/or
-
8/19/2019 Tutorial C Iulie2004
83/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 83Siemens VDOSiemens VDO
- &e%iniţie
ai întîi# se evaluează expresia Nexpr1O" ,poi# atîta timp cît expr este non;zero# se execută
acţiunea" &upă %iecare iteraţie se evaluează exprE"- 'intaxa
%or (Nexpr1ONexprONexprEO)
NinstrucţiuneO
ceea ce se poate pune *i sub %orma
Nexpr1O
0+ile (NexprO) Z NinstrucţiuneO
NexprEO [
- $%icienţă
&e%inirea indexului de buclă ca întreg"
Alte structuri de control
.reaV *i continue
-
8/19/2019 Tutorial C Iulie2004
84/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 84Siemens VDOSiemens VDO
Z ?Q Inceput de bucla Q?
""" ? """
breaV """ ? """
continue
""" ? """
?Q '%irsit de bucla Q?
[ Instrucţia breaV are ca e%ect părăsirea celei mai interioare bucle 0+ile# do # %or sau s0itc+" Instrucţiunea continue are ca e%ect trecerea controlului la s%îr*itul celei mai interioare bucle 0+ile# do sau %or#
moment în care condiţia de buclare este reevaluată"
]oto 'intaxa
goto Netic+etăO
""" ?
Netic+etăO$ste o structură de control speci%ică limbajelor de asamblare" Paradigma de proiectare strucrurată recomandăevitarea ei"
hile statement
-
8/19/2019 Tutorial C Iulie2004
85/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 85Siemens VDOSiemens VDO
@hile /ru@'!ctet1 I i2 /ru@'!ctet F (x(51
I B> Change .arity >B ru@'4arity = ru@'4arity; }
ru@'!ctet = 5; }
or statement @ith additional increment and init
.ub'4tr#u2Dyn= .ub'DynData;
.ub'4trDiag=A-S3$'4$;>/.ub'4trDiag1+=(x&(;
2or /ru@'/.ub'4trDiag1 = >/>/.ub'4tr#u2Dyn11; .ub'4tr#u2Dyn++; }
3xam.les o2 Do hile structure @ith a breaO statement
do I
B> B
-
8/19/2019 Tutorial C Iulie2004
86/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 86Siemens VDOSiemens VDO
B -e@ last is the .ointed >B raub'-extimSrMrub'%ocal4trimSrN =
rub'%ocal4trimSr; } else I B> Adding to the next o2 the timer to sto., the
reload o2 the timer to sto. >B ras@'$eloadimSrMraub'-extimSrMrub'-umSrNN+=
ras@'$eloadimSrMrub'-umSrN;
B> Changing the next >B raub'-extimSrMrub'%ocal4trimSrN =
raub'-extimSrMrub'-umSrN; } breaO; } else I
rub'%ocal4trimSr =raub'-extimSrMrub'%ocal4trimSrN; } } @hile/51;
-
8/19/2019 Tutorial C Iulie2004
87/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 87Siemens VDOSiemens VDO
Tablouri şi pointeri Tablouri şi pointeri
:ablouri simple >n tablou este un set de date care au acela*i tip" &atele sînt alocate contiguu în memorie
-
8/19/2019 Tutorial C Iulie2004
88/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 88Siemens VDOSiemens VDO
&atele sînt alocate contiguu în memorie" &eclararea tablourlorO
NtipO NnumeO FNdimensiuneOG tMpe poate %i oarecare ,tributul dimensiune este obligatoriu *i reprezintă dimensiunea maximă
$ste posibilă iniţializarea o dată cu declarareaNtipO NnumeO ZFNdimensiune OG[ T Z Nlistă de valoriO [
tipul trebuie să %ie compatibil cu valorile precizarea dimensiunii este opţională întrucît ea se poate deduce din lista de valori
$xemple- int t FHG
- int j FG T Z1# # E [ ?Q dimensiunea este E Q?
- int V FG T Z1#[ ?Q celelalte elemente se iniţializează cu J Q?
- int l FG T Z1# # E [ ?Q Incorect Q?
Accesul la elementele unui tablou
,ccesul se %ace cu ajutorul operatorului FG" ntre parantezele drepte
-
8/19/2019 Tutorial C Iulie2004
89/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 89Siemens VDOSiemens VDO
se plasează indexul"
$xemplur T a FiG 2 b FjG
Primul element al unui tablou are indexul J"
9umele unui tablou reprezintă adresa primului element din tablou *i
poate %i parametru actual la apelul unei %uncţii"
$ste posibilă declararea de tablouri cu mai multe dimensiuni
Array code
;; C Declarations :char C M5(N;int M5(N;
;; C Source Statement :
Array handling
rub'Serice
-
8/19/2019 Tutorial C Iulie2004
90/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 90Siemens VDOSiemens VDO
;; C Sou ce State e t : CMxN = (;;; Generated Assembler =
-
8/19/2019 Tutorial C Iulie2004
91/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 91Siemens VDOSiemens VDO
date" &eclaraţie
NtipO Q NnumeO >tilizare
Q Nnumele datei indicate de pointerO 3ipul pointerului trebuie să %ie compatibil cu cel al datei indicate"
$xemple
- c+ar Q p de%ine*te un pointer compatibil cu orice adresă de octet (a*adar# cu orice adresă)"- int Q p de%ine*te un pointer compatibil cu orice dată aliniată la adresă pară
>n pointer este întotdeauna alocat în ,"
Atribuirea pointerilor
>nui pointer i se poate atribui valoarea altui pointer# adresa unuiobiect (prin intermediul operatorului de extragere a adresei 8) sau
-
8/19/2019 Tutorial C Iulie2004
92/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 92Siemens VDOSiemens VDO
obiect (prin intermediul operatorului de extragere a adresei 8)# sauvaloarea unei expresii de tip pointer" $xemple
c+ar Qp
int Q
c+ar a
int b
p T 8a
p T 8b ?Q corect Q?
T 8a ?Q incorect Q?
T 8b ?Q corect Q?
p T 8 ?Qcorect# adresa unui alt pointer Q?
Pointeri 8i constante
Cuvîntul c+eie const poate %i %olosit în declaraţii de pointeri" &e exemplu
-
8/19/2019 Tutorial C Iulie2004
93/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 93Siemens VDOSiemens VDO
int a
int Qpint Qconst ptr T 8a ?? Pointer constant
Qptr T 1 ?? !egal# Qptr se poate modi%ica
ptr Tp ?? $roare# ptr nu se poate modi%ica &esemenea se poate declara un pointer ca indicînd către o variabilă care este de
tip constant"const int a
int Qp
const int Q ?? Pointer catre o variabila de tip constant
const int Qptr T 8a ?? !egal
Qptr T 1 ?? $roare
ptr Tp ?? $roare ptr T ?? !egal
B$presii cu pointeri
>n pointer poate %i %olosit în expresii aritmetice de tip întreg pentru a e%ectuacalcule de adresă# în mod similar celui în care un registru de adresă este %olosit în
-
8/19/2019 Tutorial C Iulie2004
94/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 94Siemens VDOSiemens VDO
# gassembler"
3ipul pointerului de%ine*te pasul de incrementare" $xemple
- c+ar Qp p21 este adresa următorului octet (adresa %izică 2 1)
- int Q p p21 este adresa următorului 0ord (adresa %izică 2 ) 3ipul pointer nu este compatibil cu tipul întreg"
$xempleint i
c+ar Qp
p T EH ?Q corect dar nerecomandat Q?
p T 8i ?Q corect Q?
p T p 2 1 ?Q corect Q?
p T p Q H ?Q incorect Q?
p T i ?Q incorect Q?
:ablouri 8i pointeri
3ablourile *i pointerii sînt tipuri de date compatibile unul cu celălalt"
5 declaraţie de tablou alocă un număr de octeţi în memorie *i de%ine*te un mod
-
8/19/2019 Tutorial C Iulie2004
95/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 95Siemens VDOSiemens VDO
5 declaraţie de tablou alocă un număr de octeţi în memorie *i de%ine*te un modde a avea acces la oricare dintre ei"
9umele unui tablou poate %i considerat ca un pointer constant la primul elemental tabloului"
,vem ec+ivalenţaint tab FEG ?Q tab FiG NTTO Q (tab 2i) Q?
$ste deasemenea posibil să de%inim un pointer pentru a avea acces la elementeleunui tablou"int tab FEG
int Qp
p T 8 tab FJG ?Q initializarea lui p cu primul element al tabloului Q?
p 22 ?Q p adreseaza al doilea element Q?
Qp T ?Q al doilea element este modi%icat Q?
Code 2or .ointers
int x,y,z;char c;char > .C ;int > .< ;
;; C Source Statement : .C = /char >15(;;; Generated Assembler :
se o2 .ointers to bro@se data area
ru@'ChO = (;2or /r.'4tr$amCtl=FS$A'#T3'#!!;
r.'4tr$amCtlHFS$A'#T3'!4 ;r.'4tr$amCtl++ 1
Iru@'ChO += >r.'4tr$amCtl;
}2or /r. 4tr$amCtl=FS$A !$D #!!;
C"#$
-
8/19/2019 Tutorial C Iulie2004
96/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 96Siemens VDOSiemens VDO
;; Generated Assembler :!" $&,8(Ah!" '.C,$&
;; C Source Statement : .C = Fx ;;; Generated Assembler :
!" $),8'x!" '.C,$)
;; C Source Statement : .< = /int >1 Fc ;;; Generated Assembler = Could generated a 2ault
!" $0,8'c!" '.r.'4tr$amCtl;}2or /r.'4tr$amCtl=/'!$D>1Fru'$amOey;
r.'4tr$amCtlH=/'!$D>1Fru'ChecOsumcr@o ;r.'4tr$amCtl++ 1
Iru@'ChO += >r.'4tr$amCtl;
}
-
8/19/2019 Tutorial C Iulie2004
97/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 97Siemens VDOSiemens VDO
Structuri şi uniuniStructuri şi uniuni
Structuri
'înt agregate contigue de variabile de tipuri oarecare" /iecare variabilă din interiorul unei structuri poartă numele de cîmp"
-
8/19/2019 Tutorial C Iulie2004
98/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 98Siemens VDOSiemens VDO
p p &eclaraţie
struct Z Nlistă de variabileO [ NnumeO Iniţializare
struct Z Nlistă de variabileO [NnumeO T Z Nlistă de valoriO [
,tenţie Pe procesoare de 16 biţi# structurile se aliniază la multipli de octeţi" 3rebuie evitate
KgolurileL în interiorul structurilor"
$xemplestruct Z
int c1
int c [ x ?Q structura neinitializata Q?struct Z int c1
int c [ M T Z1#1[ ?Q structura initializata Q?
5tili+area structurilor
5 structură este accesată prin numele ei"
-
8/19/2019 Tutorial C Iulie2004
99/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 99Siemens VDOSiemens VDO
/iecare cîmp este accesat %olosind numele cîmpului *i
operatorul K"L" $xemplu
x"c1 T M"c1
$ste posibilă modi%icarea unei structuri în întregul său prin
atribuire"
5peratorul ;O $ste %olosit pentru a combina lucrul cu structuri *i cel cu pointeri"
(Qx)"a NTTO x;Oa
5niuni 5 uniune este un tip de date de%init de utilizator# care poate stoca valori de tipuri
di%erite la momente di%erite" $ste similară unei structuri# cu di%erenţa că tuturormembrilor li se alocă acelea*i locaţii de memorie
-
8/19/2019 Tutorial C Iulie2004
100/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 100Siemens VDOSiemens VDO
membrilor li se alocă acelea*i locaţii de memorie" 5 variabilă de tip uniune poate conţine la un moment dat doar unul dintre membrii
săi" 'paţiul alocat uniunii este spaţiul necesar pentru cel mai mare membru" 'intaxa
union Z Nlista de cîmpuriO [ NnumeO $xemple
,ceastă dată poate %i adresată %ie ca tabel (arraM) %ie ca structură union Z
int cMlBtabFHGstruct Z
int cMl1int cMlint cMlEint cMlH[ cMlBid
[ advanceBtable advanceBtable"cMlBtabF1G NTO advanceBtable"cMlBid"cMl
Code 2or unions
;; C Declarations :int x,y,z ;char c;union I unsigned int !$D ;struct I
Code 2or structures
;; C Declarations :int x,y,z ;struct I char c ; int i,J ;} S ;
C"#$
-
8/19/2019 Tutorial C Iulie2004
101/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 101Siemens VDOSiemens VDO
struct I unsigned char %S#, S# ; } #T3 ;
} ;
;; C Source Statement : !$D = x;;; Generated Assembler = !.timized
!" $&,'x!" ',$&
;; C Source Statement : #T3%S# = c ;;; Generated Assembler = !.timized
!"# $%&,'c
!"# ',$%&
;; C Source Statement : #T3S# = ( ;;; Generated Assembler = !.timized
!"# /'+51,E3$!S
} S ;
;; C Source Statement : Sc=(;;; Generated Assembler :
!"# 'S,E3$!S
;; C Source Statement : SJ=Si;;; Generated Assembler :
!" $&,/'S+01!" /'S+&1,$&
-
8/19/2019 Tutorial C Iulie2004
102/167
Cîmpul de biţi Permite lucrul cu date de tip bit" $ste bazat pe conceptul de structură" 'i t
-
8/19/2019 Tutorial C Iulie2004
103/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 103Siemens VDOSiemens VDO
'intaxa
struct Z unsigned NcîmpO NlăţimeO
""" [ NnumeO
Codul produs nu este întotdeauna optimizat" $xemplu
struct 3$\3BC$!! ?? &eclara 3$\3BC$!! ca un cimp de biti
Z
unsigned c+aracter S ?? JJJJJJJJ
unsigned %oreground E ?? JJJJJ JJJJJJJJ
unsigned intensitM 1 ?? JJJJJJJ JJJJJJJJ
unsigned bacVground E ?? JJJJJ JJJJJJJJ
unsigned blinV 1 ?? JJJJJJJ JJJJJJJJ
[ screenFGFSJG ?? atrice de cimpuri de biti
Date de tip ?it
'înt speci%ice secţiunii adresabile la nivel de bit din memoria internă a C16x" Permit declaraţii la nivel de bit"
C"#$
-
8/19/2019 Tutorial C Iulie2004
104/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 104Siemens VDOSiemens VDO
ţ 'intaxa
.I3 a#b#c
aT b 8 c Produce un cod optimizat" &atele de tip bit nu pot %i combinate cu date de alte tipuri (tablouri# structuri#
pointeri)"
#oolean ex.resssions using integers data
;; C Source Statement : bi7 = bi5 F bi0 ;;; Generated Assembler = ?uite !.timized
!" $&,'bi5A-D $&,'bi0!" 'bi7,$&
;; C Source Statement : bi7 = bi5 FF bi0 ;;; Generated Assembler = -on !.timized
!" $&,'bi5K4$ cc E, 50
#oolean ex.resssions using #it data
;; C Source Statement : b7 = b5 F b0 ;;; Generated Assembler = !.timized
#C4 'b5,'b0#!" 'b7,C
;; C Source Statement : b7 = b5 FF b0 ;;; Generated Assembler = -ot !.timized
K-# b5 &
C"#$
-
8/19/2019 Tutorial C Iulie2004
105/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 105Siemens VDOSiemens VDO
K4$ cc'E,'50'5&:
!" $&,'bi0K4$ cc'E,'50
'55:!" $&,8(5hK4$ cc'C,'57
'50:!" $&,8((h
'57:!" 'bi7,$&
;; C Source Statement : bi7 = bi5 U bi0 ;;; Generated Assembler = !.timized
!" $&,'bi5!$ $&,'bi0!" 'bi7,$&
;; C Source Statement : bi7 = bi5 ;;; Generated Assembler = -ot !.timized
!" $&,'bi5K4$ cc'-E,'0(
'5L:!" $&,8(5hK4$ cc'C,'05
'0(:!" $&,8((h
'05:!" 'bi7,$&
;; C Source Statement : bi7 = Vbi5 ;;; Generated Assembler = !.timized
!" $&,'bi5C4% $&!" 'bi7,$&
K-# 'b5,'&'R:
K-# 'b0,'&
'7:#S3 S$(K4$ cc'C,')
'&:#C%$ S$(
'):#!" 'b7,S$(
;; C Source Statement : b7 = b5 U b0 ;;; Generated Assembler = !.timized
#C4 'b5,'b0#!" 'b7,-
;; C Source Statement : b7 = b5 ;;; Generated Assembler = !.timized
#!"- 'b7,'b5
;; C Source Statement : b7 = Vb5 ;;; Generated Assembler = !.timized
#!"- 'b7,'b5
#oolean ex.resssions using #it ields
;; C Declarations :olatile struct I unsigned bc5 : 5 ;
unsigned bc0 : 5 ;
C"#$
-
8/19/2019 Tutorial C Iulie2004
106/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 106Siemens VDOSiemens VDO
unsigned bc0 : 5 ; unsigned bc7 : 5 ;
} bit2ield;
;; C Source Statement : bit2ieldbc7 = bit2ieldbc5 F bit2ieldbc0 ;;; Generated Assembler = Should be aoided
!" $&,'bit2ieldA-D $&,8(5h
!" $),'bit2ieldS$ $),8(5hA-D $),8(5hA-D $&,$)A-D $&,8(5hS% $&,8(0h!" $),'bit2ieldA-D $),8(#h!$ $),$&
!" 'bit2ield,$)
-
8/19/2019 Tutorial C Iulie2004
107/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 107Siemens VDOSiemens VDO
Organizarea memoriei Organizarea memoriei
7odele de memorie
n general# prin model de memorie înţelegem modelul deorganizare a resurselor disponibile de memorie# pentru cod *i
-
8/19/2019 Tutorial C Iulie2004
108/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 108Siemens VDOSiemens VDO
pentru date# din punctul de vedere al compilatorului" Problema este speci%ică procesoarelor cu memorie segmentată" 'copul este de a găsi un compromis între modurile de adresare
cele mai simple *i mai e%iciente cu necesarul real de memorie pentru cod *i date"
Compilatorul pentru C16x admite patru modele de memorie 3inM cod N 6H7 &ate N HQ16 T6H7 'mall cod O 6H7 &ate N HQ16 T6H7 edium cod N 6H7 &ate O HQ16T6H7 !arge cod O 6H7 &ate OHQ16T6H7
C"#$
Accesul la date% Segment% Pagin*%
!a seria C16x memoria de cod
Pagin &eg/ent
C"#$
-
8/19/2019 Tutorial C Iulie2004
109/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 109Siemens VDOSiemens VDO
!a seria C16x memoria de cod
(programe) este organizată în segmente de 6H7" emoria de date (operanzi)
este organizată în pagini de167"
-
8/19/2019 Tutorial C Iulie2004
110/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 110Siemens VDOSiemens VDO
$xistă H registre pointer de pagini de date &&PJ""E (&&P T &ataPage Pointer)"
Principiul de adresare orice adresă internă de date de 16 biţi se
%ormează din .iţii 1E""J care speci%ică un o%%set în pagină
.iţii 1 *i 1H care speci%ică un registru &&P
n cazul cel mai simplu# registrele &&P se înscriu o singură dată# la
reset"
Accesul la date din limbajul C 5 dată este plasată în mod implicit a*a %el încît adresa ei să %ie
de tipul near# ceea ce nu implică modi%icarea registrelor &&P"$xemple
C"#$
-
8/19/2019 Tutorial C Iulie2004
111/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 111Siemens VDOSiemens VDO
p- c+ar aBn - c+ar near aBn
5 dată poate %i alocată dincolo de limita de 6H7 %olosind adresede H biţi# caz în care adresa va %i declarată de tip %ar *i accesulla dată va implica modi%icarea registrelor &&P" $xemplu
c+ar %ar aB% &acă data este un tablou al cărui dimensiune depă*e*te 6H7
atunci adresa va %i declarată de tip +uge# iar indexul în tablouva trebui să %ie un întreg de tip long"
c+ar +uge aB+F1JJJJJG
Accesul la /uncţiile C 5 %uncţie poate %i localizată în orice segment" Pentru a de%ini o %uncţie care este localizată în acela*i segment ca *i
i l ii i % l i di%i l
C"#$
-
8/19/2019 Tutorial C Iulie2004
112/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 112Siemens VDOSiemens VDO
toţi apelanţii ei# se poate %olosi modi%icatorul near. $xemplu
void near % ()
,cesta ar trebui să %ie# în particular# cazul %uncţiilor statice" ,pelul în acela*i segment este mai rapid"
Impactul asupra pointerilor
Pointeri %ar >n pointer %ar este o adresă de E de biţi care permite accesul în orice segment"
C"#$
-
8/19/2019 Tutorial C Iulie2004
113/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 113Siemens VDOSiemens VDO
$xemplec+ar Qp c+ar %ar Q%p
p T 8 aBn ?Q corect Q?
p T 8 aB% ?Q incorect Q?
%p T 8 aB% ?Q corect Q?%p T 8 aBn ?Q corect Q?
,tenţie >n pointer poate %i el însu*i o dată de tip %ar" $xemplu
c+ar Q %ar p ?Q a nu se con%unda cu c+ar %ar Q p Q?
7odelul Small
ajoritatea aplicaţiilor din domeniul automotive %olosesc modelulsmall
C"#$
-
8/19/2019 Tutorial C Iulie2004
114/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 114Siemens VDOSiemens VDO
small" Ca o caracteristică generală a aplicaţiilor din domeniul automaticii#
acestea %olosesc relativ puţine resurse de memorie ," n modelul small# %iecare &&P indică după reset o pagină de ,"
,ceastă setare nu se mai modi%ică" Codul (programele) poate depă*i 6H7 dacă este necesar"
ar and uge data
;; C Declarations :2ar char M5(N;huge char M5(((((N;
;; C Source Statement : MxN = (;;; Generated Assembler = 2ar data acces
ar .ointers and .ointers to 2ar data
;; C Declarations :olatile int x;olatile int y;int z ;char c;char > .C ;int > .< ;
C"#$
-
8/19/2019 Tutorial C Iulie2004
115/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 115Siemens VDOSiemens VDO
;;!" $),'x
!" D44(,84AG '!"# $%&,8((h!"# M$)+84! 'N,$%&!" D44(,84AG Q#AS3'D44(
;; C Source Statement : MxN = (;;; Generated Assembler = uge data acces
!" $5(,8S! '!" $55,8S3G '!" $0,'x!" $7,$0AS$ $7,8(h
ADD $5(,$0ADDC $55,$7!" M*$(N,$5(S$ $5(,8(3hS% $55,8(0h!$ $55,$5(!" $5(,M$(+N!" D44(,$55A-D $5(,8(7h!"# M$5(N,$%&!" D44(,84AG Q#AS3'D44(
. ;char 2ar > 2.C ;
char > 2ar .2C ;
;; C Source Statement : 2.C = Fc ;;; Generated Assembler = 4ointer to 2ar data
!" $&,84! 'c!" $),84AG 'c!" '2.C,$&!" /'2.C+01,$)
;; C Source Statement : .2C = Fc ;;; Generated Assembler = ar .ointer
!" D44(,84AG '.2C!" $7,8'c!" 4! '.2C,$7!" D44(,84AG Q#AS3'D44(
-
8/19/2019 Tutorial C Iulie2004
116/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 116Siemens VDOSiemens VDO
ointeri la !uncţii ointeri la !uncţii
Pointeri la /uncţii 'înt pointeri speci%ici al căror rol este de a memora adresa unei
%uncţii 'înt utili pentru
-
8/19/2019 Tutorial C Iulie2004
117/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 117Siemens VDOSiemens VDO
'înt utili pentru Programarea generică &eclararea tabelelor de salturi
&eclaraţieNtipul %uncţieiO (Q NnumeO) ()
>tilizare(Q NnumeO) ( NargumenteO) $xemplu
int (Q%) () ?Qdeclarare Q?extern int g () ?Q prototipul %uncţiei gQ?
% T g ?Q atribuire (operatorul 8 nu este obligatoriu aici) Q?(Q%) () ?Q apelul %uncţiei prin pointer Q?
-C
;; C Declarations :olatile int x,y,z ;extern int 2( /int1;extern int 25 /int1;extern int 20 /int1;extern int 27 /int1;int />MN1 /int1 = I2(,25,20,27} ;
C"#$
-
8/19/2019 Tutorial C Iulie2004
118/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 118Siemens VDOSiemens VDO
int / MN1 /int1 I2(,25,20,27} ;
;; C Source Statement : int i;;; Generated Assembler :
;; C Source Statement : 2or /i=(;iH&;i++1;; Generated Assembler :
!" $L,8((h'7:
;; C Source Statement : i2 //>MiN1/x1y1 breaO ;;; Generated Assembler :
!" $50,'x!" $&,$LS% $&,8(0h!" $5(,$&!" $&,M$5(+8'N!" $),M$5(+8/'+01NCA%%S S3G ''icall,''icall = S.eci2ic mechanismC4 $&,'yK4$ cc'SG,'&C4
-
8/19/2019 Tutorial C Iulie2004
119/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 119Siemens VDOSiemens VDO
reprocesorul " reprocesorul "
Comportarea compilatorului C
Compilarea se %ace în trei %aze Prima %ază preprocesarea
- includerea %i*ierelor +eader (directive Dinclude)
-
8/19/2019 Tutorial C Iulie2004
120/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 120Siemens VDOSiemens VDO
includerea %i*ierelor +eader (directive Dinclude)
- &e%inirea *i substituirea simbolurilor preprocesor (directive Dde%ine)- de%inirea *i substituirea macrode%iniţiilor
- eliminarea comentariilor
- analiza directivelor Dpragma
, doua %ază analiza codului (programului) sursă- analiza codului
- %ormarea *abloanelor de compilare
, treia %ază generarea codului obiect- optimizarea *abloanelor de compilare
- generarea %i*ierului cu cod obiect
Caracteristici ale preprocesorului0CppC PreProcesssor
&irectivele Cpp încep cu caracterul D"
-
8/19/2019 Tutorial C Iulie2004
121/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 121Siemens VDOSiemens VDO
pp p
&irectivele Cpp se termină la s%îr*itul liniei sursă" $ste posibilă
prelungirea pe mai multe linii %olosind caracterul de continuare
a liniei X"
Preprocesorul nu este recursiv"
$ste posibilă lansarea în execuţie a preprocesorului ca %ază de
sine stătătoare"
Includerea /i8ierelor 'intaxa
Dinclude Nnume de %i*ierO
-
8/19/2019 Tutorial C Iulie2004
122/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 122Siemens VDOSiemens VDO
&ouă modalităţi de a preciza locaţia %i*ierului- numele este delimitat de N *i O %i*ierul este localizat pe caleamemorată în variabila de mediu speci%ică (I9C!>&$)"
- numele este delimitat de N *i O %i*ierul este localizat în directorulcurent"
&irectiva este %olosită pentru a include %i*iere +eader#macrode%iniţii# variabile prede%inite speci%ice +ard0are"
$xempleDinclude Nmet+od"eO
Dinclude flocal"+f
Simboluri 8i macrode/iniţii &e%inirea simbolurilor
Dde%ine NnumeO NvaloareO
acrode%iniţii
-
8/19/2019 Tutorial C Iulie2004
123/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 123Siemens VDOSiemens VDO
Dde%ine NnumeO(Nlista de parametriO) Ncorpul de%iniţieiO $xemple
Dde%ine 3>$ 1
Dde%ine val1 1J
Dde%ine val Qval
Dde%ine max (x#M) (x)N(M)(M)(x) &in cauza priorităţilor operatorilor# parametrii trebuie %olosiţi împreună cu paranteze
$xempluDde%ine mul(x#M) (x)Q(M)mul (a21#b21) este translatat de către preprocesor în (a21)Q(b21)
$xemplu eronat
Dde%ine mul(x#M) xQMmul (a21#b21) este translatat de către preprocesor în a21Qb21
Compilarea condiţionat* $xistă două %orme de utilizare
Compilare condiţionată bazată pe expresii cu simboluriDi% NexpresieODelseDendi%
-
8/19/2019 Tutorial C Iulie2004
124/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 124Siemens VDOSiemens VDO
Dendi% Compilare condiţionată bazată existenţa unor simboluri
Di%(n)de% Nnume de simbolODelseDendi%
amura else este optională" Compilarea condiţionată poate %i %olosită încuibat"
$xempleDi% (9CBCY!B9O)
?Q Cod speci%ic pentru motoare cu mai mult de cilindri Q?Dendi%
Di%de% .55'3
?Q se compilează doar dacă simbolul .55'3 este de%init Q?Dendi%
Directiva Epragma
$ste o directivă speci%ică# %olosită pentru a de%ini medii de lucru nonstandard" 3ipuri de pragma
-
8/19/2019 Tutorial C Iulie2004
125/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 125Siemens VDOSiemens VDO
p p g &e%inirea modelului de memorie &e%inirea tipurilor de optimizări la compilare &e%inirea secţiunilor de memorie relocabile &e%inirea opţiunilor de listare &e%inirea nivelului de veri%icare la compilare
B$emple de pragmaDpragma global 5biectele C sînt globale pentru toate tasVurileDpragma public 5biectele C sînt publiceDpragma nomacro mpiedică expandarea macrode%iniţiilor Dpragma asm &eclară o secţiune de cod assembler inline
C"#$
-
8/19/2019 Tutorial C Iulie2004
126/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 126Siemens VDOSiemens VDO
Dpragma asm &eclară o secţiune de cod assembler inlineDpragma static %orţează toate variabilele la tipul staticDpragma automatic %orţează toate variabilele la tipul automaticDpragma clear 4terge conţinutul variabilelor statice la lansarea programuluiDpragma noclear Păstrează conţinutul variabilelor statice la lansarea programuluiDpragma cse size 'tabile*te dimensiunea stivei utilizator
Dpragma align xx 'tabile*te modul de aliniere a variabilelor în memorieDpragma class odi%ică numele clasei
Pragma asm $ste %olosită pentru a insera secvenţe de cod sursă în assembler
în interiorul programului sursă C" 'intaxa
C"#$
-
8/19/2019 Tutorial C Iulie2004
127/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 127Siemens VDOSiemens VDO
Dpragma asm (sau asmBno%lus+)
Ninstrucţiiîn assemblerO
Dpragma endasm
'e %olose*te în situaţii punctuale" 9ecesită o %oarte bună cunoa*tere a limbajului de asamblare" Portabilitatea depinde de
microcontroler compilator versiunea compilatorului
4$AGA AS
;; C Declarations :olatile int a,b,W,r ;int x;
;; C Source Statement :
C"#$
-
8/19/2019 Tutorial C Iulie2004
128/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 128Siemens VDOSiemens VDO
W = aBb ;;; Generated Assembler :!" $&,'a!" $),'b!" D%,$&D
-
8/19/2019 Tutorial C Iulie2004
129/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 129Siemens VDOSiemens VDO
p 'elecţia caracteristicilor procesorului ţintă anagementul secţiunilor de cod &irective de generare a codului (date statice# registre %olosite
etc)
Inserarea codului sursă C în %i*ierul sursă assembler (src) &e%inirea simbolurilor coprocesorului Includerea %i*ierelor &e%inirea căilor pentru %i*ierele de includere
9ivelul de veri%icare a codului sursă C
-
8/19/2019 Tutorial C Iulie2004
130/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 130Siemens VDOSiemens VDO
!% Programarea C de nivel înaltpentru aplicaţii automotive
!% Programarea C de nivel înaltpentru aplicaţii automotive
Ce este programarea C de nivel înalt pentruaplicaţii automotive ,
$xtinde te+nicile de programare pentru ]enericitate
-
8/19/2019 Tutorial C Iulie2004
131/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 131Siemens VDOSiemens VDO
obusteţe entenabilitate
Programarea de nivel înalt utilizează *i unele extensii C22 Programarea de nivel scăzut *i cea de nivel înalt nu sînt concepte
opuse
-
8/19/2019 Tutorial C Iulie2004
132/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 132Siemens VDOSiemens VDO
MetaprogramareaMetaprogramarea
Conceptul de metaprogramare
Constă în %olosirea unor limbaje de nivel înalt sau %oarteînalt# altele decît C# pentru a genera cod sursă în limbajul C
-
8/19/2019 Tutorial C Iulie2004
133/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 133Siemens VDOSiemens VDO
etaprogramarea se bazează pe Preprocesorul Cpp ,lte unelte de preprocesare
$ste asemănătoare cu %olosirea *abloanelor de programare
în C22
Conte$tul standard de de+voltare /olose*te diverse unelte de programare" Proiectantul aplicaţiei C trebuie să supervizeze întregul proces de dezvoltare"
-
8/19/2019 Tutorial C Iulie2004
134/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 134Siemens VDOSiemens VDO
Compilator
Assembler
Lin
-
8/19/2019 Tutorial C Iulie2004
135/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 135Siemens VDOSiemens VDO
Cpp nu este recursiv" >neori sînt necesare mai multe %aze de preprocesare# deexemplu atunci cînd un macro este de%init în cadrul altui macro"
n a%ară de directivele Cpp admite construcţii precum I/ =@I!$
'$3 $ste un macrolimbaj complet
B$amplu de 7acro Instrucţii s0itc+ (ctrBVnV0) Z '$3(C3#J) =@I!$ (C3 ̀ T 9CBCY!B9) '$3(C3#C321) case C3 Z I&I9&=\(idBVnVB0bB C3 BBn#n) VnV0bFsegBo%sG T I&B1&.(idBVnVB0bB C3 BBn)
C"#$
-
8/19/2019 Tutorial C Iulie2004
136/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 136Siemens VDOSiemens VDO
breaV [ $9&= [ which is translated as :
s0itc+ (ctrBVnV0) Z case J Z I&I9&=\(idBVnVB0bBJBBn#n) VnV0bFsegBo%sG T I&B1&.(idBVnVB0bBJBBn) breaV [ case 1 Z
I&I9&=\(idBVnVB0bB1BBn#n) VnV0bFsegBo%sG T I&B1&.(idBVnVB0bB1BBn) breaV [ case Z I&I9&=\(idBVnVB0bBBBn#n) VnV0bFsegBo%sG T I&B1&.(idBVnVB0bBBBn) breaV [ case E Z I&I9&=\(idBVnVB0bBEBBn#n) VnV0bFsegBo%sG T I&B1&.(idBVnVB0bBEBBn)
breaV [ [
-mpacFetarea datelor
n aplicaţiile ,utomotive se lucrează cu multe
-
8/19/2019 Tutorial C Iulie2004
137/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 137Siemens VDOSiemens VDO
tipuri de date" Principiile împac+etării" gruparea datelor în scopul de a limita %luxul de date gruparea datelor în scopul de a limita cuplarea între date
3e+nici de împac+etare" eguli de denumire a variabilelor ]ruparea datelor în %i*iere# %olosind atributul KstaticL ]ruparea datelor în structuri de%inirea de %uncţii inline pentru accesul la date
-
8/19/2019 Tutorial C Iulie2004
138/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 138Siemens VDOSiemens VDO
G% 6eguli algoritmiceG% 6eguli algoritmice
-
8/19/2019 Tutorial C Iulie2004
139/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 139Siemens VDOSiemens VDO
#eguli generale#eguli generale
Constrîngeri
,lgoritmii %olosii în %aza de concepere a codului sursă sînt legaţi deurmătorii %actori de calitate
%i i
-
8/19/2019 Tutorial C Iulie2004
140/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 140Siemens VDOSiemens VDO
e%icienţa mentenabilitatea (portabilitatea# capabilitatea de evoluţie) robusteţea
Principalele obiective sînt Portabilitatea
$%icienţa
Cre8terea e/icienţei 0" $vitaţi apelurile inutile de %uncţii" /olosiţi
%uncţii inline macrode%iniţii
d li d l i ă
-
8/19/2019 Tutorial C Iulie2004
141/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 141Siemens VDOSiemens VDO
duplicarea codului sursă $vitaţi excesul de parametri la apelul %uncţiilor
&e regulă# mai puţin de H" /olosiţi variabile globale dacă sînt disponibile"
5rganizaţi expresiile condiţionale"
$ste necesară cunoa*terea modului de comportare a compilatorului" 5rdinea de testare a condiţiilor (în cea mai probabilă secvenţă)" 9umărul condiţiilor (evitarea evaluarii redundante a unor termeni)" 5rdinea cazurilor în instrucţiile s0itc+ (uneori# evitarea acestora)" /olosirea instrucţiilor goto# breaV# continue *i return (mai multe în
aceea*i %uncţie dacă este necesar"
/olosirea expresiei condiţionale dacă este mai e%icientă"
Cre8terea e/icienţei 02
$vitaţi datele de tip bMte" pre%erabil int (cu excepţia tablourilor mari)
i î t di i d l i i d t l
-
8/19/2019 Tutorial C Iulie2004
142/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 142Siemens VDOSiemens VDO
compromis între dimensiunea codului *i cea a datelor nlocuiţi tablourile de mici dimensiuni cu structuri" /olosiţi union pentru a selecta cel mai potrivit mod de acces la date" /olosiţi adresarea pe 16 biţi" $vitaţi pe cît posibil adresele %ar sau +uge" &eclaraţi date volatile doar atunci cînd este realmente necesar"
$vitaţi %olosirea stivei în %avoarea registrelor pentru datele locale"
Cre8terea e/icienţei 0@ /olosiţi accesul direct la registrele dedicate ale microcontrolerului
biţi de stare
&!# &@
$ it ţi % l i Kbl il L C (KZ[L) i d t l l l l i l d
C"#$
-
8/19/2019 Tutorial C Iulie2004
143/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 143Siemens VDOSiemens VDO
$vitaţi %olosirea KblocurilorL C (KZ[L) *i a datelor locale la nivel de bloc"
]rupaţi %uncţiile în segmente de cod *i %olosiţi apeluri de tip near emoraţi valoarea expresiilor în variabile locale înainte de a le pasa
ca parametri către macrode%iniţii# sau asiguraţi;vă că parametrul nu
este duplicat în macro" 5ptimizaţi secvenţele de cod assembler inline" '@!# '@# ,'@ în loc de >!#&I:#>!>#&I:>" $vitaţi trans%erurile între registre" /avorizaţi secvenţe liniare lungi de cod (se execută e%icient pe structuri
+ard0are de tip pipeline)"
C"#$
C"#$
Cre8terea mentenabilit*ţii
$vitaţi %olosirea macrode%iniţiilor" în special a celor exportate
$ it ţi % l i di ti i Dd %i i t t l lit l
-
8/19/2019 Tutorial C Iulie2004
144/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 144Siemens VDOSiemens VDO
$vitaţi %olosirea directivei Dde%ine *i a constantelor literale"(un cod care poate fi schimbat uşor este greu de întreţinut) /olosiţi programarea structurată" $vitaţi instrucţia goto *i %olosirea mai multor
instrucţii return într;o %uncţie" $vitaţi instrucţiile *i expresiile complexe# greu de înţeles" $vitaţi accesul direct la resursele microcontrolerului"
Cre8terea robusteţei 0"
9u %olosiţi `T sau TT în expresii condiţionale"- /olosiţi N# NT # O sau OT
9u vă bazaţi pe prioritatea implicită a operatorilor în expresii complexe"- Cu excepţia 2 Q and ?%olosiţi () sistematic
-
8/19/2019 Tutorial C Iulie2004
145/167
Programarea în Limbajul C Aplicaţii Automotive Iulie 2004 Pagina : 145Siemens VDOSiemens VDO
- Cu excepţia 2# ; # Q and ?%olosiţi () sistematic 9u combinaţi operatorii"
- 2 cu 22 sau 2T /olosiţi tMpede% pentru a de%ini propriile tipuri de date" /olosiţi blocurile"
- în mod special în macrode%iniţii
9u omiteţi breaV în instrucţia s0itc+" 9u omiteţi cazul de%ault în instrucţia s0itc+"
Cre8terea robusteţei 02
/olos