47
HầuhếtcácứngdụngđềucónhucầuvềbộnhớRAMonChipvìvậymộtsốdòng
FPGA hiện nay cũng tích hợp thêm cả các phần tử nhớ RAM vàđược gọi là RAM
nhúng
(embeddedRAM). Cácphần tửRAMđóđược tổchứcthànhtừng khốivà tuỳ
thuộcvàokiếntrúccủaFPGAnósẽđượcphânbốlinhhoạt,thườnglàxungquanhcác
phầntửngoạivi hoặc
phânbốđềutrênbềmặtChip.Mộthìnhảnhminhhoạvềphân
bốRAMtrongkiếntrúcFPGAđượcmôtảnhưtrongHình2‐45.
Hình2‐45:HìnhảnhcủaChipcócáccộtlàcáckhốiRAMnhúng
■FPGAvớihạtnhânDSP
Thựcchấtđólàmộttổhợpnhằmtăngtốcvàkhảnăngtínhtoán.Kháiniệmnàycũng
tươngtựnhưcácbộđồngxửlýtoánhọctrongkiế
ntrúcmáytính.Nguyênlýlànhằm
sansẻvàgiảmbớttảisangFPGAđểthựcthicácchứcnăngtínhtoánlớn(thôngthường
đòihỏithựchiệntrongnhiềunhịphoạtđộng
củaChipDSP)vàchophépChipDSPtập
trungthựchiệncácchứcnăngđơnnhịptốiưu.TổhợpFPGAvàDSPlàm ộtkiếntrúc
rấtlinhhoạtvàđặcbiệtcảithi
ệnđượchiệusuấtthựchiệnvàtăngtốchơnrấtnhiềuso
vớikiếntrúcnhiềuChipDPShoặcASICsđồngthờigiáthànhlạithấphơn.
Hình2‐46:SơđồnguyênlýmạchghépnốiVĐKvàFPGA
48
3 CƠ SỞ KỸ THUẬT PHẦN MỀM NHÚNG
3.1 Đặc điểm phần mềm nhúng
9 Hướngchứcnănghoáđặcthù
9 Hạnchếvềtàinguyênbộnhớ
9 Yêucầuthờigianthực
3.2 Biểu diễn số và dữ liệu
Đơnvịcơbảnnhấttrongbiểudiễnthôngtincủahệthốngsốđượcgọilàbit,
chínhlàkýhiệuviếttắtcủathuậtngữbi
narydigit.
1964,IBMđãthiếtkếvàchếtạomáytínhsốsửdụngmộtnhóm8bitđểđánh
địachỉbộnhớvàđịnhnghĩarathuậtngữ8bit=1byte.
Ngàynaysửdụngrộngrãi
thuậtngữwordlàmộttừdữliệudùngđểbiểudiễn
kíchthướcdữliệumàđượcxửlýmộtcáchhiệuquảnhấtđốivớimỗiloạikiến
trúcxửlýsốcụthể.
Chínhvìvậymộttừcóthểlà16bits,32bits,hoặc64bits…
Mỗimộtbytecóthểđượcchiarathànhhainửa4bitvàđượcgọilàcácnibble.
Nibblechứacácbíttrọng
sốlớnđượcgọilànibblebậccao,vànibblechứacácbit
trọngsốnhỏđượcgọilànibblebậcthấp.
3.2.1 Các hệ thống cơ số
Trongcáchệthốngbiểudiễnsốhiệnnayđềuđượcbiểudiễnởdạngtổngquátlàtổng
luỹthừatheocơsố,vàđượcphânloạitheogiátrịcơsố.Mộtcáchtổngquát
mộthệbiểu
diễnsốcơsốbvàalàmộtsốnguyênnằmtrongkhoảnggiátrịcơsốbđượcbiểudiễn
nhưsau:
1
10
0
n
nn i
nn i
i
Aab ab a ab
−
−
=
=+ +⋅⋅⋅+=⋅
∑
(1.1)
Vídụnhưcơsốbinary(nhịphân),cơsốdecimal(thậpphân),c ơsốhexadecimal,cơsố8
Octal(bátphân).
Vídụvềbiểudiễncácgiátrịtrongcáchệcơsốkhácnhau:
243.51
10=2x10
2
+4x10
1
+3x10
0
+5x10
‐1
+1x10
‐2
212
3=2x3
2
+1x3
1
+2x3
0
=2310
10110
2=1x2
4
+0x2
3
+1x2
2
+1x2
1
+0x2
0
=2210
Hailoạicơsốbiểudiễnthôngdụngnhấthiệnnaychocáchệthốngxửlýsốlàcơsốnhị
phânvàcơsốmườisáu.
3.2.2 Số nguyên
Trongbiểudiễnsốcódấuđểphânbiệtsốdươngvàsốâmngườitasửdụngbittrọngsố
lớnnhấtquiướclàmbitdấuvàcácbitcònlạiđượcs ửdụngđểbiểudi
ễngiátrịđộlớn
củasố.Vídụmộttừ8bitđượcsửdụngđểbiểudiễngiátrị‐1sẽcódạngnhịphânlà
10000001,vàgiá trị+1sẽcódạng00000001.Nhưvậyvới
mộttừ8bitcóthểbiểudiễn
49
đượccácsốtrongphạmvitừ‐127đến+127.MộtcáchtổngquátmộttừNbitsẽbiểu
diễnđược‐2
(N‐1)
‐1đến+2
(N‐1)
‐1.
Chúýkhithựchiệncộnghaisốcódấu:
9 Nếuhais ốcùng dấuthìthựchiệnphépcộngphầnbiểudiễngiátrịvàsửdụngbit
dấucùngdấuv
ớihaisốđó.
9 Nếuhaisốkhácdấuthìkếtquảsẽnhậndấucủatoántửlớnhơn,vàthựchiện
phéptrừgiữatoántửcógiátrịlớnhơnvớitoán
tửbéhơn.
Vídụ1:Cộnghaisốcódấu01001111
2và001000112.
1111 ⇐ carries
01001111 (79)
0+0100011 +(35)
01110010 (114)
Vídụ2:Cộnghaisốcódấu01001111
2và011000112.
Nhớcuốicùng 1
← 1111 ⇐carries
Tràn 0 1001111 (79)
bỏnhớ 0+ 1100011 +(99)
0 0110010 (50)
Vídụ3:Trừhaisốcódấu01001111
2và011000112.
0112 ⇐borrows
0 1100011 (99)
0‐ 1001111 ‐(79)
0 0010100 (20)
Vídụ4:Cộnghaisốkhácdấu10010011
2(‐19)và000011012(+13)
012 ⇐borrows
1 0010011 (‐19)
0‐ 0001101 +(13)
1 0000110 (‐6)
Thuậttoánthựchiệnphéptínhcódấu:
(1) Khaibáovàxóacácbiếnlưugiátrịvàdấuđểchuẩnbịthựchiệnphéptính.
(2) Kiểmtradấucủatoántửthứnhấtđểxemcóphảisốâmkhông.Nếulàsốâm
thì
thựchiệnbùdấuvàbùtoántử.Nếukhôngthìchuyểnquathựchiệnbước3.
(3) Kiểmtradấucủatoántửthứhaiđểxemcóphảisốâmkhông.Nếulàsốâmthì
thựchiệnbùdấuvàbùtoántử.Nếukhôngthìchuyểnsangthựchiệnbước4.
(4) Thựchiệnphépnhânhoặcchiavớicáctoántửvừaxửlý.
(5) Kiểmtradấ
u.Nếuzerothìcoinhưđãkếtthúc.Nếubằng‐1(0ffh)thìthựchiện
phéptínhbùhaivớikếtquảthuđượcvàkếtthúc.
50
Hiệnnayngườitasửdụnghaiquiướcbiểudiễns ốnguyênphânbiệttheothứtựcủa
bytetrọngsốtrongmộttừđượcbiểudiễn:
• Litteedian:bytetrọngsốnhỏnhấtđứngtrướcÆthuậnlợichophépcộnghoặc
trừvà
• Bigendian:bytetrọngsốlớnnhấtđứng trướcÆthuậnlợichophépnhânhoặc
chia.
Vídụxétmộtsốnhịphân4‐byte
Theoquiướcbiểudiễnlitteedianthìthứtựđịachỉlưutrongbộnhớsẽlà:
Địachỉcởsở+0=Byte0
Địachỉcơsở+1=Byte1
Địachỉcơsở+2=Byte2
Địa
chỉcơsở+3=Byte3
Vàtheoquiướcbiểudiễnsốbigediansẽlà:
Địachỉcởsở+0=Byte3
Địachỉcơsở+1=Byte2
Địachỉcơsở+2=Byte1
Địachỉcơsở+3=Byte0
3.2.3 Số dấu phảy tĩnh
Chúngtacóthểsửdụngmộtkýhiệudấuchấmảođểbiểudiễnmộtsốthực.D ấuchấm
ảođượcsửdụngtrongtừdữliệudùngđểphânbiệtvàngăncáchgiữa
phầnbiểudiễn
giátrịnguyêncủadữliệuvàmộtphầnlẻthậpphân.Vídụvềmộttừ8‐bitbiểudiễnsố
dấuphảyđộngđượcchỉranhưtrongHình3‐1.Với
cáchbiểudiễnnày,giátrịthựccủa
sốđượctínhnhưsau:
43210123
43210 1 2 3
432101 23
22222 2 2 2
02 12 02 12 12 12 02 12
8211/21/8
11.625
Na a a a a a a a
−−−
−− −
−−−
=+++++ + +
= ⋅ +⋅ +⋅ +⋅ +⋅ +⋅ + ⋅ +⋅
=+++ +
=
Hình3‐1:Địnhdạngbiểudiễnsốdấuphảytĩnh8bit
Nhượcđiểmcủaphươngphápbiểudiễnsốdấuphảytĩnhlàvùngbiểudiễnsốnguyên
bịhạnchếbởidấuphảytĩnhđượcgáncốđịnh.Điềunàydễxảyra
hiệntượngtrànsố
khithựchiệncácphépnhânhaisốlớn.
51
3.2.4 Số dấu phảy động
Phươngphápbiểudiễnsốchínhxácvàlinhhoạtđượcsửdụngrộngrãihiệnnaylàhệ
thốngbiểudiễnsốdấuphảyđộng.Đâycũnglàmộtphươngphápbiểudiễn
sốkhoa
họcbaogồm2phần:phầnbiểudiễnlưutrữsốmantissavàmộtphầnlưutrữbiểudiễn
sốexponent.Vídụtronghệcơsốthậpphân,mộtsốnguyênbằng
5cóthểđượcbiểu
diễnhoặclà
1
0.5 10⋅ ,
1
50 10
−
⋅ ,ho ặc
2
0.05 10⋅ ,…Trongmáytínhsốhoặchệthốngsốnói
chung,cácsốdấuphảyđộngnhịphânthườngđượcbiểudiễndạng
2
E
NM=⋅
(1.2)
Trongđó,Mlàphầngiátrịsốmantissa,ElàphầnlũythừacủasốN.Mthườnglàcác
giátrịlẻmàphầnthậpphâncủanóthườngnằmtrongkhoảng
0.5 1M≤≤
.
Hình3‐2môtảbiểudiễnmộtsốdấuphảyđộngcủatừ8bitgồm5bitbiểudiễnphầnsố
cónghĩamantissa,và3bitbiểudiễnphầnlũythừ
a.Vìcácphầnmantissavàlũythừa
đềucóthểnhậncácgiátrịâmvìvậycácbitđầutiêncủacácphầngiátrịđóđềucóthể
đượcsửdụngđểbiểudiễndấukhic
ầnthiết.
Hình3‐2:Biểudiễndấuphảyđộng8bít
TrongmộtsốVXL,VĐKdođộrộngtừnhịphânnhỏnêncóthểsửdụng2từđểbiểu
diễnmộtsốdấuphảyđộng.Một từsẽdùngđểbiểudiễngiátrịmantissa,vàmộtphầ
n
biểudiễngiátrịexponent.
Nếuphầnmantissađượcchuẩnhóathànhmộtsốlẻcógiátrịtrongkhoảng
0.5 1M
≤
≤
thìbitđầutiênsaubitdấuthườnglàmộtvàsẽcómộtdấuphảynhịphânẩnngaysau
bitdấu.
PhầnbiểudiễnexponentEsẽquyếtđịnhvịtrícủadấuphảyđộ
ngsẽdịchsangtrái(E>0)
haysangphải(E<0)baonhiêuvịtrí.Vídụbiểudiễnmộtsốthậpphân6.5bằngmộttừ
8bitdấuphảyđộngnhưsau:
2
11
3
.1101 2
11 1
26.5
2416
N =⋅
⎡⎤
=++ =
⎢⎥
⎣⎦
Trongtrườnghợpnàyphầnmantissagồm4bitvàphầnexponentgồm3bit.Nếutadịch
dấuphảysangphải3vịtríbitthìchúngtasẽcómộtsốnhịphândấuphả
yđộngbiểu
diễnđượcsẽlà110.1.
Tổngquáthóatrongtrườnghợpmộtsốnhịphândấuphảyđộngnbitgồmmbitbiểu
diễnphầnmantissavàebitbiểudiễnphần
exponentthìgiátrịcủasốlớnnhấtcóthểbiểu
diễnđượcsẽlà
1
1(21)
max
(1 2 )2
e
m
N
−
−+ −
=− (1.3)
Vàsốdươngnhỏnhấtcóthểbiểudiễnlà
52
1
(2 1)
min
0.5 2
e
N
−
−−
=⋅ (1.4)
TheotiêuchuẩnIEEE754và854có2địnhdạngchínhchosốdấuphảyđộnglàsốthực
dài(long)vàsốthựcngắn(short)chúngkhácnhauvềdảibiểudiễnvàđộlớn
lưutrữ
yêucầu.Theochuẩnnày,sốthựcdàiđượcđịnhdạng8bytebaogồm1bitdấu,11bit
exponentvà53bitlưugiátrịsốcónghĩa.Mộtsốthựcngắnđượcđịnhd
ạng4bytebao
gồm1bitdấu,8bitlũythừavà24bitlưugiátrịs ốcónghĩa.Mộtsốthựcngắncóthể
biểudiễnvàxửlýđượcsốcógiátrịnằm
trongdải10
38
to10
‐38
vàsốthựcdàicóthểbiểu
diễnvàxửlýđượcsốcógiátrịthuộcdải10
308
to10
‐308
.Đểbiểudiễnmộtgiátrịtương
đươngnhưvậybằngsốdấuphảytĩnhthìcầntới256bithay32bytedữliệu.
3.2.5 Một số phép tính cơ bản
Thựchiệnphépnhân
VìtrongcácVĐKnhúngthườngkhônghỗtrợcácphépnhânnhiềubyte.Côngviệcnày
phảiđượcthựchiệnbởingườipháttriểnchươngtrìnhvàthểhiệndưới
dạngmộtthuật
toándựatrêncácphéptoáncósẵnápdụngchosốnhịphânlàcộng/trừvàdịch.Đểcó
mộtsựhiểubiếtrõrànghơnvềthuậttoánthựchiệnphép
nhân,chúngtaxétmộtvídụ
vềmộtphéptínhnhânhaisốnhịphântổngquátnhưsau:
10
10
10
10
10
10
222
222
()2 ()2 ()2
n
n
n
n
n
n
Aa a a
Bb b b
bA bA bA
=⋅+⋅⋅⋅+⋅+⋅
=⋅+⋅⋅⋅+⋅+⋅
⋅⋅+⋅⋅⋅+⋅⋅+⋅⋅
Nguyênlýthựchiệnphépnhâncũnggiốngnhưtathựchiệnphépnhânhaiđathức.
Trongtrườnghợpnhânhaisốnhịphânthìmỗiphầntửlàmộtbit,bytehoặctừ.Ví
dụ
cụthểvớihaisốnhịphân4bittathuđượcphépnhânthựchiệnnhưsau:
3210
3210
3210
3210
3210
30 20 10 00
4321
31 21 11 01
5432
32 22 12 02
6543
33 23 13 03
2222
2222
2222
2222
2222
2222
aaaa
bbbb
ab ab ab ab
ab ab ab ab
ab ab ab ab
ab ab ab ab
⋅+⋅+⋅+⋅
⋅+⋅+⋅+⋅
⋅⋅+ ⋅⋅+⋅⋅+⋅⋅
⋅⋅ + ⋅⋅ +⋅⋅ + ⋅⋅
⋅⋅+ ⋅⋅ +⋅⋅+⋅⋅
⋅⋅ + ⋅⋅ +⋅⋅ + ⋅⋅
Thuậttoánthựchiệnphépnhân32bittheotrìnhtựsau:
(1) Cấpphátvùngnhớđủlớnđểlưusốđượcnhân32bitvàcóthểthựchiệnphép
dịchtrái32lần.Đặtgiátrịkhởit
ạochobộđếmbitbằng32vàxóathanhghi
haybiếnlưugiữkếtquảphépnhân.(Chúý:Sốlượngbitcầnđểlưugiátrịkết
quảphảibằngtổngsốlượngbitcầnđể
lưucácsốhạngphépnhân)
(2) Dịchsốnhânsangphảimộtvịtríbitvàkiểmtracờnhớ.Nếukhôngcócờnhớ
thìtiếptụcthựchiệnbước3.Nếu xuấthi
ệncờnhớthìcộngthêmvàobiếnlưu
kếtquảhiệntạicủaphépnhânmộtgiátrịbằnggiátrịcủasốđược nhân.
53
(3) Dịchsốđượcnhânsangtráimộtvịtríbitvàgiảmbộđếmdịchđimột.Kiểm
traxemgiátrịcủabộđếmdịchcóbằngkhôngkhông?Nếubằngkhôngthì
thựchiện
tiếpbước4,cònkhôngthìquaytrởlạithựchiệnbước2.
(4) Kếtquảcuốicùngcủaphépnhânđượclưutrongthanhghibiếnkếtquả.
Vídụphépnhântừnhịphân4
bit1100x1101
0. A 1100(12)
B 1101(13)
Counter 100(4)
Product 0
1. A 11000(24)
B 0110(6)
Counter 011(3)
Product 1100(12)
2. A 110000(48)
B 0011(3)
Counter 010(2)
Product 1100(12)
3. A 1100000(96)
B 0001(1)
Counter 001(1)
Product
111100(60)
4. A 11000000(192)
B 0001(1)
Counter 000(0)
Product 10011100(156)
ThựcthithuậttoánthựchiệnphépnhânsốnguyênkhôngdấubằngngônngữC/C++:
Thựchiệnphépchia
Phépchiacóthểđượcthựchiệnbằngcáchchuyểnđổithànhphépnhânvà
phépdịch.
Vídụmuốnthựchiệnphépchia5tronghệthậpphânchúngtacóthểthựchiệnbởimột
phépnhân2vàdịchdấuphảycủakếtquảthuđược sang trái
mộtđơnvị.Mộtcách
tổngquátcóthểthựchiệnchuyểnđổimộtphépchiatươngđươngnhưsau:
long product = 0;
while (multipier != 0){
if (multiplier & 1){
product += multiplicand;
}
multiplier >> =1;
multiplicand <<= 1;
}
54
x
nx
aan
=
Đốivớiphépchianhịphânthìnsẽđượcchọnlàmộtsốlũythừacủa2vàphảilớnhơn
a.
Thuậttoánthựchiệnphépchiacóthểđượcthựcthibởiphép
dịch,cộngvàtrừnhưsau:
(1) Nạpbiếnlưugiátrịthươngsốbằnggiátrịcủasốbịchia;sốbướcdịchcầnthực
hiệnbằngsốbitlưusốbịchia.
(2)
Dịchtráibiếnlưugiátrịthươngsốvàophầnbiếnlưugiátrịdưcủaphépchia.
(3) Sosánhsốdưvớisốchia.Nếusốdưlớnhơnhoặcbằngsốchiathìth
ựchiện
phéptrừsốdưđimộtgiátrịbằnggiátrịs ốchia.Nếukhôngthìchuyểnsang
thựchiệnbướctiếptheo.
(4) Giảmbiếnlưugiátrịsốlầnlặpvàkiể
mtraxemnóđãbằngkhôngchưa.Nếu
chưabằngkhôngthìquaytrởlạibước2thực hiệntiếp,cònnếubằngkhôngthì
giátrịcủaphépchiađượclưutrongônhớch
ứasốdưvàthươngsố.
ThựcthithuậttoánbằngngônngữC/C++
Trướckhithựchiệnphépchiayêucầucầnphảikiểmtralỗichiakhôngcóthểxảyra.
Thu
ậttoánthựchiệnphépchiachủyếudựatrênphépdịchvàphéptrừ.Sốbịchiasẽ
dịchsangtráivàlưuvàomộtbiến,phầndưsẽđượcsosánhvớisốchia.Nếu
phầndư
bằnghoặclớnhơnsốchiathìphầndưsẽđượctrừđimộtgiátrịbằngsốchiavàsốbị
chiasẽđượccộngthêmmột vàdịchsangtrái mộtvịtríbitvà
đóchínhđượcgọilà
thươngsố.Quátrìnhnàyđượclặplạivàtiếptụcchođếnkhisốlầndịchbằngđúngsố
bitcủatừlưusốbịchia.
Cácbiếnđượcsửd
ụngtrongquátrìnhthựchiệnphépchiabaogồm5biếnsố:sốbị
chia,sốchia,thươngsố,sốdưvàsốlầndịch.Trongquátrìnhthựchiệnthìsốbịchia,
thươngsố,
vàsốdưcùngchiasẻchungmộtvùngônhớ.Sốdưvàsốbịchiasẽthuộc
cùngmộttừlớn.Sốbịchianằmtrongphầntừtrọngsốthấpvàsốdưsẽnằmtrong
phần
từtrọngsốcao.Saukhithựchiệnxongphépchiathìsốbịchiasẽđượcdịchtoàn
bộsangtráivàophầnbiếnsốdưvàđượcthaythếbằngthươngsố.Kếtquảcònlạithu
i = 0; quotient = 0;
if (divisor == 0) goto error;
while (dividend > divisor) divisor <<= 1; i++;
divisor >>= 1;
while (i != 0){
quotient <<= 1;
if (divisor < dividend ) dividend -= divisor;
quotient ++;
divisor >>=1 ,
i ;
}
55
đượcchỉcònlàsốdưvàthươngsố.Hìnhảnhvềbộnhớlưucácbiếnsốthựchiệntrong
thuậttoánnàyđượcminhhoạnhưtrongHình3‐3.
Hình3‐3:Thựchiệnphépchia
3.3 Tập lệnh
3.3.1 Cấu trúc tập lệnh CISC và RISC
HầuhếtcácviđiềukhiểnvàVXLnhúngcócấutrúcđượcpháttriểndựatheokiếntrúc
máytínhtậplệnhphứchợpCISC(ComplexInstructionSetComputer).CISClàmộtcấu
trúcx
ửlýcáclệnhphứchợp,tứclàmộtlệnhphứchợpsẽbaogồmmộtvàilệnhđơn.
Theo nguyên lý này có thể giảm bớtđược thời gian dùngđểtruy nhập vàđọc mã
chươngtrìnhtừbộnhớ.Điềunàyrấtcóýnghĩavớicáckiếntrúcthiếtkếxửlýtínhtoán
theokiểutuầntự.Lýdochosựrađờicủatậplệnhphứch
ợpnhằmgiảmthiểudung
lượngbộnhớcầnthiếtđểlưugiữchươngtrìnhthựchiện,vàsẽgiảmđượcgiáthànhvề
56
bộnhớcầncungcấpchoCPU.Cáclệnhcànggọnvàphựchợpthìsẽcầncàngítkhông
gianbộnhớchươngtrình.Kiếntrúctậplệnhphứchợpsửdụngcáclệnh
vớiđộdàibiến
đổituỳthuộcvàođộphứchợpcủacáclệnhtừđơngiảnđếnphứctạp.Trongđósẽcó
mộtsốlượnglớncáclệnhcóthểtruynhậptrựcti
ếpbộnhớ.Vìvậyvớikiếntrúctập
lệnhphứchợpchúngtasẽcóđượcmộttậplệnhđadạngphứchợp,gọn,vớiđộdài
lệnhthayđổivàdẫnđế
nchukỳthựchiệnlệnhcũngthayđổituỳtheođộphứchợp
trongtừnglệnh.Mộtvàilệnhphứchợp,đặcbiệtlàcáclệnhtruynhậpbộnhớcầntới
vàich
ụcchukỳđểthựchiện.TrongmộtsốtrườnghợpcácnhàthiếtkếVXLthấyrằng
cầnphảigiảmchukỳnhịplệnhđểcóđủthờigianchocáclệnhhoànthànhđiềunày
cũngdẫnđếnthờigianthựchiệnbịkéodàihơn.
MộtsốVĐKđượcpháttriểntheokiếntrúcmáytínhtậplệnhrútgọnRISC(Reduced
InstructionSetComputer).RISCphùhợpvới
cácthiếtkếkiếntrúcxửlýcáclệnhđơn.
Thuậtngữ“rútgọn”(reduced)đôikhibịhiểukhôngth ậtchínhxáctheonghĩađencủa
nóthựcchấtýtưởnggốcxuấtphát
từkhảnăngcungcấpmộttậplệnhtốithiểuđểthực
hiệntấtcảcáchoạtđộngchínhnhư:chuyểndữliệu,cáchoạtđộngALUvàrẽnhánh
điềukhiểnchương
trình.Chỉcócáclệnhnạp(load),lữutrữ(store)làđượcphéptruy
nhậptrựctiếpbộnhớ.
B‐1:SosánhđặcđiểmcủaCISCvàRISC
CISC RISC
Bấtkỳlệnhnàocũngcóthểtham
chiếutớibộnhớ
Chỉ có các lệnh Nạp (Load)
hoặc Lưu trữ (Store) là có thể
thamchiếutớibộnhớ
Tồntạinhiềulệnhvàkiểuđịachỉ Tồntạiítlệnhvàkiểuđịachỉ
Khuôndạnglệnhđadạng Khuôndạnglệnhcốđịnh
Chỉcómộttậpthanhghi Cónhiềutậpthanhghi
Các lệnh thực hiện trong nhiều
nhịpchukỳ
Các lệnh thực hiện trong một
nhịpchukỳ
Có một chương trình nhỏ để
thôngdịchlệnh
Lệnhđược thực hiện trực tiếp
ngaybởiphầncứng
Chương trình thông dịch lệnh
phứctạp
Chương trình biên dịch mã
nguồnphứctạp
Khônghỗtrợcơchếpipeline Hỗtrợcơchếpipeline
Kíchthướcmãchươngtrìnhnhỏ
gọn
Kíchthướcmãchươngtrìnhlớn
57
3.3.2 Định dạng lệnh
Hình3‐4:ĐịnhdạnglệnhMIPS
Hình3‐5:Phânloạicácphépthựcthilệnh
3.3.3 Các kiểu truyền địa chỉ toán tử lệnh
Cáckiểuđánh/truyềnđịachỉchophépchúngtachỉra/truyềntoántửthamgiatrong
cáclệnhthựcthi.Kiểuđịachỉcóthểchỉralàm ộthằngsố,môtthanhghihoặcmộtkhu
vựcc
ụthểtrongbộnhớ.Mộtsốkiểuđánhđịachỉchophépsửdụngđịachỉngắnvà
mộtsốloạithìchophépchúngtaxácđịnhkhuvựcchứatoántửlệnh,vàthườngđược
58
gọilàđịachỉhiệudụngcủatoántửvàthườnglàđộng.Chúngtasẽxétmộtsốloạihình
đánhđịachỉcơbảnhiệnđangđượcsửdụngrộngrãitrongcơchếthực
hiệnlệnh.
Đánhđịachỉtứcthì(ImmediateAddressing)
Phươngphápnàychophéptruyềngiátrịtoántửlệnhmộtcáchtứcthìnhưmộtphần
củacâulệnhđượcthựcthi.Vídụ
nếusửdụngkiểuđánhđịachỉtứcthờichocâulệnh
Load0x0008thìgiátrị0x0008sẽđượcnạpngayvàoAC.Trườngbitthườngdùngđể
chứatoántửlệnhsẽchứagiátrịthựcc
ủatoántửchứkhôngphảiđịachỉcủatoántử
cầntruyềncholệnhthựcthi.Kiểuđịachỉtứcthờichophépthựcthilệnhrấtnhanhvì
khôngphảithựchiệntruy
xuấtbộnhớđểnạpgiátrịtoántửmàgiátrịtoántửđãđược
gộpnhưmộtphầntrongcâulệnhvàcóthểthựcthingay.Vìtoántửthamgianhưmột
phầncốđịnhcủachương
trìnhvìvậykiểuđánhđịachỉnàychỉphùhợpvớicáctoántử
hằngvàbiếttrướctạithờiđiểmthựchiệnchươngtrình,hayđãxácđịnhtạithờiđiểm
biên
dịchchươngtrình.
Đánhđịachỉtrựctiếp(DirectAddressing)
Phươngphápnàychophéptruyềntoántửlệnhthôngquađịachỉtrựctiếpchứatoántử
đótrongbộnhớ.Vídụnếus
ửdụngcơchếđánhđịachỉtoántửtrựctiếpthìtrongcâu
lệnhLoad0x0008sẽđượchiểulàdữliệuhaytoántửđượcnạptrongcâulệnhnàynằm
trongbộnhớtạiđịachỉ0x0008.Cơ
chếđánhđịachỉtrựctiếpcũngthuộcloạihìnhkhá
nhanhmặcdùkhôngnhanhđượcnhưcơchếtruyềnđịachỉtứcthờinhưngđộmềm
dẻocaohơnvìđịachỉcủatoántửkhông
nằmtrongphầnmãlệnhvàgiátrịcóthểthay
đổitrongquátrìnhthựcthichươngtrình.
Đánhđịachỉthanhghi(RegisterAddressing)
Trongcáchđánhđịachỉvàtruyềntoántửnàythìtoántửkhôngnằ
mtrongbộnhớnhư
trườnghợpđánhđịachỉtrựctiếpmànằmtạichínhtrongthanhghi.Khitoántửđã
đượcnạpvàothanhghithìviệcthựchiệncóthểrấtnhanhvìtốcđộ
truyxuấtthanhghi
nhanhhơnsovớibộnhớ.Nhưngsốlượngthanhghichỉcóhạnvàphảiđượcchiasẻ
trongquátrìnhthựchiệnchươngtrìnhvìvậycáctoántửphảiđượcn
ạpvàothanhghi
trướckhinóđượcthựcthi.
Đánhđịachỉgiántiếp(IndirectAddressing)
Trongphươngpháptruyềntoántửnày,trườngtoántửtrongcâulệnhđượcsửdụngđể
thamchiếutớimột
contrỏnằmtrongbộnhớđểtrỏtớiđịachỉhiệudụngcủatoántử.
Cơchếtruyềnnàycóthểnóilàmềmdẻonhấtsovớicáccơchếtruyềnđịachỉkhác
trongquátrình
thựcthichươngtrình.Vídụnếuápdụngcơchếtruyềnđịachỉgiántiếp
trongcâulệnhLoad0x0008thìsẽđượchiểulàgiátrịdữliệucóđịachỉtại0x0008thực
chấtlàch
ứađịachỉhiệudụngcủatoántửcầntruyềnchocâulệnh.Giảthiếttạivịtríô
nhớ0x0008đangch ứa giátrị 0x02A0thì0x02A0chínhlà giátrịthựccủatoán tửsẽ
đượcn
ạpvàoAC.Mộtbiếnthểkháccũngcóthểthựchiệntheocơchếnàylàtruyền
thamchiếutớicontrỏnằmtrongkhuvựcthanhghi.Cơchếnàycònđượcbiếttớivới
têngọilàđánhđịachỉgiántiếpthanhghi.Vídụm ộtcâulệnhLoadR1sửdụngc ơchế
59
truyềnđịachỉgiántiếpthanhghithìchúngtacóthểdễdàngthôngdịchđượctoántử
truyềntrongcâulệnhnàycóđịachỉhiệudụngnằmtrongthanhghiR1.
Cáchđánhđịachỉcơsở
vàchỉsố(IndexedandBasedAddressing)
Trongcơchếnàyngườitasửdụngmộtthanhghiđểchứaoffset(độchênhlệchtương
đối)màsẽđượccộngvớitoántửđểtạoramộtđịachỉhiệu
dụng.Vídụ,nếutoántửX
củalệnhLoadXđượcđánhđịachỉtheocơchếđịachỉchỉsốvàthanhghiR1làthanh
ghichứachỉsốvàcógiátrịlà1thìđịachỉhiệudụ
ngcủatoántửthựcchấtsẽlàX+1.Cơ
chếđánhđịachỉcơsởcũnggiốngnhưvậyngoạitrừmộtđiềulàthayvìsửdụngthanh
ghiđịachỉoffsetthìởđâysửdụngthanhghi
địachỉcơsở.Vềmặtlýthuyếtsựkhác
nhaugiữahaicơchếthamchiếu địachỉnàylàchúngđượcsửdụngthếnàochứkhông
phảicáctoántửđượctínhtoánthểnào.Mộtthanhghichỉ
sốsẽlưuchỉsốmàsẽđược
sửdụngnhưmộtoffsetsovớiđịachỉđượcđưaratrongtrườngđịachỉcủalệnhthực
thi.Thanhghic ơsởlưumộtđịachỉcơsởvàtrường
địachỉtrongcâulệnhthựcthisẽ
lưugiátrịdịchchuyểntừđịachỉnày.Haicơchếthamchiếuđịachỉnàyrấthữuích
trongviệctruyxuấtvớicácphầntửkiểu
mảng.Tuỳthuộcvàothiếtkếtậplệnhcác
thanhghimụcđíchchungthườnghayđượcsửdụngtrongcơchếđánhđịachỉnày.
Đánhđịachỉngănxếp(StackAddressing)
Trongcơchếtruyềnđị
achỉnàythìtoántửnhậnđượctừđỉnhngănxếp.Thayvìsử
dụngthanhghimục đíchchunghayônhớkiếntrúcdựatrênngănxếplưucáctoántử
trênđỉnhcủangănx
ếp,vàcóthểtruyxuấtvớiCPU.Kiếntrúcnàykhôngchỉhiệuquả
trongviệclưugiữcácgiátrịtrunggiantrongcácphéptínhphứctạpmàcòncungcấp
mộtphươngpháphiệu
quảtrongviệctruyềncácthamsốtrongcáclờigọihàmcũng
nhưđểlưucấtcáccấutrúcdữliệucụcbộvàđịnhnghĩaraphạmvitồntạicủacácbiến
và
cáchàmcon.Trongcáccấutrúclệnhtruyềntoántửdựatrênngănxếp,hầuhếtcác
lệnhchỉbaogồmphầnmã,tuynhiêncũngcómộtsốlệnhđặcbiệtchỉcó
mộttoántửví
dụnhưlệnhcấtvào(push)hoặclấyra(pop)từngănxếp.Chỉcómộtsốlệnhyêucầuhai
toántửthìhaigiátrịchứatrong2ônhớtrênđỉnh
ngănxếpsẽđượcsửdụng.Vídụ
nhưlệnhAdd,CPUlấyrakhỏingănxếphaiphầntửn ằmtrênđỉnhrồithựchiệnphép
cộngvàsauđólưukếtquả
trởlạiđỉnhngănxếp.
Cáccáchđánhđịachỉkhác
Córấtnhiềubiếnthểtạobởicáccơchếđánhđịachỉgiớithiệuởtrên.Đólàsựtổhợp
trongviệctạora
hoặcxácđịnhđịachỉhiệudụngcủato ántửtruyềncholệnhthựcthi.
Vídụnhưcơchếđánhđịachỉchỉsốgiántiếpsửdụngđồngthờicảhaicơch ếđánhđịa
chỉđồngthời,
tươngtựnhưvậycũngcócơchếđánhđịachỉcơsở/offset…Cũngcómột
sốcơchếtựđộngtănghoặcgiảmthanhghisửdụngtronglệnhđangthựcthinhờvậy
màcó
thểgiảmđượcđộlớncủamãchươngtrìnhđặcbiệtphùhợpchocácứngdụng
Nhúng.
60
3.3.4 Nguyên lý thực hiện pipeline
Vi xử lý cóthểthực thi các lệnh với một tốcđộrấtnhanh.RISC sử dụng kỹthuật
pipelineđểtăngcườngtốcđộxửlýcáclệnhđồngthờinhờvàokhảnăngthựchiện
xếp
chồngcuốnchiếuliêntụccáclệnhtheocácphânđoạnthựchiệnlệnh.Vídụmộtlệnhcó
thểđượcđọctừbộnhớtrongkhimộtlệnhkhácđangđượcgiảimãđể
chuẩnbịđưavào
xửlývàmộtlệnhkhácthìđangđượcthựchiện.CũngcómộtsốVĐKcótêngọilàmáy
tínhtậplệnhđặcbiệtSISC(SpecificInstructionSetComputer)vìchúngđược
pháttriển
dựatrêntậplệnhđượcthiếtkếđặcchủngchomụcđíchđiềukhiển.
Hình3‐6:Nguyênlýthựchiệnpipeline
Pipelineđượcthựchiệndựatrênnguyênlýxếpchồngcuốnchiếucácphânđoạntrong
mỗimộtlệnh. Thôngthườngmỗi mộtlệnhđượcchia ralàmnhiềuphânđoạnthực
hi
ện,phổbiếnhiệnnaylà5phânđoạntuầntựnhưsau:
(1) Trỏlệnh(InstructionFetch):Thựchiệntrỏtớilệnhthựchiệnbằngcáchđọcđịa
chỉlệnhtừthanhghicontrỏ
lệnh(PC),đọclệnhđóratừbộnhớchươngtrìnhvà
tínhtoánrồinạpgiátrịmớivàotrongthanhghicontrỏlệnhđểtrỏtớilệnhsẽ
thựcthitiếptheo.
(2) Giảimãlệnh
(Decode):Thựchiệnthôngdịchvàchuyểnđổimãlệnhthànhdạng
mãđểALUcóthểhiểuvàchuẩnbịthựcthi.Quátrìnhnàythựcchấtlàquátrình
đọcvàchuyểnđổinộidung
trongcácthanhghichươngtrình.
(3) Thựchiệnl ệnh(Execute):ALUthựcthilệnhvừađượcgiảimã.
(4) Truynhậpbộnhớdữliệu(Memory):Đọcrahoặcviếtvàobộnhớdữliệ
unếu
lệnhthựchiệncónhucầunày.
(5) Viếttrởlại(Writeback):Hoànthànhvàcậpnhậtnộidungcácthanhghi.
Chúngtacầnphânbiệtc ơchếpipelinevàcơchếthự
chiệnsongsongmặcdùcảhaiđều
nhằmđápứngyêucầuthựcthicạnhtranhvàtăngtốcđộthựcthi. Cơchếpipelinegiải
quyếtvầnđềcạnhtranhvàtăngtốcđộthực
hiệnbằngcáchchianhỏtínhtoánthành
cácbướcnhỏtrongkhiđócơchếsongsongsẽsửdụngnhiềunguồntàinguyênđộclập
đểthựchiện.
61
Hình3‐7:Quátrìnhthựchiệnlệnhtheonguyênlýpipeline
3.3.5 Harzard
Trongcơchếthựchiệnlệnhpipelinethểhiệnrõđượcưuđiểmtrongviệcthúcđẩyhiệu
suấtthựchiệnlệnh,tuynhiêncóthểxảyrahiệntượngthựcthisaidosựthi
ếuđồngbộ
vàphụthuộclẫnnhaugiữacáclệnhtrongnhómthựcthipipeline.
Hazarddữliệu
Hiệntượngharzardxảyrakhicósựphụthuộclẫngiữacáclệnhnằm
trongkhoảngxếp
chồngthựchiệncuốnchiếutheonguyênlýpipeline.Điềunàycóthểdễdànghìnhdung
khihaihoặcnhiềulệnhthựchiệnxếpchồngkhicónhucầuđọc
giátrịcủacùngmột
toántử.Dosựphụthuộcnhưvậynênkhiviếtchươngtrìnhchúngtaphảikiểmsoát
đượcthứtựchươngtrìnhmàcáclệnhsẽđượcthựchiệnnhưthế
nào.Mụcđíchcủaviệc
thựcthilàlàmsaođểhỗtrợđượccơchếthựchiệnsongsongvàtăngđượchiệusuất
62
thựcthichươngtrình.Việcpháthiệnvàtránhđượchiệntượnghazardlàcầnthiếtđể
đảmbảochươngtrìnhđượcthựcthiđúng.Tuỳtheonguyênnhângâyrahazardngười
taphânra3loạ
ihìnhchínhtuỳthuộcvàothứtựđọchoặcviếttruynhậplệnhcủacác
nhómlệnhphụthuộcnhautrongcơchếthựchiệnsongsong.
Xéthailệnhivàjtrongđólệnhiđược
thựchiệntrướclệnhjtrongchươngtrình.Hiện
tượngHazarddữliệucóthểxảyranhưsau:
‐RAW(readafterwrite):Đọcsaukhiviết
Khilệnhivàjđềucầnsửdụng
vàtraođổithôngtinvớicùngmộtgiátrịônhớ,trong
đólệnhicầnphảithựchiệnxongvàcậpnhậtgiátrịvàoônhớđórồilệnhjmớicóthể
đọ
cvàsửdụng.Nếulệnhichưathựchiệnxongmàlệnhjđãđọcgiátrịônhớđóthìsẽ
xảyrahiệntượngđượcgọilàhazarddữliệu.Lệnhjđọcthôngtin
từmộtônhớtrước
khilệnhikịpviếtvàovìvậylệnhjsẽchỉđọcđượcgiátrịc ũchứkhôngphảigiátrịmới
cầnphảisửdụng.Trongcơchếthựchiệ
npipeline5phânđoạnsẽgặpphảihiệntượng
hzarddữliệukhicómộtlệnhnạp(load)theosaumộtlệnhALUsốnguyênvàsửdụng
trựctiếpkếtquảnạp.
‐
WAW(writeafterwrite):Viếtsaukhiviết
Lệnhjviếtvàomộttoántửtrướckhilệnhiviếtvào.Màyêucầuthựcthiđúngchương
trìnhlàlệnhiphảiviếttrước
lệnhjvàgiátrịcuốicùnglưutrongtoántửphảidolệnhj
đưarachứkhôngphảilệnhi.Hiệntượngnàyđượcgọilàhazarddữliệukhicósựphụ
thuộcđầura
vànhiềulệnhcùngcónhucầutruynhậpviếtvàocùngmộtbiếnhaymột
ônhớ.
‐WAR(writeafterread):Viếtsaukhiđọc
jviếtvàotoántửđíchtrướckhinóđượcđọc
bởilệnhidođólệnhIsẽnhậnđượcgiátrị
sai.HiệntượngHazardnàyxuấthiệnkhicósựphụthuộctoánhạngtrongcácphép
tính
Hazarddosựphụthuộcđiềukhiể
n
Kiểuphụthuộccũngkhá phổbiếnlàdocấutrúcđiềukhiển.Sựphụthuộcđiềukhiển
đượcquyếtđịnhtrìnhtựthựcthicủamộtlệnhitheolệnhrẽnhánhđả
mbảosaochonó
đượcthực thiđúngnhưthứtựmongmuốn.Tấtcảcáclệnhngoạitrừkhốicơbảnđầu
tiêncủachươngtrìnhđềuđượcđiềukhiểntheocấutrúclệnh
rẽnhánhvàphảiđược
đảmbảođểthựcthiđúngtheothứtự.Mộtvídụđơngiảnnhấtvềsựphụthuộcđiều
khiển là sự phụ thuộcđiều khiển theo cấu trúc if…then…Phần
thực thi trong phần
“then”sẽphụthuộccâulệnhđiềukiệnif.Vídụđoạnmãchươngtrìnhminhhọanhư
sau:
if (p1) {
S1;
}
if (p2) {
S2;
}
63
Câulệnhđượcđiềukhiểnphụthuộcvàop1vàS2đượcđiềukhiểnphụthuộcp2chứ
khôngphảip1.
Nóichung,có2ràngbuộccóthểgiảthiếttrongsựphụthuộcđiềukhiể
n:
(1) Một lệnh thực hiện phụ được quyếtđịnh bởi một lệnhđiều khiển rẽ nhánh thì
khôngthểđượcphépchuyểnlêntrướccâulệnhthựchiệnkiểmtrađiềukiện.
Vídụ
chúngtakhôngthểđưalệnhtừphần
thenlêntrướcphầnif.
(2)Mộtlệnhthựchiệnđộclậpvàkhôngphụthuộcvàolệnhrẽnhánhkhôngthểđược
chuyểnvàokhuvựcsauphầnthựchiệncủanhánhthựchiệnphụthuộc.Víd
ụkhông
thểđưamộtlệnhlêntrướcphầnlệnh
ifvàchuyểnnóvàotrongphầnthen.
Sựphụthuộcđiềukhiểnphảiđượcđảmbảobởi2thuộctínhtrongcơchếpipelineđơn
giản.Thứ nhất,cáclệnhthựchiệntrongchươngtrìnhphảiđúngtheo trìnhtựđược
điề
ukhiểncủanó.Trìnhtựnàyphảiđượcđảmbảorằngmộtlệnhmàphảithựcthi
trướcmộtnhánhđiềukhiểnthìphảithựchiệntrướcnhánhđó.Thứhai,việc
pháthiện
rasựxungđộtvềđiềukhiển(controlhazard)sẽđảmbảorằngmộtlệnhmàđượcđiều
khiểnphụthuộcvàomộtnhánhthìkhôngđượcthựchiệnchừngnàohướng
thựchiện
củanhánhđórõràng.Bảođảmđượcsựphụthuộcđiềukhiểnlàcầnthiếtvàcũnglà
mộtcáchđơngiảnđểđảmbảođúngtrìnhtựthựchiệnchươngtrình.S
ựphụthuộc
điềukhiểnkhôngphảilàmộtsựhạnchếcơbảnvềkhảnăngthựcthichươngtrình.
Chúngtacóthểsẵnsàngthựcthithêmnhữnglệnhmàlẽrakhôngnên
đượcthựcthi
nếuchúngkhônggâyảnhhưởnggìđếntínhđúngđắncủachươngtrình,nếukhôngsự
xungđộtgâyrabởisựphụthuộcđiềukhiểncóthểxảyra.Sựphụthuộcvềđ
iềukhiển
khôngphảilà mộtthuộctínhkịchtínhbắtbuộcphảibảođảm.Thayvìđiềuđó,hai
thuộctínhkịchtínhchoviệclậptrìnhmộtcáchđúngđắnvàthường
đượcbảođảmlà
phảitránhđượcxungđộtbởicảsựphụthuộcvềdữliệuvàđiềukhiểnvàđóchínhlà
hànhvingoạilệcóthểxảyratrongluồngdữliệuthựcthi
chươngtrình.
3.4 Ngôn ngữ và môi trường phát triển
3.4.1 Ngôn ngữ
Mộttrongnhữngngônngữlậptrìnhcólẽphổcậprộngrãinhấthiệnnaylàngônngữ
C.SovớibấtkỳngônngữlậptrìnhnàokhácđangtồntạiCthựcsựphùh
ợpvàtrở
thànhmộtngônngữpháttriểncủahệnhúng.Điềunàykhôngphảilàcốhữuvàsẽtồn
tạimãi,nhưngtạithờiđiểmnàythìCcólẽlàmộtngônngữ
gầngũinhấtđểtrởthành
mộtchuẩnngônngữtrongthếgiớihệnhúng.Trongphầnnàychúngtasẽcùngtìm
hiểutạisaoClạitrởthànhmộtngônngữphổbiếnđếnvậyvàt
ạisaochúngtalựachọn
nónhưmộtngônngữminhhọachoviệclậptrìnhhệnhúng.
Sựthànhcôngvềpháttriểnphầnmềmthườnglànhờvàosựlựachọnngônngữphù
hợ
pnhấtchomộtdựánđặtra.Cầnphảitìmmộtngônngữđểcóthểđápứngđượcyêu
cầulậptrìnhchocácbộxửlýtừ8‐bitđến64‐bit ,trongcáchệthốngchỉcóhữu
hạnvề
64
bộnhớvàiKbytehoặcMbyte.Chotớinay,điềunàychỉcóClàthựcsựcóthểthỏamãn
vàphùhợpnhất.
RõràngCcómộtsốưuđiểmnổibậttiêubiểu
nhưkhánhỏvàdễdàngchoviệchọc,các
chươngtrìnhbiêndịchthườngkhásẵnchohầuhếtcácbộxửlýđangsửdụnghiệnnay,
vàcórấtnhiềungườiđãbiết
vàlàmchủđượcngônngữnàyrồi,haynóicáchkháccũng
đãđượcphổcậptừlâu.HơnnữaC cólợithếlàkhôngphụthuộcvàobộxửlýthựcthi
mãnguồn.Ngườilậ
ptrìnhchỉphảitậptrungchủyếuvàoviệcxâydựngthuậttoán,
ứngdụngvàthểhiệnbằngngônngữthânthiệnthayvìphảitìmhiểusâuvềkiếnthức
phầncứ
ng,cũng nhưrất nhiềucácưuđiểmnổibật kháccủa ngônngữ bậccao nói
chung.
CólẽmộtthếmạnhlớnnhấtcủaClàmộtngônngữbậccaomứcth
ấpnhất.Tứclàvới
ngônngữCchúngtavẫncóthểđiềukhiểnvàtruynhậptrựctiếpphầncứngkháthuận
tiệnmàkhônghềphảihysinhhayđánhđổibất
kỳmộtthếmạnhnàocủangônngữbậc
cao.Thựcchấtđâycũnglàmộttrongnhữngtiêuchíxâydựngcủanhữngngườisáng
lậprangônngữCmuốnhướngtớ
i.Thựctếđiềunàyđãđượcđềcậpđếnkhihainhà
sánglậprangônngữC,KernighanvàRitchieđãđưavàotrongphầngiớithiệucủa
cuốnsáchcủahọ“TheCProgrammingLanguage”nhưsau:
“Cisarelatively“lowlevel”language.Thischaracterizationisnotpejorative;itsimplymeans
thatCdealswiththesamesortofobjectsthatmostcomputersdo.Thesemaybecombinedand
movedaboutwiththearithmeticandlogicaloperatorsimplementedbyrealmachines…”
TấtnhiênlàC
khôngphảilàngônngữduynhấtchocácnhàlậptrìnhnhúng.Ítnhất
hiệnnayngườitacũngcóthểbiếttớingoàingônngữClàAssembly,C++,vàAda.
Trongnhữngbuổiđầupháttriể
nhệnhúngthìngônngữAssemblychủyếuđượcsử
dụngchocácvixửlýđích.Vớingônngữnàychophépngườilậptrìnhđiềukhiểnvà
kiểmsoáthoàntoànvixửlýcũngnhưphầnc
ứnghệthốngtrongviệcthựcthichương
trình.TuynhiênngônngữAssemblycónhiềunhượcđiểmmàcũngchínhlàlýdotại
sao hiện nay nó ítđược phổ cập và sử dụng.Đó là,
việc học và sử dụng ngôn ngữ
Assemblyrấtkhókhănvàđặcbiệtkhókhăntrongviệcpháttriểncácchươngtrìnhứng
dụnglớnphứctạp.Hiênnaynóchỉđượcsửdụng
chủyếunhưđiểmnốigiữangônngữ
bậccaovàbậcthấpvàđượcsửdụngkhicóyêucầuđặcbiệtvềhiệusuấtthựchiệnvà
tốiưuvềtốcđộmà
khôngthểđạtđượcbằngngônngữkhác.NgônngữAssemblychỉ
thựcsựphùhợpchonhữngngườicókinhnghiệmvàhiểubiếttốtvềcấutrúcphầncứng
đíchcũngnhưnguyênlýthự
chiệncủabộlệnhvàchípxửlý.
C++làmộtngônngữkếthừatừCđểnhằmvàocáclớpứngdụngvàtưduylậptrình
hướngđốitượngvàcũngbắtđầuchiếm
đượcsốlượnglớnquantâmtrongviệcứng
dụngchopháttriểnhệnhúng.TấtcảcácđặcđiểmcốtlõicủaCvẫnđượckếthừahoàn
toàntrongngônngữC++vàngoàiracònhỗ
trợkhảnăngmớivềtrừutượnghóadữliệu
vàphùhợpvớitưduylậptrìnhhiệnđại;hướngđốitượng.Tuynhiênđiềunàybịđánh
65
đổi bởi hiệu suất và thời gian thực thi dođó chỉ phù hợp với các dự án phát triển
chươngtrìnhlớnvàkhôngchịusứcéplớnvềthờigianthựcthi.
Adacũnglàmộtngônngữhướngđốitượngmặcdùnókhôngđượcphổcậprộngrãi
nhưC++.AdađượcxâydựngbởicơquanquốcphòngMỹđểphụcvụpháttriểncác
phầnm
ềmquânsựchuyêndụngđặcbiệt.Mặcdùcũngđãđượcchuẩnhóaquốctế
(Ada83vàAda95)nhưngnóvẫnkhôngđượcphổcậprộngrãingoàiviệcứngdụngchủ
yếutrongcáclĩ
nhvựcquânsựvàhàngkhôngvũtrụ.Vànócũngdầndầnbịmấtưu
thếvàsựphổcậptrongthờigiangầnđây,đâycũnglàmộtđiềuđángtiếcvìbảnthân
Adacũnglàmộtngônngữcónhiềuđặcđi ểmphùhợpchoviệcpháttriểnphầnmềm
hệnhúngthayvìphảisửdụngC++.
3.4.2 Biên dịch
Hình3‐8:Quátrìnhpháttriểnvàbiêndịchphầnmềmnhúng
Quátrìnhbiêndịch(Compiling)
Nhiệmvụchínhcủabộbiêndịchlàchuyểnđổichươngtrìnhđượcviếtbằngngônngữ
thânthiệnvớiconngườivídụnhưC,C++,…thànhtậpmãlệnht
ươngđươngcóthểđọc
vàhiểubởibộvixửlýđích.Theocáchhiểunàythìbảnchấtmộtbộhợpngữcũnglà
mộtbộbiêndịchđểchuyểnđổimột‐mộttừmột
dònglệnhhợpngữthànhmộtdạng
mãlệnh tươngđươngcho bộvi xửlýcó thểhiểu vàthựcthi.Chínhvìvậyđôi khi
ngườitavẫnnhầmhiểugiữakháiniệmb
ộhợpngữvàbộbiêndịch.Tuynhiênviệc
biêndịchcủabộhợpngữsẽđượcthựcthiđơngiảnhơnrấtnhiềusovớicácbộbiên
dịchchocácmãnguồnviết
bằngngônngữbậccaokhác.
Mỗimộtbộxửlýthườngcóriêngngônngữmáyvìvậycầnphảichọnlựamộtbộbiên
dịchphùhợpđểcóthểchuyểnđổichínhxácthành
dạngmãmáytươngứngvớib ộxử
lýđích.Đốivớicáchệthốngnhúng,bộbiêndịchlàmộtchươngtrìnhứngdụngluôn
66
đượcthựcthitrênmáychủ(môitrườngpháttriểnchươngtrình)vàcòncótêngọilàbộ
biêndịchchéo(cross‐compiler).Vìbộbiêndịchchạytrênmộtnềnphầncứngđểtạo
ra
mãchươngtrìnhchạytrênmôitrườngphầncứngkhác.Việcsửdụngbộbiêndịchchéo
nàylàmộtthànhphầnkhôngthểthiếutrongquátrìnhpháttriểnphầnmềmchohệ
nhúng.Các
bộbiêndịchchéothườngcóthểcấuhìnhđểthựcthiviệcchuyểnđổicho
nhiềunềnphầncứngkhácnhaumộtcáchlinhhoạt.Vàviệclựachọncấuhìnhbiêndịch
tươngứngvớicácnềnphầncứngđôikhicũngkháđộclậpvớichươngtrìnhứngdụng
củabộbiêndịch.
Kếtquảđầutiêncủaquátrìnhbiêndịchnhậnđượclà
mộtdạngmãlệnhđượcbiếttới
vớitêngọilàtệpđốitượng(objectfile).Nộidungcủatệpđốitượngnàycóthểđược
xemnhưlàmộtcấutrúcdữliệu
trunggianvàthườngđượcđịnhnghĩanhưm ộtđịnh
dạngchuẩnCOFF(CommonObjectFileFormat)hayđịnhdạngcủabộliênkếtmởrộng
ELF (Extended Linker Format)… Nếu sử dụng nhiều bộ biên
dịch cho các modul mã
nguồncủamộtchươngtrìnhlớnthìcầnphảiđảmbảorằngcáctệpđốitượngđượctạo
raphảicóchungmộtkiểuđịnhdạng.
Hầuh
ếtnộidungcủacáctệpđốitượngđềubắtđầubởimộtphầnheaderđểmôtảcác
phầntheosau.Mỗimộtphầnsẽchứamộthoặcnhiềukhốimãhoặc
dữliệunhưđược
sửdụngtrongtệpmãnguồn.Tuynhiêncáckhốiđóđượcnhómlạibởibộbiêndịchvào
trongcácphầnliênquan.Vídụnhưtấtcảcáckhốimãđượcnhómlại
vàotrongmột
phầnđượcgọilàtext,cácbiếntoàncụcđãđượckhởitạo(cùngcácgiátrịkhởitạocủa
chúng)vàotrongphầndữliệu,vàcácbiếntoàncụcchưa
đượckhởitạovàotrongphần
bss.
Cũngkháphổbiếnthườngcómộtbảngbiểutượngchứatrongnộidungcủatệpđối
tượng.Nóchứatênvàđịachỉcủatấ
tcảcácbiếnvàhàmđượcthamchiếutrongtệpmã
nguồn.Cácphầnchứatrongbảngnàykhôngphảilúcnàocũngđầyđủvìcómộtsố
biếnvàhàmđượcđịnhng hĩavàchứatrong
cáctệpmãnguồnkhác.Chínhvìvậycần
phảicóbộliênkếtđểthựcthixửlývấnđềnày.
Quátrìnhliênkết(Linking)
Tấtcảcáctệpđối tượngnhậnđượcsaub
ướcthựchiệnbiêndịchđầutiênđềuphải
đượctổhợplạitheomộtcáchđặcbiệttrướckhinóđượcnạpvàchạyởtrênmôitrường
phầncứngđích.Nhưđãthấyởtrên,
bảnthâncáctệpđốitượngcũngcóthểlàchưa
hoànthiệnvìvậybộliênkếtphảixửlýđểtổhợpcáctệpđốitượngđóvớinhauvà
hoànthiện nốtphầ
ncònkhuyếtchocácbiếnhoặchàmthamchiếu liênthônggiữacác
tệpmãnguồnđượcbiêndịchđộclập.
Kếtquảđầuracủabộliênkếtlàmộttệpđốitượngm
ớicóchứatấtcảmãvàdữliệu
trongtệpmãnguồnvàcùngkiểuđịnhdạngtệp.Nóthựcthiđượcđiềunàybằngcáchtổ
hợpmộtcáchtươngứngcácphần
text,dữliệuvàphầnbss…từcáctệpđầuvàovàtạo
ramộttệpđốitượngtheođịnhdạngmãmáythốngnhất.Trongqúatrìnhbộliênkết
thựchiệntổhợpcác
phầnnộidungtươngứngnócònthựchiệnthêmcảvấnđềhoàn
67
chỉnhcácđịachỉthamchiếucủacácbiếnvàhàmchưađượcđầyđủtrongbướcthực
hiệnbiêndịch.
Cácb ộliênkếtcóthểđượckíchhoạtthựchiệnđộclậpvới
bộbiêndịchvàcáctệpđối
tượngđượctạorabởibộbiêndịchđượccoinhưcácthambiếnvào.Đốivớicácứng
dụngnhúngnóthườngchứaphầnmãkhởitạođãđược
biêndịchcũngphảiđượcgộp
ởtrongdanhsáchthambiếnvàonày.
Nếucùngmộtbiểutượngđượckhaibáohơnm ộtlầnnằmtrongmộttệpđốitượngthì
bộ liên k
ết sẽ không thể xử lý. Nó sẽ kích hoạt cơ chế báo lỗiđểngười phát triển
chươngtrìnhxemxétlại.Hoặckhimộtbiểutượngkhôngthểtìmđượcđịachỉtham
chiếuthựctrongtoàn
bộcáctệpđốitượngthìbộliênkếtsẽc ốgắngtựgiảiquyếttheo
khảnăngchophépdựavàocácthôngtinvídụnhưchứatrongphầnmôtảcủathưviện
chuẩn.Đi
ều này cũng thường hoặc có thể gặp với trường hợp các hàm tham chiếu
trongchươngtrình.
Rấtđángtiếclàcáchàmthưviệnchuẩnthườngyêucầumộtvàithayđổi
trướckhinó
cóthểđượcsửdụngtrongchươngtrìnhứngdụngnhúng.Vấnđềởđâylàcácthưviện
chuẩncungcấpchocácbộcôngcụpháttriểnchỉdừngđếnkhảnăngđịnhdạngvà
tạo
ratệpđốitượng.Hơnnữachúngtacũngrấtítkhicóthểtruynhậpđượcvàomãnguồn
củacácthưviệnchuẩnđểcóthểtựthayđổi.Hiệnnaycũngcómột
sốnhàcungcấp
dịchvụphầnmềmhỗtrợcôngcụchuyểnđổihaythayđổithưviệnCchuẩnđểứng
dụng cho cácứng dụng nhúng, ví dụ như Cygnus. Gói phần mềm nàyđược gọi
là
newlibvàđượccungcấpmiễnphí.ChúngtacóthểtảivềtrangwebcủaCygnus.Nósẽ
hỗtrợchúngtagiảiquyếtvấnđềmàbộliênkếtcóth ểgặpphảikhichươngtrìnhs
ử
dụngcáchàmthuộcthưviệnCchuẩn.
Saukhiđãhợpnhấtthànhcôngtấtcảcácthànhphầnmãvàphầndữliệutươngứng
cũngnhưcácvấnđềvềthamchiếutới
cácbiểutượngchưađượcthựcthitrongquá
trìnhbiêndịchđơnlẻ,bộliênkếtsẽtạoramộtbảnsaođặcbiệtcủachươngtrìnhcó
khảnăngđịnhvịlại(relocatable).
Haynóicáchkhác,chươngtrìnhđượchoànthiện
ngoạitrừmộtđiều:Khôngcóđịachỉbộnhớnàochưađượcgánbêntrongcácphầnmã
vàdữliệu.Nếuchúngtakhôngphảilàđangpháttriể
nphầnmềmchohệnhúngthì
quátrìnhbiêndịchcóthểkếtthúctạiđây.Tuynhiên,vớihệnhúngngaycảhệthống
nhúngđãbaogồmcảhệđiềuhành chúngta vẫncầnphải
có mộtmã chươngtrình
(image)nhịphânđượcđịnhvịtuyệtđối.Thựctếnếucómộthệđiềuhànhthìphầnmã
vàdữ liệucũngthườnggộpcảvàobêntrongchươngtrình
cókhả năngđịnhvị lại.
Toànbộứngdụngnhúngbaogồmcảhệđiềuhànhthườngliênkếttĩnhvớinhauvà
thựchiệnnhưmộtmãchươngtrìnhnhịphânthốngnhất.
Quátrìnhđịnhvị(Locating)
Côngcụthựchiệnviệcchuyểnđổimộtchươngtrìnhcókhảnăngđịnhvịlạithànhmột
dạng mãchương trình nhị phâncó thể thực thiđược gọi là
bộđịnhvị. Nó sẽ đảm
nhiệmvaitròcủabướcđơngiảnnhấttrongcácbướcthực thibiêndịchnóichung.Thực
68
tếchúngtaphảitựlàmhầuhếtcôngviệccủabướcnàybằngcáchcungcấpthôngtinv ề
bộnhớđãđượcc ấuhìnhtrênnềnphầncứngmàchúngtađangpháttriểnvà
đóchính
làthamsốđầuvàochoviệcthựcthicủabộđịnhvị.Bộđịnhvịsẽsửdụngthôngtinnày
đểgáncácđịachỉvậtlýchomỗiphầnmãlệnhvàdữliệubêntrong
chươngtrìnhđược
thựcthimàcóthểđịnhvịlại.Tiếptheonósẽtạoramộttệpcóchứachươngtrìnhbộ
nhớnhịphânđểcóthểnạptrựctiếpvàobộnhớchươngtrình
trênnềnphầncứngthực
thi.
Trongnhiềutrườnghợpbộđịnhvịlàmộtchươngtrìnhkháđộclậpvớicácphầncông
cụkháctronghệthốngphầnmềmpháttriển.Tuynhiên
trongcácbộcôngcụpháttriển
GNUchứcnăngnàyđượctíchhợpluôntrongbộliênkết.Tuynhiênkhôngnênnhầm
lẫnvềchứcnăngcủachúngtrongquátrìnhthựcthibiêndịch.Thông
thườngchương
trìnhchạytrêncácmáytínhmụcđíchchungthìhệđiềuhànhsẽthựchiệnviệcchuyển
đổivàgánchínhxácđịachỉthựcchocácphầnmãvàdữliệutrongchương
trìnhứng
dụng,cònvớichươngtrìnhpháttriểnchạytrênhệnhúngthìviệcnàyphảiđượcthực
hiệnbởibộđịnhvị.Đâycũngchínhlàđiểmkhácbiệtcơbảnkhithực
hiệnbiêndịch
mộtchươngtrìnhứngdụngchohệnhúng.
Thôngtinvềbộnhớvậtlýcủahệthốngphầncứngpháttriểnmàcầnphảicungcấpcho
bộđịnhvịGNUphả
iđượcđịnhdạngtheokiểubiểudiễncủabộliênkết.Thôngtinnày
đôi khiđược s ử dụngđểđiều khiển một cách chính xác thứ tự trong các phần mã
chươngtrìnhvàdữliệu
bêntrongchươngtrìnhcóthểđịnhvịlại.Nhưngởđâychúng
tacầnphảithựchiệnnhiềuhơnthế,tứclàphảithiếtlậpchínhxáckhuvựccủamỗi
phầntrong
bộnhớ.
Sauđâylàmộtvídụminhhọacủamộttệpthôngtinliênkếtđượccungcấpchomột
nềnphầncứngnhúng,giảthiếtlàcó512KBRAMvà512KBROM.
MEMORY
{
ram : ORIGIN = 0x00000, LENGTH = 512K
rom : ORIGIN = 0x80000, LENGTH = 512K
}
SECTIONS
{
data ram : /* Initialized data. */
{
_DataStart = . ;
*(.data)
_DataEnd = . ;
} >rom
69
ĐoạnmãnàyđượccungcấpchochobộđịnhvịcủabộliênkếtGNUvềthôngtinbộ
nhớđãđượccấuhìnhtrênnềnmạchcứnghệnhúngđíchvàchỉracácphần
dữliệuvà
bsssẽđượcđịnhvịtrongRAM(bắtđầutạiđịachỉ0x00000)vàphầnmãchươngtrình
sẽđượcđịnhvịtrongROM(bắtđầutạiđịachỉ0x80000).Tuynhiêncácgiátrịkhởitạo
trong
cácđoạndữliệusẽđượcthựchiệnmộtphầntrongởROMbắtđầutừphầnđịnh
nghĩacủakhuvựcđịnhvịcuốicùngtrongmãchươngtrình.
Tấtcảcáctênbắtđầub
ởidấugạchdưới(“_”)làcácbiếncóthểđượcthamchiếutừbên
trongmãnguồn.Bộliênkếtsẽsửdụngcácbiểutượngđểxửlýcácthamchiếutrong
cáctệpđốitượng.
Vídụcóthểcómộtphầnchươngtrìnhứngdụngnhúng(thườnglà
thuộcphầnmãkhởitạochươngtrình)saochépcácgiátrịkhởitạocủacácbiếnđãđược
khởitạo
trongROMsangkhuvựcdữliệutrongRAM.Cácđịachỉbắtđầuvàkếtthúc
chohoạtđộngnàycóthểđượcthiếtlậpmộtcáchbiểutượngbởithamchiếutớicácbiến
sốnguyên_DataStartvà_DataEnd.
Kếtquảcủabướccuốicùngnàycủaquátrìnhbiêndịchlàmộtmãchươngtrìnhnhị
phâncóthểđượcnạptrựctiếpvàchạyđượctrênnềnphầncứnghệnhúngđích,
tứclà
đượcnạp vàobộ nhớchương trìnhcủa hệthốngđích.Trong vídụtrênmãchương
trìnhnhịphânđượctạoracódunglượngchínhxáclà1MB.Tuynhiênbởivìcácgiátrị
choph
ầndữliệuđượckhởi tạonằmtrongROMnênnửaphần thấp512KB củamã
chươngtrìnhnhịphânnàychỉchứagiátrịzerovàchỉcónửaphầncaođượcsửdụnglà
chủ
yếu.
bss : /* Uninitialized data. */
{
_BssStart = . ;
*(.bss)
_BssEnd = . ;
}
_BottomOfHeap = . ; /* The heap starts here. */
_TopOfStack = 0x80000; /* The stack ends here. */
text rom : /* The actual instructions. */
{
*(.text)
}
}
70
Hình3‐9:VídụvềmộtlưuđồpháttriểnphầnmềmchoDSPTMS320Cxx
3.4.3 Simulator
Simulatorlàmộtchươngtrìnhphầnmềmchophépngườipháttriểnmãchươngtrình
chạymôphỏngmộtchươngtrình viếtchomộtnền VXL/VĐK(nềnphầncứngđích)
trênmột
môitrườngphầncứngkhác(haycòngọilàmôitrườngpháttriển).Thựcchất
đólàquátrìnhmôphỏnghoạtđộngcủachươngtrìnhthựcthitheođúngnhưđiềukiện
thực
hiệncủamôitrườngđíchtrênmôitrườngpháttriển.
Sửdụng bộmôphỏngmã chươngtrình cóthể đượcchạythửtừngbướchoặctừng
phầnvàcóthểđượcchỉnhsửa
trựctiếpđểthửnghiệmcácgiảiphápkhácnhauchocác
bàitoánthựcthiphầnmềm.Tuynhiêncácbộmôphỏngkhônghỗtrợcácngắtthực và
cácthiếtbịngoạivị.
Bộmô
phỏngtrựctiếp(bộmôphỏngphầncứng)baogồmmộtthiếtbịphầncứngkết
nốitrựctiếpvớihệpháttriểnvàchophépthựcthiđểcóđượcphảnứ
nggiốngnhưbộ
xửlýđích.Bộmôphỏngtrựctiếptrênmạchcótấtcảcácchứcnăngcủamộtbộmô
71
phỏngphầnmềmđồngthờihỗtrợcảcácchứcnăngemulationchocáccổngvàoracủa
VĐK.
3.4.4 Emulator
Emulatorlàmộtthiếtbịphầncứngcókhảnăngthựchiệnnhưmộtnềnphầncứngđích.
Nócònđượcbiếttớinhưmộttêngọikháclàcộngcụpháttriểnth
ờigianthựcbởivìnó
chotaphảnứngvớicácsựkiệnnhưVĐKđíchthựcthi.CácbộEmulatorthườngcókèm
theo cảphầnchương trình giám sát(monitor program)đểcho phép ngườiphát
triển
chươngtrìnhchoVĐKđíchkiểmtranộidung,trạngtháicácthanhghivàcáckhuvực
bộnhớvàthiếtlậpcácđiểmdừngkhithựchiệnchạychươngtrình.
3.4.5 Thiết kế hệ thống bằng máy tính
Trongquátrìnhpháttriểnphầnmềmcầnphảiđượcthửnghiệm vớiđốitượngđiều
khiển.Tuỳthuộcvàotừngmôitrườngpháttriểnchúngtacóthểtiếnhànhtheomộtsố
cácphươngphápsau.
Môphỏngoffline
Tronghệthốngpháttriểnnàynềnphầncứngnhúngđíchđượcmôphỏngbằngmôhình
chạytrênPCvàđốitượngđiềukhiểncũnglàmôhìnhmôphỏngchạytrênPC.Vìvậ
y
quátrình pháttriểnthựcchấtlà quátrìnhchạymôphỏnghệthốngđượcthực hiện
hoàntoàntrênPC.Vớihệthốngnàykhôngthểthửnghiệmchocácsựkiệnđápứng
thời gian
thực vì thời gian của môphỏng khác với thờigiandiễnbiến thực của hệ
thống.
Hệthốngpháttriển(softwareintheloop)
72
HệthốngnàymôphỏngnềnphầncứngthựctrênPCchođápứnghànhvigiốngnhưvới
vimạchcứngthựcvàmôhìnhđốitượngđượcmôhìnhthựcthitrênPC.Loại
hệthống
nàycũngtươngtựnhưhệthốngmôphỏngofflinetuynhiêncó ưuđiểmhơnvìkhả
năngmôphỏnghànhvivàđápứngcủavimạchnhúngchínhxáchơnvàtrungthực
hơn.Vàcũngcómộtnhượcđiểmlàkhôngthửnghiệmđượcbàitoánthờigianthực.
Môphỏngthờigianthực(HardwareintheLoop)
Hệthốngnàysửdụngnềnphầncứngnhúngđíchthựcnhưngđốitượngthìchỉlàmô
hìnhthờigianthựckhôngphảiđốitượngthực.Ưuđiểmlàkhámềmdẻovà
thayđổi
cấuhìnhđơngiảntrongquátrìnhpháttriểnđểthửnghiệmvớicáchànhvikhácnhau
củađốitượng.Rútngắtvàđơngiảnhóacôngviệcxâydựngđốitượng.
Môhìnhphát
triểnthực
Hệthốngnàysửdụngnềnphầncứngnhúngđíchthựcvớiđốitượngthực.Tuynhiêncó
sựhỗtrợcủacôngcụpháttriểnđểcóthểcàiđặtvàthửnghiệmtrực tiếptrên
nềnphần
cứngthực.Đâylàmộtdạngmôhìnhchokếtquảtrungthựcvàchínhxácnhấttrongcác
dạnghệthốngpháttriểnnêutrên.Tuynhiêncácnềnphầncứngnày
thườngđượcphát
triểnvàhỗtrợbởicácnhàcungcấpđểcóthểtươngthíchvớicôngc ụphầnmềmkèm
theo.