Tải bản đầy đủ (.pdf) (13 trang)

Hệ thống điều khiển nhúng - Phần 3 pps

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (983.59 KB, 13 trang )


47
HầuhếtcácứngdụngđềucónhucầuvềbộnhớRAMonChipvìvậymộtsố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
(embeddedRAM). Cácphần tửRAMđóđược tổchứcthànhtừng khốivà tuỳ
thuộcvàokiếntrúccủaFPGAnósẽđượcphânbốlinhhoạt,thườnglàxungquanhcác
phầntửngoạivi hoặc
phânbốđềutrênbềmặtChip.Mộthìnhảnhminhhoạvềphân
bốRAMtrongkiếntrúcFPGAđượcmôtảnhưtrongHình2‐45.


Hình2‐45:HìnhảnhcủaChipcócáccộtlàcáckhốiRAMnhúng
■FPGAvớihạtnhânDSP
Thựcchấtđólàmộttổhợpnhằmtăngtốcvàkhảnăngtínhtoán.Kháiniệmnàycũng
tươngtựnhưcácbộđồngxửlýtoánhọctrongkiế
ntrúcmáytính.Nguyênlýlànhằm
sansẻvàgiảmbớttảisangFPGAđểthựcthicácchứcnăngtínhtoánlớn(thôngthường 
đòihỏithựchiệntrongnhiềunhịphoạtđộng
củaChipDSP)vàchophépChipDSPtập
trungthựchiệncácchứcnăngđơnnhịptốiưu.TổhợpFPGAvàDSPlàm ộtkiếntrúc
rấtlinhhoạtvàđặcbiệtcảithi
ệnđượchiệusuấtthựchiệnvàtăngtốchơnrấtnhiềuso
vớikiếntrúcnhiềuChipDPShoặcASICsđồngthờigiáthànhlạithấphơn.


Hình2‐46:SơđồnguyênlýmạchghépnốiVĐKvà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ướngchứcnănghoáđặcthù


9 Hạnchếvềtàinguyênbộnhớ
9 Yêucầuthờigianthực
3.2 Biểu diễn số và dữ liệu
 Đơnvịcơbảnnhấttrongbiểudiễnthôngtincủahệthốngsốđượcgọilàbit,
chínhlàkýhiệuviếttắtcủathuậtngữbi
narydigit.
 1964,IBMđãthiếtkếvàchếtạomáytínhsốsửdụngmộtnhóm8bitđểđánh
địachỉbộnhớvàđịnhnghĩarathuậtngữ8bit=1byte.
 Ngàynaysửdụngrộngrãi
thuậtngữwordlàmộttừdữliệudùngđểbiểudiễn
kíchthướcdữliệumàđượcxửlýmộtcáchhiệuquảnhấtđốivớimỗiloạikiến
trúcxửlýsốcụthể.
Chínhvìvậymộttừcóthểlà16bits,32bits,hoặc64bits…
 Mỗimộtbytecóthểđượcchiarathànhhainửa4bitvàđượcgọilàcácnibble.
Nibblechứacácbíttrọng
sốlớnđượcgọilànibblebậccao,vànibblechứacácbit
trọngsốnhỏđượcgọilànibblebậcthấp.
3.2.1 Các hệ thống cơ số
Trongcáchệthốngbiểudiễnsốhiệnnayđềuđượcbiểudiễnởdạngtổngquátlàtổng
luỹthừatheocơsố,vàđượcphânloạitheogiátrịcơsố.Mộtcáchtổngquát
mộthệbiểu
diễnsốcơsốbvàalàmộtsốnguyênnằmtrongkhoảnggiátrịcơsốbđượcbiểudiễ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ậpphân),c ơsốhexadecimal,cơsố8
Octal(bátphân).

Vídụvềbiểudiễncácgiátrịtrongcáchệcơsốkhácnhau:
243.51
10=2x10
2
+4x10
1
+3x10
0
+5x10
‐1
+1x10
‐2

212
3=2x3
2
+1x3
1
+2x3

0
=2310
10110
2=1x2
4
+0x2
3
+1x2
2
+1x2
1
+0x2
0
=2210

Hailoạicơsốbiểudiễnthôngdụngnhấthiệnnaychocáchệthốngxửlýsốlàcơsốnhị
phânvàcơsốmườisáu.
3.2.2 Số nguyên
Trongbiểudiễnsốcódấuđểphânbiệtsốdươngvàsốâmngườitasửdụngbittrọngsố
lớnnhấtquiướclàmbitdấuvàcácbitcònlạiđượcs ửdụngđểbiểudi
ễngiátrịđộlớn
củasố.Vídụmộttừ8bitđượcsửdụngđểbiểudiễngiátrị‐1sẽcódạngnhịphânlà
10000001,vàgiá trị+1sẽcódạng00000001.Nhưvậyvới
mộttừ8bitcóthểbiểudiễn

49
đượccácsốtrongphạmvitừ‐127đến+127.MộtcáchtổngquátmộttừNbitsẽbiểu
diễnđược‐2
(N‐1)
‐1đến+2

(N‐1)
‐1.

Chúýkhithựchiệncộnghaisốcódấu:
9 Nếuhais ốcùng dấuthìthựchiệnphépcộngphầnbiểudiễngiátrịvàsửdụngbit
dấucùngdấuv
ớihaisốđó.
9 Nếuhaisốkhácdấuthìkếtquảsẽnhậndấucủatoántửlớnhơn,vàthựchiện
phéptrừgiữatoántửcógiátrịlớnhơnvớitoán
tửbéhơn.

Vídụ1:Cộnghaisốcódấu01001111
2và001000112.
1111 ⇐ carries
 01001111  (79)
 0+0100011  +(35)
 01110010  (114)

Vídụ2:Cộnghaisốcódấu01001111
2và011000112.
Nhớcuốicùng 1
← 1111 ⇐carries
Tràn  0 1001111 (79)
bỏnhớ  0+ 1100011 +(99)
0 0110010 (50)

Vídụ3:Trừhaisốcódấu01001111
2và011000112.
  0112 ⇐borrows
 0 1100011  (99)

 0‐ 1001111 ‐(79)
 0 0010100  (20)

Vídụ4:Cộnghaisốkhácdấu10010011
2(‐19)và000011012(+13)
  012  ⇐borrows
 1 0010011  (‐19)
 0‐ 0001101 +(13)
 1 0000110 (‐6)

Thuậttoánthựchiệnphéptínhcódấu:

(1) Khaibáovàxóacácbiếnlưugiátrịvàdấuđểchuẩnbịthựchiệnphéptính.
(2) Kiểmtradấucủatoántửthứnhấtđểxemcóphảisốâmkhông.Nếulàsốâm
thì
thựchiệnbùdấuvàbùtoántử.Nếukhôngthìchuyểnquathựchiệnbước3.
(3) Kiểmtradấucủatoántửthứhaiđểxemcóphảisốâmkhông.Nếulàsốâmthì

thựchiệnbùdấuvàbùtoántử.Nếukhôngthìchuyểnsangthựchiệnbước4.
(4) Thựchiệnphépnhânhoặcchiavớicáctoántửvừaxửlý.
(5) Kiểmtradấ
u.Nếuzerothìcoinhưđãkếtthúc.Nếubằng‐1(0ffh)thìthựchiện
phéptínhbùhaivớikếtquảthuđượcvàkếtthúc.

50
Hiệnnayngườitasửdụnghaiquiướcbiểudiễns ốnguyênphânbiệttheothứtựcủa
bytetrọngsốtrongmộttừđượcbiểudiễn:
• Litteedian:bytetrọngsốnhỏnhấtđứngtrướcÆthuậnlợichophépcộnghoặc
trừvà
• Bigendian:bytetrọngsốlớnnhấtđứng trướcÆthuậnlợichophépnhânhoặc

chia.
Vídụxétmộtsốnhịphân4‐byte


Theoquiướcbiểudiễnlitteedianthìthứtựđịachỉlưutrongbộnhớsẽlà:
Địachỉcởsở+0=Byte0
Địachỉcơsở+1=Byte1
Địachỉcơsở+2=Byte2
Địa
chỉcơsở+3=Byte3
Vàtheoquiướcbiểudiễnsốbigediansẽlà:
Địachỉcởsở+0=Byte3
Địachỉcơsở+1=Byte2
Địachỉcơsở+2=Byte1
Địachỉcơsở+3=Byte0
3.2.3 Số dấu phảy tĩnh
Chúngtacóthểsửdụngmộtkýhiệudấuchấmảođểbiểudiễnmộtsốthực.D ấuchấm
ảođượcsửdụngtrongtừdữliệudùngđểphânbiệtvàngăncáchgiữa
phầnbiểudiễn
giátrịnguyêncủadữliệuvàmộtphầnlẻthậpphân.Vídụvềmộttừ8‐bitbiểudiễnsố
dấuphảyđộngđượcchỉranhưtrongHình3‐1.Với
cáchbiểudiễnnày,giátrịthựccủa
sốđượctínhnhư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ình3‐1:Địnhdạngbiểudiễnsốdấuphảytĩnh8bit
Nhượcđiểmcủaphươngphápbiểudiễnsốdấuphảytĩnhlàvùngbiểudiễnsốnguyên
bịhạnchếbởidấuphảytĩnhđượcgáncốđịnh.Điềunàydễxảyra
hiệntượngtrànsố
khithựchiệncácphépnhânhaisốlớn.

51
3.2.4 Số dấu phảy động
Phươngphápbiểudiễnsốchínhxácvàlinhhoạtđượcsửdụngrộngrãihiệnnaylàhệ
thốngbiểudiễnsốdấuphảyđộng.Đâycũnglàmộtphươngphápbiểudiễn
sốkhoa
họcbaogồm2phần:phầnbiểudiễnlưutrữsốmantissavàmộtphầnlưutrữbiểudiễn
sốexponent.Vídụtronghệcơsốthậpphân,mộtsốnguyênbằng
5cóthểđượcbiểu
diễnhoặclà
1
0.5 10⋅ ,
1
50 10


⋅ ,ho ặc
2
0.05 10⋅ ,…Trongmáytínhsốhoặchệthốngsốnói
chung,cácsốdấuphảyđộngnhịphânthườngđượcbiểudiễndạng

2
E
NM=⋅
 (1.2)
Trongđó,Mlàphầngiátrịsốmantissa,ElàphầnlũythừacủasốN.Mthườnglàcác
giátrịlẻmàphầnthậpphâncủanóthườngnằmtrongkhoảng
0.5 1M≤≤
.

Hình3‐2môtảbiểudiễnmộtsốdấuphảyđộngcủatừ8bitgồm5bitbiểudiễnphầnsố
cónghĩamantissa,và3bitbiểudiễnphầnlũythừ
a.Vìcácphầnmantissavàlũythừa
đềucóthểnhậncácgiátrịâmvìvậycácbitđầutiêncủacácphầngiátrịđóđềucóthể
đượcsửdụngđểbiểudiễndấukhic
ầnthiết.

Hình3‐2:Biểudiễndấuphảyđộng8bít
TrongmộtsốVXL,VĐKdođộrộngtừnhịphânnhỏnêncóthểsửdụng2từđểbiểu
diễnmộtsốdấuphảyđộng.Một từsẽdùngđểbiểudiễngiátrịmantissa,vàmộtphầ
n
biểudiễngiátrịexponent.
Nếuphầnmantissađượcchuẩnhóathànhmộtsốlẻcógiátrịtrongkhoảng
0.5 1M


≤ 
thìbitđầutiênsaubitdấuthườnglàmộtvàsẽcómộtdấuphảynhịphânẩnngaysau 
bitdấu.
PhầnbiểudiễnexponentEsẽquyếtđịnhvịtrícủadấuphảyđộ
ngsẽdịchsangtrái(E>0)
haysangphải(E<0)baonhiêuvịtrí.Vídụbiểudiễnmộtsốthậpphân6.5bằngmộttừ
8bitdấuphảyđộngnhưsau:

2
11
3
.1101 2
11 1
26.5
2416
N =⋅
⎡⎤
=++ =
⎢⎥
⎣⎦

Trongtrườnghợpnàyphầnmantissagồm4bitvàphầnexponentgồm3bit.Nếutadịch
dấuphảysangphải3vịtríbitthìchúngtasẽcómộtsốnhịphândấuphả
yđộngbiểu
diễnđượcsẽlà110.1.
Tổngquáthóatrongtrườnghợpmộtsốnhịphândấuphảyđộngnbitgồmmbitbiểu
diễnphầnmantissavàebitbiểudiễnphần
exponentthìgiátrịcủasốlớnnhấtcóthểbiểu
diễnđượcsẽlà


1
1(21)
max
(1 2 )2
e
m
N

−+ −
=−  (1.3)
Vàsốdươngnhỏnhấtcóthểbiểudiễnlà
52

1
(2 1)
min
0.5 2
e
N

−−
=⋅  (1.4)
TheotiêuchuẩnIEEE754và854có2địnhdạngchínhchosốdấuphảyđộnglàsốthực
dài(long)vàsốthựcngắn(short)chúngkhácnhauvềdảibiểudiễnvàđộlớn
lưutrữ
yêucầu.Theochuẩnnày,sốthựcdàiđượcđịnhdạng8bytebaogồm1bitdấu,11bit
exponentvà53bitlưugiátrịsốcónghĩa.Mộtsốthựcngắnđượcđịnhd
ạng4bytebao
gồm1bitdấu,8bitlũythừavà24bitlưugiátrịs ốcónghĩa.Mộtsốthựcngắncóthể
biểudiễnvàxửlýđượcsốcógiátrịnằm

trongdải10
38
to10
‐38
vàsốthựcdàicóthểbiểu
diễnvàxửlýđượcsốcógiátrịthuộcdải10
308
to10
‐308
.Đểbiểudiễnmộtgiátrịtương
đươngnhưvậybằngsốdấuphảytĩnhthìcầntới256bithay32bytedữliệu.
3.2.5 Một số phép tính cơ bản
 Thựchiệnphépnhân
VìtrongcácVĐKnhúngthườngkhônghỗtrợcácphépnhânnhiềubyte.Côngviệcnày
phảiđượcthựchiệnbởingườipháttriểnchươngtrìnhvàthểhiệndưới
dạngmộtthuật
toándựatrêncácphéptoáncósẵnápdụngchosốnhịphânlàcộng/trừvàdịch.Đểcó
mộtsựhiểubiếtrõrànghơnvềthuậttoánthựchiệnphép
nhân,chúngtaxétmộtvídụ
vềmộtphéptínhnhânhaisốnhịphântổngquátnhư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ênlýthựchiệnphépnhâncũnggiốngnhưtathựchiệnphépnhânhaiđathức.
Trongtrườnghợpnhânhaisốnhịphânthìmỗiphầntửlàmộtbit,bytehoặctừ.Ví
dụ
cụthểvớihaisốnhịphân4bittathuđượcphépnhânthựchiệnnhư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ậttoánthựchiệnphépnhân32bittheotrìnhtựsau:
(1) Cấpphátvùngnhớđủlớnđểlưusốđượcnhân32bitvàcóthểthựchiệnphép
dịchtrái32lần.Đặtgiátrịkhởit
ạochobộđếmbitbằng32vàxóathanhghi
haybiếnlưugiữkếtquảphépnhân.(Chúý:Sốlượngbitcầnđểlưugiátrịkết
quảphảibằngtổngsốlượngbitcầnđể
lưucácsốhạngphépnhân)
(2) Dịchsốnhânsangphảimộtvịtríbitvàkiểmtracờnhớ.Nếukhôngcócờnhớ
thìtiếptụcthựchiệnbước3.Nếu xuấthi

ệncờnhớthìcộngthêmvàobiếnlưu
kếtquảhiệntạicủaphépnhânmộtgiátrịbằnggiátrịcủasốđược nhân.

53
(3) Dịchsốđượcnhânsangtráimộtvịtríbitvàgiảmbộđếmdịchđimột.Kiểm
traxemgiátrịcủabộđếmdịchcóbằngkhôngkhông?Nếubằngkhôngthì
thựchiện
tiếpbước4,cònkhôngthìquaytrởlạithựchiệnbước2.
(4) Kếtquảcuốicùngcủaphépnhânđượclưutrongthanhghibiếnkếtquả.

Vídụphépnhântừnhịphân4
bit1100x1101

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ựcthithuậttoánthựchiệnphépnhânsốnguyênkhôngdấubằngngônngữC/C++:










 Thựchiệnphépchia
Phépchiacóthểđượcthựchiệnbằngcáchchuyểnđổithànhphépnhânvà
phépdịch.
Vídụmuốnthựchiệnphépchia5tronghệthậpphânchúngtacóthểthựchiệnbởimột
phépnhân2vàdịchdấuphảycủakếtquảthuđược sang trái
mộtđơnvị.Mộtcách
tổngquátcóthểthựchiệnchuyểnđổimộtphépchiatươngđươngnhưsau:
long product = 0;
while (multipier != 0){
if (multiplier & 1){
product += multiplicand;
}
multiplier >> =1;
multiplicand <<= 1;

}
54

x
nx
aan
=

Đốivớiphépchianhịphânthìnsẽđượcchọnlàmộtsốlũythừacủa2vàphảilớnhơn
a.

Thuậttoánthựchiệnphépchiacóthểđượcthựcthibởiphép
dịch,cộngvàtrừnhưsau:
(1) Nạpbiếnlưugiátrịthươngsốbằnggiátrịcủasốbịchia;sốbướcdịchcầnthực
hiệnbằngsốbitlưusốbịchia.
(2)
Dịchtráibiếnlưugiátrịthươngsốvàophầnbiếnlưugiátrịdưcủaphépchia.
(3) Sosánhsốdưvớisốchia.Nếusốdưlớnhơnhoặcbằngsốchiathìth
ựchiện
phéptrừsốdưđimộtgiátrịbằnggiátrịs ốchia.Nếukhôngthìchuyểnsang
thựchiệnbướctiếptheo.
(4) Giảmbiếnlưugiátrịsốlầnlặpvàkiể
mtraxemnóđãbằngkhôngchưa.Nếu
chưabằngkhôngthìquaytrởlạibước2thực hiệntiếp,cònnếubằngkhôngthì 
giátrịcủaphépchiađượclưutrongônhớch
ứasốdưvàthươngsố.

ThựcthithuậttoánbằngngônngữC/C++














Trướckhithựchiệnphépchiayêucầucầnphảikiểmtralỗichiakhôngcóthểxảyra.
Thu
ậttoánthựchiệnphépchiachủyếudựatrênphépdịchvàphéptrừ.Sốbịchiasẽ
dịchsangtráivàlưuvàomộtbiến,phầndưsẽđượcsosánhvớisốchia.Nếu
phầndư
bằnghoặclớnhơnsốchiathìphầndưsẽđượctrừđimộtgiátrịbằngsốchiavàsốbị
chiasẽđượccộngthêmmột vàdịchsangtrái mộtvịtríbitvà
đóchínhđượcgọilà
thươngsố.Quátrìnhnàyđượclặplạivàtiếptụcchođếnkhisốlầndịchbằngđúngsố
bitcủatừlưusốbịchia.

Cácbiếnđượcsửd
ụngtrongquátrìnhthựchiệnphépchiabaogồm5biếnsố:sốbị
chia,sốchia,thươngsố,sốdưvàsốlầndịch.Trongquátrìnhthựchiệnthìsốbịchia,
thươngsố,
vàsốdưcùngchiasẻchungmộtvùngônhớ.Sốdưvàsốbịchiasẽthuộc
cùngmộttừlớn.Sốbịchianằmtrongphầntừtrọngsốthấpvàsốdưsẽnằmtrong
phần
từtrọngsốcao.Saukhithựchiệnxongphépchiathìsốbịchiasẽđượcdịchtoàn

bộsangtráivàophầnbiếnsốdưvàđượcthaythếbằngthươngsố.Kếtquảcònlạithu
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
đượcchỉcònlàsốdưvàthươngsố.Hìnhảnhvềbộnhớlưucácbiếnsốthựchiệntrong
thuậttoánnàyđượcminhhoạnhưtrongHình3‐3.

Hình3‐3:Thựchiệnphépchia
3.3 Tập lệnh
3.3.1 Cấu trúc tập lệnh CISC và RISC
HầuhếtcácviđiềukhiểnvàVXLnhúngcócấutrúcđượcpháttriểndựatheokiếntrúc
máytínhtậplệnhphứchợpCISC(ComplexInstructionSetComputer).CISClàmộtcấu
trúcx
ửlýcáclệnhphứchợp,tứclàmộtlệnhphứchợpsẽbaogồmmộtvàilệ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ươngtrìnhtừbộnhớ.Điềunàyrấtcóýnghĩavớicáckiếntrúcthiếtkếxửlýtínhtoán
theokiểutuầntự.Lýdochosựrađờicủatậplệnhphứch
ợpnhằmgiảmthiểudung
lượngbộnhớcầnthiếtđểlưugiữchươngtrìnhthựchiện,vàsẽgiảmđượcgiáthànhvề
56

bộnhớcầncungcấpchoCPU.Cáclệnhcànggọnvàphựchợpthìsẽcầncàngítkhông
gianbộnhớchươngtrình.Kiếntrúctậplệnhphứchợpsửdụngcáclệnh
vớiđộdàibiến
đổituỳthuộcvàođộphứchợpcủacáclệnhtừđơngiảnđếnphứctạp.Trongđósẽcó
mộtsốlượnglớncáclệnhcóthểtruynhậptrựcti
ếpbộnhớ.Vìvậyvớikiếntrúctập
lệnhphứchợpchúngtasẽcóđượcmộttậplệnhđadạngphứchợp,gọn,vớiđộdài
lệnhthayđổivàdẫnđế
nchukỳthựchiệnlệnhcũngthayđổituỳtheođộphứchợp
trongtừnglệnh.Mộtvàilệnhphứchợp,đặcbiệtlàcáclệnhtruynhậpbộnhớcầntới
vàich
ụcchukỳđểthựchiện.TrongmộtsốtrườnghợpcácnhàthiếtkếVXLthấyrằng
cầnphảigiảmchukỳnhịplệnhđểcóđủthờigianchocáclệnhhoànthànhđiềunày
cũngdẫnđếnthờigianthựchiệnbịkéodàihơn.

MộtsốVĐKđượcpháttriểntheokiếntrúcmáytínhtậplệnhrútgọnRISC(Reduced
InstructionSetComputer).RISCphùhợpvới
cácthiếtkếkiếntrúcxửlýcáclệnhđơn.
Thuậtngữ“rútgọn”(reduced)đôikhibịhiểukhôngth ậtchínhxáctheonghĩađencủa
nóthựcchấtýtưởnggốcxuấtphát
từkhảnăngcungcấpmộttậplệnhtốithiểuđểthực
hiệntấtcảcáchoạtđộngchínhnhư:chuyểndữliệu,cáchoạtđộngALUvàrẽnhánh
điềukhiểnchương
trình.Chỉcócáclệnhnạp(load),lữutrữ(store)làđượcphéptruy
nhậptrựctiếpbộnhớ.
B‐1:SosánhđặcđiểmcủaCISCvàRISC
CISC RISC
Bấtkỳlệnhnàocũngcóthểtham
chiếutớibộnhớ
Chỉ có các lệnh Nạp (Load)

hoặc Lưu trữ (Store) là có thể
thamchiếutớibộnhớ
Tồntạinhiềulệnhvàkiểuđịachỉ Tồntạiítlệnhvàkiểuđịachỉ
Khuôndạnglệnhđadạng Khuôndạnglệnhcốđịnh
Chỉcómộttậpthanhghi Cónhiềutậpthanhghi
Các lệnh thực hiện trong nhiều
nhịpchukỳ
Các lệnh thực hiện trong một
nhịpchukỳ
Có một chương trình nhỏ để
thôngdịchlệnh
Lệnhđược thực hiện trực tiếp
ngaybởiphầncứng
Chương trình thông dịch lệnh
phứctạp
Chương trình biên dịch mã
nguồnphứctạp
Khônghỗtrợcơchếpipeline Hỗtrợcơchếpipeline
Kíchthướcmãchươngtrìnhnhỏ
gọn
Kíchthướcmãchươngtrìnhlớn

57
3.3.2 Định dạng lệnh

Hình3‐4:ĐịnhdạnglệnhMIPS


Hình3‐5:Phânloạicácphépthựcthilệnh
3.3.3 Các kiểu truyền địa chỉ toán tử lệnh

Cáckiểuđánh/truyềnđịachỉchophépchúngtachỉra/truyềntoántửthamgiatrong
cáclệnhthựcthi.Kiểuđịachỉcóthểchỉralàm ộthằngsố,môtthanhghihoặcmộtkhu
vựcc
ụthểtrongbộnhớ.Mộtsốkiểuđánhđịachỉchophépsửdụngđịachỉngắnvà
mộtsốloạithìchophépchúngtaxácđịnhkhuvựcchứatoántửlệnh,vàthườngđược
58
gọilàđịachỉhiệudụngcủatoántửvàthườnglàđộng.Chúngtasẽxétmộtsốloạihình
đánhđịachỉcơbảnhiệnđangđượcsửdụngrộngrãitrongcơchếthực
hiệnlệnh.

Đánhđịachỉtứcthì(ImmediateAddressing)
Phươngphápnàychophéptruyềngiátrịtoántửlệnhmộtcáchtứcthìnhưmộtphần
củacâulệnhđượcthựcthi.Vídụ
nếusửdụngkiểuđánhđịachỉtứcthờichocâulệnh
Load0x0008thìgiátrị0x0008sẽđượcnạpngayvàoAC.Trườngbitthườngdùngđể
chứatoántửlệnhsẽchứagiátrịthựcc
ủatoántửchứkhôngphảiđịachỉcủatoántử
cầntruyềncholệnhthựcthi.Kiểuđịachỉtứcthờichophépthựcthilệnhrấtnhanhvì
khôngphảithựchiệntruy
xuấtbộnhớđểnạpgiátrịtoántửmàgiátrịtoántửđãđược
gộpnhưmộtphầntrongcâulệnhvàcóthểthựcthingay.Vìtoántửthamgianhưmột
phầncốđịnhcủachương
trìnhvìvậykiểuđánhđịachỉnàychỉphùhợpvớicáctoántử
hằngvàbiếttrướctạithờiđiểmthựchiệnchươngtrình,hayđãxácđịnhtạithờiđiểm
biên
dịchchươngtrình.

Đánhđịachỉtrựctiếp(DirectAddressing)
Phươngphápnàychophéptruyềntoántửlệnhthôngquađịachỉtrựctiếpchứatoántử
đótrongbộnhớ.Vídụnếus

ửdụngcơchếđánhđịachỉtoántửtrựctiếpthìtrongcâu
lệnhLoad0x0008sẽđượchiểulàdữliệuhaytoántửđượcnạptrongcâulệnhnàynằm
trongbộnhớtạiđịachỉ0x0008.Cơ
chếđánhđịachỉtrựctiếpcũngthuộcloạihìnhkhá
nhanhmặcdùkhôngnhanhđượcnhưcơchếtruyềnđịachỉtứcthờinhưngđộmềm
dẻocaohơnvìđịachỉcủatoántửkhông
nằmtrongphầnmãlệnhvàgiátrịcóthểthay
đổitrongquátrìnhthựcthichươngtrình.

Đánhđịachỉthanhghi(RegisterAddressing)
Trongcáchđánhđịachỉvàtruyềntoántửnàythìtoántửkhôngnằ
mtrongbộnhớnhư
trườnghợpđánhđịachỉtrựctiếpmànằmtạichínhtrongthanhghi.Khitoántửđã
đượcnạpvàothanhghithìviệcthựchiệncóthểrấtnhanhvìtốcđộ
truyxuấtthanhghi
nhanhhơnsovớibộnhớ.Nhưngsốlượngthanhghichỉcóhạnvàphảiđượcchiasẻ
trongquátrìnhthựchiệnchươngtrìnhvìvậycáctoántửphảiđượcn
ạpvàothanhghi
trướckhinóđượcthựcthi.

Đánhđịachỉgiántiếp(IndirectAddressing)
Trongphươngpháptruyềntoántửnày,trườngtoántửtrongcâulệnhđượcsửdụngđể
thamchiếutớimột
contrỏnằmtrongbộnhớđểtrỏtớiđịachỉhiệudụngcủatoántử.
Cơchếtruyềnnàycóthểnóilàmềmdẻonhấtsovớicáccơchếtruyềnđịachỉkhác
trongquátrình
thựcthichươngtrình.Vídụnếuápdụngcơchếtruyềnđịachỉgiántiếp
trongcâulệnhLoad0x0008thìsẽđượchiểulàgiátrịdữliệucóđịachỉtại0x0008thực
chấtlàch
ứađịachỉhiệudụngcủatoántửcầntruyềnchocâulệnh.Giảthiếttạivịtríô

nhớ0x0008đangch ứa giátrị 0x02A0thì0x02A0chínhlà giátrịthựccủatoán tửsẽ
đượcn
ạpvàoAC.Mộtbiếnthểkháccũngcóthểthựchiệntheocơchếnàylàtruyền
thamchiếutớicontrỏnằmtrongkhuvựcthanhghi.Cơchếnàycònđượcbiếttớivới
têngọilàđánhđịachỉgiántiếpthanhghi.Vídụm ộtcâulệnhLoadR1sửdụngc ơchế

59
truyềnđịachỉgiántiếpthanhghithìchúngtacóthểdễdàngthôngdịchđượctoántử
truyềntrongcâulệnhnàycóđịachỉhiệudụngnằmtrongthanhghiR1.

Cáchđánhđịachỉcơsở
vàchỉsố(IndexedandBasedAddressing)
Trongcơchếnàyngườitasửdụngmộtthanhghiđểchứaoffset(độchênhlệchtương
đối)màsẽđượccộngvớitoántửđểtạoramộtđịachỉhiệu
dụng.Vídụ,nếutoántửX
củalệnhLoadXđượcđánhđịachỉtheocơchếđịachỉchỉsốvàthanhghiR1làthanh
ghichứachỉsốvàcógiátrịlà1thìđịachỉhiệudụ
ngcủatoántửthựcchấtsẽlàX+1.Cơ
chếđánhđịachỉcơsởcũnggiốngnhưvậyngoạitrừmộtđiềulàthayvìsửdụngthanh
ghiđịachỉoffsetthìởđâysửdụngthanhghi
địachỉcơsở.Vềmặtlýthuyếtsựkhác
nhaugiữahaicơchếthamchiếu địachỉnàylàchúngđượcsửdụngthếnàochứkhông
phảicáctoántửđượctínhtoánthểnào.Mộtthanhghichỉ
sốsẽlưuchỉsốmàsẽđược
sửdụngnhưmộtoffsetsovớiđịachỉđượcđưaratrongtrườngđịachỉcủalệnhthực
thi.Thanhghic ơsởlưumộtđịachỉcơsởvàtrường
địachỉtrongcâulệnhthựcthisẽ
lưugiátrịdịchchuyểntừđịachỉnày.Haicơchếthamchiếuđịachỉnàyrấthữuích
trongviệctruyxuấtvớicácphầntửkiểu
mảng.Tuỳthuộcvàothiếtkếtậplệnhcác

thanhghimụcđíchchungthườnghayđượcsửdụngtrongcơchếđánhđịachỉnày.

Đánhđịachỉngănxếp(StackAddressing)
Trongcơchếtruyềnđị
achỉnàythìtoántửnhậnđượctừđỉnhngănxếp.Thayvìsử
dụngthanhghimục đíchchunghayônhớkiếntrúcdựatrênngănxếplưucáctoántử
trênđỉnhcủangănx
ếp,vàcóthểtruyxuấtvớiCPU.Kiếntrúcnàykhôngchỉhiệuquả
trongviệclưugiữcácgiátrịtrunggiantrongcácphéptínhphứctạpmàcòncungcấp
mộtphươngpháphiệu
quảtrongviệctruyềncácthamsốtrongcáclờigọihàmcũng
nhưđểlưucấtcáccấutrúcdữliệucụcbộvàđịnhnghĩaraphạmvitồntạicủacácbiến

cáchàmcon.Trongcáccấutrúclệnhtruyềntoántửdựatrênngănxếp,hầuhếtcác
lệnhchỉbaogồmphầnmã,tuynhiêncũngcómộtsốlệnhđặcbiệtchỉcó
mộttoántửví
dụnhưlệnhcấtvào(push)hoặclấyra(pop)từngănxếp.Chỉcómộtsốlệnhyêucầuhai
toántửthìhaigiátrịchứatrong2ônhớtrênđỉnh
ngănxếpsẽđượcsửdụng.Vídụ
nhưlệnhAdd,CPUlấyrakhỏingănxếphaiphầntửn ằmtrênđỉnhrồithựchiệnphép
cộngvàsauđólưukếtquả
trởlạiđỉnhngănxếp.

Cáccáchđánhđịachỉkhác
Córấtnhiềubiếnthểtạobởicáccơchếđánhđịachỉgiớithiệuởtrên.Đólàsựtổhợp
trongviệctạora
hoặcxácđịnhđịachỉhiệudụngcủato ántửtruyềncholệnhthựcthi.
Vídụnhưcơchếđánhđịachỉchỉsốgiántiếpsửdụngđồngthờicảhaicơch ếđánhđịa
chỉđồngthời,
tươngtựnhưvậycũngcócơchếđánhđịachỉcơsở/offset…Cũngcómột

sốcơchếtựđộngtănghoặcgiảmthanhghisửdụngtronglệnhđangthựcthinhờvậy
màcó
thểgiảmđượcđộlớncủamãchươngtrìnhđặcbiệtphùhợpchocácứngdụ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ấtnhanh.RISC sử dụng kỹthuật
pipelineđểtăngcườngtốcđộxửlýcáclệnhđồngthờinhờvàokhảnăngthựchiện
xếp
chồngcuốnchiếuliêntụccáclệnhtheocácphânđoạnthựchiệnlệnh.Vídụmộtlệnhcó
thểđượcđọctừbộnhớtrongkhimộtlệnhkhácđangđượcgiảimãđể
chuẩnbịđưavào
xửlývàmộtlệnhkhácthìđangđượcthựchiện.CũngcómộtsốVĐKcótêngọilàmáy
tínhtậplệnhđặcbiệtSISC(SpecificInstructionSetComputer)vìchúngđược
pháttriển
dựatrêntậplệnhđượcthiếtkếđặcchủngchomụcđíchđiềukhiển.


Hình3‐6:Nguyênlýthựchiệnpipeline
Pipelineđượcthựchiệndựatrênnguyênlýxếpchồngcuốnchiếucácphânđoạntrong
mỗimộtlệnh. Thôngthườngmỗi mộtlệnhđượcchia ralàmnhiềuphânđoạnthực
hi
ện,phổbiếnhiệnnaylà5phânđoạntuầntựnhưsau:
(1) Trỏlệnh(InstructionFetch):Thựchiệntrỏtớilệnhthựchiệnbằngcáchđọcđịa
chỉlệnhtừthanhghicontrỏ
lệnh(PC),đọclệnhđóratừbộnhớchươngtrìnhvà
tínhtoánrồinạpgiátrịmớivàotrongthanhghicontrỏlệnhđểtrỏtớilệnhsẽ
thựcthitiếptheo.
(2) Giảimãlệnh
(Decode):Thựchiệnthôngdịchvàchuyểnđổimãlệnhthànhdạng

mãđểALUcóthểhiểuvàchuẩnbịthựcthi.Quátrìnhnàythựcchấtlàquátrình
đọcvàchuyểnđổinộidung
trongcácthanhghichươngtrình.
(3) Thựchiệnl ệnh(Execute):ALUthựcthilệnhvừađượcgiảimã.
(4) Truynhậpbộnhớdữliệu(Memory):Đọcrahoặcviếtvàobộnhớdữliệ
unếu
lệnhthựchiệncónhucầunày.
(5) Viếttrởlại(Writeback):Hoànthànhvàcậpnhậtnộidungcácthanhghi.

Chúngtacầnphânbiệtc ơchếpipelinevàcơchếthự
chiệnsongsongmặcdùcảhaiđều
nhằmđápứngyêucầuthựcthicạnhtranhvàtăngtốcđộthựcthi. Cơchếpipelinegiải
quyếtvầnđềcạnhtranhvàtăngtốcđộthực
hiệnbằngcáchchianhỏtínhtoánthành
cácbướcnhỏtrongkhiđócơchếsongsongsẽsửdụngnhiềunguồntàinguyênđộclập
đểthựchiện.

61

Hình3‐7:Quátrìnhthựchiệnlệnhtheonguyênlýpipeline
3.3.5 Harzard
Trongcơchếthựchiệnlệnhpipelinethểhiệnrõđượcưuđiểmtrongviệcthúcđẩyhiệu
suấtthựchiệnlệnh,tuynhiêncóthểxảyrahiệntượngthựcthisaidosựthi
ếuđồngbộ
vàphụthuộclẫnnhaugiữacáclệnhtrongnhómthựcthipipeline.

 Hazarddữliệu
Hiệntượngharzardxảyrakhicósựphụthuộclẫngiữacáclệnhnằm
trongkhoảngxếp
chồngthựchiệncuốnchiếutheonguyênlýpipeline.Điềunàycóthểdễdànghìnhdung

khihaihoặcnhiềulệnhthựchiệnxếpchồngkhicónhucầuđọc
giátrịcủacùngmột
toántử.Dosựphụthuộcnhưvậynênkhiviếtchươngtrìnhchúngtaphảikiểmsoát
đượcthứtựchươngtrìnhmàcáclệnhsẽđượcthựchiệnnhưthế
nào.Mụcđíchcủaviệc
thựcthilàlàmsaođểhỗtrợđượccơchếthựchiệnsongsongvàtăngđượchiệusuất
62
thựcthichươngtrình.Việcpháthiệnvàtránhđượchiệntượnghazardlàcầnthiếtđể
đảmbảochươngtrìnhđượcthựcthiđúng.Tuỳtheonguyênnhângâyrahazardngười
taphânra3loạ
ihìnhchínhtuỳthuộcvàothứtựđọchoặcviếttruynhậplệnhcủacác
nhómlệnhphụthuộcnhautrongcơchếthựchiệnsongsong.

Xéthailệnhivàjtrongđólệnhiđược
thựchiệntrướclệnhjtrongchươngtrình.Hiện
tượngHazarddữliệucóthểxảyranhưsau:
‐RAW(readafterwrite):Đọcsaukhiviết
Khilệnhivàjđềucầnsửdụng
vàtraođổithôngtinvớicùngmộtgiátrịônhớ,trong
đólệnhicầnphảithựchiệnxongvàcậpnhậtgiátrịvàoônhớđórồilệnhjmớicóthể
đọ
cvàsửdụng.Nếulệnhichưathựchiệnxongmàlệnhjđãđọcgiátrịônhớđóthìsẽ
xảyrahiệntượngđượcgọilàhazarddữliệu.Lệnhjđọcthôngtin
từmộtônhớtrước
khilệnhikịpviếtvàovìvậylệnhjsẽchỉđọcđượcgiátrịc ũchứkhôngphảigiátrịmới
cầnphảisửdụng.Trongcơchếthựchiệ
npipeline5phânđoạnsẽgặpphảihiệntượng
hzarddữliệukhicómộtlệnhnạp(load)theosaumộtlệnhALUsốnguyênvàsửdụng
trựctiếpkếtquảnạp.
‐

WAW(writeafterwrite):Viếtsaukhiviết
Lệnhjviếtvàomộttoántửtrướckhilệnhiviếtvào.Màyêucầuthựcthiđúngchương
trìnhlàlệnhiphảiviếttrước
lệnhjvàgiátrịcuốicùnglưutrongtoántửphảidolệnhj
đưarachứkhôngphảilệnhi.Hiệntượngnàyđượcgọilàhazarddữliệukhicósựphụ
thuộcđầura
vànhiềulệnhcùngcónhucầutruynhậpviếtvàocùngmộtbiếnhaymột
ônhớ.
‐WAR(writeafterread):Viếtsaukhiđọc
jviếtvàotoántửđíchtrướckhinóđượcđọc
bởilệnhidođólệnhIsẽnhậnđượcgiátrị
sai.HiệntượngHazardnàyxuấthiệnkhicósựphụthuộctoánhạngtrongcácphép
tính
 Hazarddosựphụthuộcđiềukhiể
n
Kiểuphụthuộccũngkhá phổbiếnlàdocấutrúcđiềukhiển.Sựphụthuộcđiềukhiển
đượcquyếtđịnhtrìnhtựthựcthicủamộtlệnhitheolệnhrẽnhánhđả
mbảosaochonó
đượcthực thiđúngnhưthứtựmongmuốn.Tấtcảcáclệnhngoạitrừkhốicơbảnđầu
tiêncủachươngtrìnhđềuđượcđiềukhiểntheocấutrúclệnh
rẽnhánhvàphảiđược
đảmbảođểthựcthiđúngtheothứtự.Mộtvídụđơngiảnnhấtvề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ộccâulệnhđiềukiệnif.Vídụđoạnmãchươngtrìnhminhhọanhư
sau:









if (p1) {
S1;
}
if (p2) {
S2;
}

63
Câulệnhđượcđiềukhiểnphụthuộcvàop1vàS2đượcđiềukhiểnphụthuộcp2chứ
khôngphảip1.

Nóichung,có2ràngbuộccóthểgiảthiếttrongsựphụthuộcđiềukhiể
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ôngthểđượcphépchuyểnlêntrướccâulệnhthựchiệnkiểmtrađiềukiện.
Vídụ
chúngtakhôngthểđưalệnhtừphần
thenlêntrướcphầnif.
(2)Mộtlệnhthựchiệnđộclậpvàkhôngphụthuộcvàolệnhrẽnhánhkhôngthểđược
chuyểnvàokhuvựcsauphầnthựchiệncủanhánhthựchiệnphụthuộc.Víd
ụkhông
thểđưamộtlệnhlêntrướcphầnlệnh
ifvàchuyểnnóvàotrongphầnthen.

Sựphụthuộcđiềukhiểnphảiđượcđảmbảobởi2thuộctínhtrongcơchếpipelineđơn
giản.Thứ nhất,cáclệnhthựchiệntrongchươngtrìnhphảiđúngtheo trìnhtựđược

điề
ukhiểncủanó.Trìnhtựnàyphảiđượcđảmbảorằngmộtlệnhmàphảithựcthi
trướcmộtnhánhđiềukhiểnthìphảithựchiệntrướcnhánhđó.Thứhai,việc
pháthiện
rasựxungđộtvềđiềukhiển(controlhazard)sẽđảmbảorằngmộtlệnhmàđượcđiều
khiểnphụthuộcvàomộtnhánhthìkhôngđượcthựchiệnchừngnàohướng
thựchiện
củanhánhđórõràng.Bảođảmđượcsựphụthuộcđiềukhiểnlàcầnthiếtvàcũnglà
mộtcáchđơngiảnđểđảmbảođúngtrìnhtựthựchiệnchươngtrình.S
ựphụthuộc
điềukhiểnkhôngphảilàmộtsựhạnchếcơbảnvềkhảnăngthựcthichươngtrình.
Chúngtacóthểsẵnsàngthựcthithêmnhữnglệnhmàlẽrakhôngnên
đượcthựcthi
nếuchúngkhônggâyảnhhưởnggìđếntínhđúngđắncủachươngtrình,nếukhôngsự
xungđộtgâyrabởisựphụthuộcđiềukhiểncóthểxảyra.Sựphụthuộcvềđ
iềukhiển
khôngphảilà mộtthuộctínhkịchtínhbắtbuộcphảibảođảm.Thayvìđiềuđó,hai
thuộctínhkịchtínhchoviệclậptrìnhmộtcáchđúngđắnvàthường
đượcbảođảmlà
phảitránhđượcxungđộtbởicảsựphụthuộcvềdữliệuvàđiềukhiểnvàđóchínhlà
hànhvingoạilệcóthểxảyratrongluồngdữliệuthựcthi
chươngtrình.

3.4 Ngôn ngữ và môi trường phát triển
3.4.1 Ngôn ngữ
Mộttrongnhữngngônngữlậptrìnhcólẽphổcậprộngrãinhấthiệnnaylàngônngữ
C.SovớibấtkỳngônngữlậptrìnhnàokhácđangtồntạiCthựcsựphùh
ợpvàtrở
thànhmộtngônngữpháttriểncủahệnhúng.Điềunàykhôngphảilàcốhữuvàsẽtồn
tạimãi,nhưngtạithờiđiểmnàythìCcólẽlàmộtngônngữ

gầngũinhấtđểtrởthành
mộtchuẩnngônngữtrongthếgiớihệnhúng.Trongphầnnàychúngtasẽcùngtìm
hiểutạisaoClạitrởthànhmộtngônngữphổbiếnđếnvậyvàt
ạisaochúngtalựachọn
nónhưmộtngônngữminhhọachoviệclậptrìnhhệnhúng.

Sựthànhcôngvềpháttriểnphầnmềmthườnglànhờvàosựlựachọnngônngữphù
hợ
pnhấtchomộtdựánđặtra.Cầnphảitìmmộtngônngữđểcóthểđápứngđượcyêu
cầulậptrìnhchocácbộxửlýtừ8‐bitđến64‐bit ,trongcáchệthốngchỉcóhữu
hạnvề
64
bộnhớvàiKbytehoặcMbyte.Chotớinay,điềunàychỉcóClàthựcsựcóthểthỏamãn
vàphùhợpnhất.

RõràngCcómộtsốưuđiểmnổibậttiêubiểu
nhưkhánhỏvàdễdàngchoviệchọc,các
chươngtrìnhbiêndịchthườngkhásẵnchohầuhếtcácbộxửlýđangsửdụnghiệnnay,
vàcórấtnhiềungườiđãbiết
vàlàmchủđượcngônngữnàyrồi,haynóicáchkháccũng
đãđượcphổcậptừlâu.HơnnữaC cólợithếlàkhôngphụthuộcvàobộxửlýthựcthi
mãnguồn.Ngườilậ
ptrìnhchỉphảitậptrungchủyếuvàoviệcxâydựngthuậttoán,
ứngdụngvàthểhiệnbằngngônngữthânthiệnthayvìphảitìmhiểusâuvềkiếnthức
phầncứ
ng,cũng nhưrất nhiềucácưuđiểmnổibật kháccủa ngônngữ bậccao nói
chung.

CólẽmộtthếmạnhlớnnhấtcủaClàmộtngônngữbậccaomứcth
ấpnhất.Tứclàvới

ngônngữCchúngtavẫncóthểđiềukhiểnvàtruynhậptrựctiếpphầncứngkháthuận
tiệnmàkhônghềphảihysinhhayđánhđổibất
kỳmộtthếmạnhnàocủangônngữbậc
cao.Thựcchấtđâycũnglàmộttrongnhữngtiêuchíxâydựngcủanhữngngườisáng
lậprangônngữCmuốnhướngtớ
i.Thựctếđiềunàyđãđượcđềcậpđếnkhihainhà
sánglậprangônngữC,KernighanvàRitchieđãđưavàotrongphầngiớithiệucủa
cuốnsáchcủahọ“TheCProgrammingLanguage”nhưsau:

“Cisarelatively“lowlevel”language.Thischaracterizationisnotpejorative;itsimplymeans
thatCdealswiththesamesortofobjectsthatmostcomputersdo.Thesemaybecombinedand
movedaboutwiththearithmeticandlogicaloperatorsimplementedbyrealmachines…”

TấtnhiênlàC
khôngphảilàngônngữduynhấtchocácnhàlậptrìnhnhúng.Ítnhất
hiệnnayngườitacũngcóthểbiếttớingoàingônngữClàAssembly,C++,vàAda.

Trongnhữngbuổiđầupháttriể
nhệnhúngthìngônngữAssemblychủyếuđượcsử
dụngchocácvixửlýđích.Vớingônngữnàychophépngườilậptrìnhđiềukhiểnvà
kiểmsoáthoàntoànvixửlýcũngnhưphầnc
ứnghệthốngtrongviệcthựcthichương
trình.TuynhiênngônngữAssemblycónhiềunhượcđiểmmàcũngchínhlàlýdotạ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ữ
Assemblyrấtkhókhănvàđặcbiệtkhókhăntrongviệcpháttriểncácchươngtrìnhứng
dụnglớnphứctạp.Hiênnaynóchỉđượcsửdụng
chủyếunhưđiểmnốigiữangônngữ
bậccaovàbậcthấpvàđượcsửdụngkhicóyêucầuđặcbiệtvềhiệusuấtthựchiệnvà
tốiưuvềtốcđộmà

khôngthểđạtđượcbằngngônngữkhác.NgônngữAssemblychỉ
thựcsựphùhợpchonhữngngườicókinhnghiệmvàhiểubiếttốtvềcấutrúcphầncứng
đíchcũngnhưnguyênlýthự
chiệncủabộlệnhvàchípxửlý.

C++làmộtngônngữkếthừatừCđểnhằmvàocáclớpứngdụngvàtưduylậptrình
hướngđốitượngvàcũngbắtđầuchiếm
đượcsốlượnglớnquantâmtrongviệcứng
dụngchopháttriểnhệnhúng.TấtcảcácđặcđiểmcốtlõicủaCvẫnđượckếthừahoàn
toàntrongngônngữC++vàngoàiracònhỗ
trợkhảnăngmớivềtrừutượnghóadữliệu
vàphùhợpvớitưduylậptrìnhhiệnđại;hướngđốitượng.Tuynhiênđiềunàybịđá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ươngtrìnhlớnvàkhôngchịusứcéplớnvềthờigianthựcthi.


Adacũnglàmộtngônngữhướngđốitượngmặcdùnókhôngđượcphổcậprộngrãi
nhưC++.AdađượcxâydựngbởicơquanquốcphòngMỹđểphụcvụpháttriểncác
phầnm
ềmquânsựchuyêndụngđặcbiệt.Mặcdùcũngđãđượcchuẩnhóaquốctế
(Ada83vàAda95)nhưngnóvẫnkhôngđượcphổcậprộngrãingoàiviệcứngdụngchủ
yếutrongcáclĩ
nhvựcquânsựvàhàngkhôngvũtrụ.Vànócũngdầndầnbịmấtưu
thếvàsựphổcậptrongthờigiangầnđây,đâycũnglàmộtđiềuđángtiếcvìbảnthân

Adacũnglàmộtngônngữcónhiềuđặcđi ểmphùhợpchoviệcpháttriểnphầnmềm
hệnhúngthayvìphảisửdụngC++.
3.4.2 Biên dịch



Hình3‐8:Quátrìnhpháttriểnvàbiêndịchphầnmềmnhúng
 Quátrìnhbiêndịch(Compiling)
Nhiệmvụchínhcủabộbiêndịchlàchuyểnđổichươngtrìnhđượcviếtbằngngônngữ
thânthiệnvớiconngườivídụnhưC,C++,…thànhtậpmãlệnht
ươngđươngcóthểđọc
vàhiểubởibộvixửlýđích.Theocáchhiểunàythìbảnchấtmộtbộhợpngữcũnglà
mộtbộbiêndịchđểchuyểnđổimột‐mộttừmột
dònglệnhhợpngữthànhmộtdạng
mãlệnh tươngđươngcho bộvi xửlýcó thểhiểu vàthựcthi.Chínhvìvậyđôi khi
ngườitavẫnnhầmhiểugiữakháiniệmb
ộhợpngữvàbộbiêndịch.Tuynhiênviệc
biêndịchcủabộhợpngữsẽđượcthựcthiđơngiảnhơnrấtnhiềusovớicácbộbiên
dịchchocácmãnguồnviết
bằngngônngữbậccaokhác.

Mỗimộtbộxửlýthườngcóriêngngônngữmáyvìvậycầnphảichọnlựamộtbộbiên
dịchphùhợpđểcóthểchuyểnđổichínhxácthành
dạngmãmáytươngứngvớib ộxử
lýđích.Đốivớicáchệthốngnhúng,bộbiêndịchlàmộtchươngtrìnhứngdụngluôn
66
đượcthựcthitrênmáychủ(môitrườngpháttriểnchươngtrình)vàcòncótêngọilàbộ
biêndịchchéo(cross‐compiler).Vìbộbiêndịchchạytrênmộtnềnphầncứngđểtạo
ra
mãchươngtrìnhchạytrênmôitrườngphầncứngkhác.Việcsửdụngbộbiêndịchchéo
nàylàmộtthànhphầnkhôngthểthiếutrongquátrìnhpháttriểnphầnmềmchohệ
nhúng.Các
bộbiêndịchchéothườngcóthểcấuhìnhđểthựcthiviệcchuyểnđổicho
nhiềunềnphầncứngkhácnhaumộtcáchlinhhoạt.Vàviệclựachọncấuhìnhbiêndịch

tươngứngvớicácnềnphầncứngđôikhicũngkháđộclậpvớichươngtrìnhứngdụng
củabộbiêndịch.

Kếtquảđầutiêncủaquátrìnhbiêndịchnhậnđượclà
mộtdạngmãlệnhđượcbiếttới
vớitêngọilàtệpđốitượng(objectfile).Nộidungcủatệpđốitượngnàycóthểđược
xemnhưlàmộtcấutrúcdữliệu
trunggianvàthườngđượcđịnhnghĩanhưm ộtđịnh
dạngchuẩnCOFF(CommonObjectFileFormat)hayđịnhdạngcủabộliênkếtmởrộng
ELF (Extended Linker Format)… Nếu sử dụng nhiều bộ biên
dịch cho các modul mã
nguồncủamộtchươngtrìnhlớnthìcầnphảiđảmbảorằngcáctệpđốitượngđượctạo
raphảicóchungmộtkiểuđịnhdạng.

Hầuh
ếtnộidungcủacáctệpđốitượngđềubắtđầubởimộtphầnheaderđểmôtảcác
phầntheosau.Mỗimộtphầnsẽchứamộthoặcnhiềukhốimãhoặc
dữliệunhưđược
sửdụngtrongtệpmãnguồn.Tuynhiêncáckhốiđóđượcnhómlạibởibộbiêndịchvào
trongcácphầnliênquan.Vídụnhưtấtcảcáckhốimãđượcnhómlại
vàotrongmột
phầnđượcgọilàtext,cácbiếntoàncụcđãđượckhởitạo(cùngcácgiátrịkhởitạocủa
chúng)vàotrongphầndữliệu,vàcácbiếntoàncụcchưa
đượckhởitạovàotrongphần
bss.

Cũngkháphổbiếnthườngcómộtbảngbiểutượngchứatrongnộidungcủatệpđối
tượng.Nóchứatênvàđịachỉcủatấ
tcảcácbiếnvàhàmđượcthamchiếutrongtệpmã
nguồn.Cácphầnchứatrongbảngnàykhôngphảilúcnàocũngđầyđủvìcómộtsố

biếnvàhàmđượcđịnhng hĩavàchứatrong
cáctệpmãnguồnkhác.Chínhvìvậycần
phảicóbộliênkếtđểthựcthixửlývấnđềnày.

 Quátrìnhliênkết(Linking)
Tấtcảcáctệpđối tượngnhậnđượcsaub
ướcthựchiệnbiêndịchđầutiênđềuphải
đượctổhợplạitheomộtcáchđặcbiệttrướckhinóđượcnạpvàchạyởtrênmôitrường
phầncứngđích.Nhưđãthấyởtrên,
bảnthâncáctệpđốitượngcũngcóthểlàchưa
hoànthiệnvìvậybộliênkếtphảixửlýđểtổhợpcáctệpđốitượngđóvớinhauvà
hoànthiện nốtphầ
ncònkhuyếtchocácbiếnhoặchàmthamchiếu liênthônggiữacác
tệpmãnguồnđượcbiêndịchđộclập.

Kếtquảđầuracủabộliênkếtlàmộttệpđốitượngm
ớicóchứatấtcảmãvàdữliệu
trongtệpmãnguồnvàcùngkiểuđịnhdạngtệp.Nóthựcthiđượcđiềunàybằngcáchtổ
hợpmộtcáchtươngứngcácphần
text,dữliệuvàphầnbss…từcáctệpđầuvàovàtạo
ramộttệpđốitượngtheođịnhdạngmãmáythốngnhất.Trongqúatrìnhbộliênkết
thựchiệntổhợpcác
phầnnộidungtươngứngnócònthựchiệnthêmcảvấnđềhoàn

67
chỉnhcácđịachỉthamchiếucủacácbiếnvàhàmchưađượcđầyđủtrongbướcthực
hiệnbiêndịch.

Cácb ộliênkếtcóthểđượckíchhoạtthựchiệnđộclậpvới
bộbiêndịchvàcáctệpđối

tượngđượctạorabởibộbiêndịchđượccoinhưcácthambiếnvào.Đốivớicácứng
dụngnhúngnóthườngchứaphầnmãkhởitạođãđược
biêndịchcũngphảiđượcgộp
ởtrongdanhsáchthambiếnvàonày.

Nếucùngmộtbiểutượngđượckhaibáohơnm ộtlầnnằmtrongmộttệpđốitượngthì
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ươngtrìnhxemxétlại.Hoặckhimộtbiểutượngkhôngthểtìmđượcđịachỉtham
chiếuthựctrongtoàn
bộcáctệpđốitượngthìbộliênkếtsẽc ốgắngtựgiảiquyếttheo
khảnăngchophépdựavàocácthôngtinvídụnhưchứatrongphầnmôtảcủathư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
trongchươngtrình.

Rấtđángtiếclàcáchàmthưviệnchuẩnthườngyêucầumộtvàithayđổi
trướckhinó
cóthểđượcsửdụngtrongchươngtrìnhứngdụngnhúng.Vấnđềởđâylàcácthưviện
chuẩncungcấpchocácbộcôngcụpháttriểnchỉdừngđếnkhảnăngđịnhdạngvà
tạo
ratệpđốitượng.Hơnnữachúngtacũngrấtítkhicóthểtruynhậpđượcvàomãnguồn
củacácthưviệnchuẩnđểcóthểtựthayđổi.Hiệnnaycũngcómột
sốnhàcungcấp
dịchvụphầnmềmhỗtrợcôngcụchuyểnđổihaythayđổithưviệnCchuẩ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à
newlibvàđượccungcấpmiễnphí.ChúngtacóthểtảivềtrangwebcủaCygnus.Nósẽ
hỗtrợchúngtagiảiquyếtvấnđềmàbộliênkếtcóth ểgặpphảikhichươngtrìnhs
ử

dụngcáchàmthuộcthưviệnCchuẩn.

Saukhiđãhợpnhấtthànhcôngtấtcảcácthànhphầnmãvàphầndữliệutươngứng
cũngnhưcácvấnđềvềthamchiếutới
cácbiểutượngchưađượcthựcthitrongquá
trìnhbiêndịchđơnlẻ,bộliênkếtsẽtạoramộtbảnsaođặcbiệtcủachươngtrìnhcó
khảnăngđịnhvịlại(relocatable).
Haynóicáchkhác,chươngtrìnhđượchoànthiện
ngoạitrừmộtđiều:Khôngcóđịachỉbộnhớnàochưađượcgánbêntrongcácphầnmã
vàdữliệu.Nếuchúngtakhôngphảilàđangpháttriể
nphầnmềmchohệnhúngthì
quátrìnhbiêndịchcóthểkếtthúctạiđây.Tuynhiên,vớihệnhúngngaycảhệthống
nhúngđãbaogồmcảhệđiềuhành chúngta vẫncầnphải
có mộtmã chươngtrình
(image)nhịphânđượcđịnhvịtuyệtđối.Thựctếnếucómộthệđiềuhànhthìphầnmã
vàdữ liệucũngthườnggộpcảvàobêntrongchươngtrình
cókhả năngđịnhvị lại.
Toànbộứngdụngnhúngbaogồmcảhệđiềuhànhthườngliênkếttĩnhvớinhauvà
thựchiệnnhưmộtmãchươngtrìnhnhịphânthốngnhất.

 Quátrìnhđịnhvị(Locating)
Côngcụthựchiệnviệcchuyểnđổimộtchươngtrìnhcókhảnăngđịnhvịlạithànhmột
dạng mãchương trình nhị phâncó thể thực thiđược gọi là
 bộđịnhvị. Nó sẽ đảm
nhiệmvaitròcủabướcđơngiảnnhấttrongcácbướcthực thibiêndịchnóichung.Thực
68
tếchúngtaphảitựlàmhầuhếtcôngviệccủabướcnàybằngcáchcungcấpthôngtinv ề
bộnhớđãđượcc ấuhìnhtrênnềnphầncứngmàchúngtađangpháttriểnvà
đóchính
làthamsốđầuvàochoviệcthựcthicủabộđịnhvị.Bộđịnhvịsẽsửdụngthôngtinnày

đểgáncácđịachỉvậtlýchomỗiphầnmãlệnhvàdữliệubêntrong
chươngtrìnhđược
thựcthimàcóthểđịnhvịlại.Tiếptheonósẽtạoramộttệpcóchứachươngtrìnhbộ
nhớnhịphânđểcóthểnạptrựctiếpvàobộnhớchươngtrình
trênnềnphầncứngthực
thi.

Trongnhiềutrườnghợpbộđịnhvịlàmộtchươngtrìnhkháđộclậpvớicácphầncông
cụkháctronghệthốngphầnmềmpháttriển.Tuynhiên
trongcácbộcôngcụpháttriển
GNUchứcnăngnàyđượctíchhợpluôntrongbộliênkết.Tuynhiênkhôngnênnhầm
lẫnvềchứcnăngcủachúngtrongquátrìnhthựcthibiêndịch.Thông
thườngchương
trìnhchạytrêncácmáytínhmụcđíchchungthìhệđiềuhànhsẽthựchiệnviệcchuyển
đổivàgánchínhxácđịachỉthựcchocácphầnmãvàdữliệutrongchương
trìnhứng
dụng,cònvớichươngtrìnhpháttriểnchạytrênhệnhúngthìviệcnàyphảiđượcthực
hiệnbởibộđịnhvị.Đâycũngchínhlàđiểmkhácbiệtcơbảnkhithực
hiệnbiêndịch
mộtchươngtrìnhứngdụngchohệnhúng.

Thôngtinvềbộnhớvậtlýcủahệthốngphầncứngpháttriểnmàcầnphảicungcấpcho
bộđịnhvịGNUphả
iđượcđịnhdạngtheokiểubiểudiễncủabộliênkết.Thôngtinnà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ươngtrìnhvàdữliệu
bêntrongchươngtrìnhcóthểđịnhvịlại.Nhưngởđâychúng
tacầnphảithựchiệnnhiềuhơnthế,tứclàphảithiếtlậpchínhxáckhuvựccủamỗi
phầntrong
bộnhớ.


Sauđâylàmộtvídụminhhọacủamộttệpthôngtinliênkếtđượccungcấpchomột
nềnphầncứngnhúng,giảthiếtlàcó512KBRAMvà512KBROM.

















MEMORY
{
ram : ORIGIN = 0x00000, LENGTH = 512K
rom : ORIGIN = 0x80000, LENGTH = 512K
}
SECTIONS
{
data ram : /* Initialized data. */
{
_DataStart = . ;

*(.data)
_DataEnd = . ;
} >rom

69
















ĐoạnmãnàyđượccungcấpchochobộđịnhvịcủabộliênkếtGNUvềthôngtinbộ
nhớđãđượccấuhìnhtrênnềnmạchcứnghệnhúngđíchvàchỉracácphần
dữliệuvà
bsssẽđượcđịnhvịtrongRAM(bắtđầutạiđịachỉ0x00000)vàphầnmãchươngtrình
sẽđượcđịnhvịtrongROM(bắtđầutạiđịachỉ0x80000).Tuynhiêncácgiátrịkhởitạo
trong
cácđoạndữliệusẽđượcthựchiệnmộtphầntrongởROMbắtđầutừphầnđịnh
nghĩacủakhuvựcđịnhvịcuốicùngtrongmãchươngtrình.


Tấtcảcáctênbắtđầub
ởidấugạchdưới(“_”)làcácbiếncóthểđượcthamchiếutừbên
trongmãnguồn.Bộliênkếtsẽsửdụngcácbiểutượngđểxửlýcácthamchiếutrong
cáctệpđốitượng.
Vídụcóthểcómộtphầnchươngtrìnhứngdụngnhúng(thườnglà
thuộcphầnmãkhởitạochươngtrình)saochépcácgiátrịkhởitạocủacácbiếnđãđược
khởitạo
trongROMsangkhuvựcdữliệutrongRAM.Cácđịachỉbắtđầuvàkếtthúc
chohoạtđộngnàycóthểđượcthiếtlậpmộtcáchbiểutượngbởithamchiếutớicácbiến
sốnguyên_DataStartvà_DataEnd.

Kếtquảcủabướccuốicùngnàycủaquátrìnhbiêndịchlàmộtmãchươngtrìnhnhị
phâncóthểđượcnạptrựctiếpvàchạyđượctrênnềnphầncứnghệnhúngđích,
tứclà
đượcnạp vàobộ nhớchương trìnhcủa hệthốngđích.Trong vídụtrênmãchương
trìnhnhịphânđượctạoracódunglượngchínhxáclà1MB.Tuynhiênbởivìcácgiátrị
choph
ầndữliệuđượckhởi tạonằmtrongROMnênnửaphần thấp512KB củamã
chươngtrìnhnhịphânnàychỉchứagiátrịzerovàchỉcónửaphầncaođượcsửdụnglà
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ình3‐9:VídụvềmộtlưuđồpháttriểnphầnmềmchoDSPTMS320Cxx
3.4.3 Simulator
Simulatorlàmộtchươngtrìnhphầnmềmchophépngườipháttriểnmãchươngtrình
chạymôphỏngmộtchươngtrình viếtchomộtnền VXL/VĐK(nềnphầncứngđích)
trênmột
môitrườngphầncứngkhác(haycòngọilàmôitrườngpháttriển).Thựcchất
đólàquátrìnhmôphỏnghoạtđộngcủachươngtrìnhthựcthitheođúngnhưđiềukiện
thực
hiệncủamôitrườngđíchtrênmôitrườngpháttriển.

Sửdụng bộmôphỏngmã chươngtrình cóthể đượcchạythửtừngbướchoặctừng
phầnvàcóthểđượcchỉnhsửa
trựctiếpđểthửnghiệmcácgiảiphápkhácnhauchocác
bàitoánthựcthiphầnmềm.Tuynhiêncácbộmôphỏngkhônghỗtrợcácngắtthực và
cácthiếtbịngoạivị.

Bộmô
phỏngtrựctiếp(bộmôphỏngphầncứng)baogồmmộtthiếtbịphầncứngkết
nốitrựctiếpvớihệpháttriểnvàchophépthựcthiđểcóđượcphảnứ
nggiốngnhưbộ
xửlýđích.Bộmôphỏngtrựctiếptrênmạchcótấtcảcácchứcnăngcủamộtbộmô

71

phỏngphầnmềmđồngthờihỗtrợcảcácchứcnăngemulationchocáccổngvàoracủa
VĐK.
3.4.4 Emulator
Emulatorlàmộtthiếtbịphầncứngcókhảnăngthựchiệnnhưmộtnềnphầncứngđích.
Nócònđượcbiếttớinhưmộttêngọikháclàcộngcụpháttriểnth
ờigianthựcbởivìnó
chotaphảnứngvớicácsựkiệnnhưVĐKđíchthựcthi.CácbộEmulatorthườngcókèm
theo cảphầnchương trình giám sát(monitor program)đểcho phép ngườiphát
triển
chươngtrìnhchoVĐKđíchkiểmtranộidung,trạngtháicácthanhghivàcáckhuvực
bộnhớvàthiếtlậpcácđiểmdừngkhithựchiệnchạychươngtrình.
3.4.5 Thiết kế hệ thống bằng máy tính



Trongquátrìnhpháttriểnphầnmềmcầnphảiđượcthửnghiệm vớiđốitượngđiều
khiển.Tuỳthuộcvàotừngmôitrườngpháttriểnchúngtacóthểtiếnhànhtheomộtsố
cácphươngphápsau.

 Môphỏngoffline

Tronghệthốngpháttriểnnàynềnphầncứngnhúngđíchđượcmôphỏngbằngmôhình
chạytrênPCvàđốitượngđiềukhiểncũnglàmôhìnhmôphỏngchạytrênPC.Vìvậ
y
quátrình pháttriểnthựcchấtlà quátrìnhchạymôphỏnghệthốngđượcthực hiện
hoàntoàntrênPC.Vớihệthốngnàykhôngthểthửnghiệmchocácsựkiệnđápứng
thời gian
 thực vì thời gian của môphỏng khác với thờigiandiễnbiến thực của hệ
thống.


 Hệthốngpháttriển(softwareintheloop)
72

HệthốngnàymôphỏngnềnphầncứngthựctrênPCchođápứnghànhvigiốngnhưvới
vimạchcứngthựcvàmôhìnhđốitượngđượcmôhìnhthựcthitrênPC.Loại
hệthống
nàycũngtươngtựnhưhệthốngmôphỏngofflinetuynhiêncó ưuđiểmhơnvìkhả
năngmôphỏnghànhvivàđápứngcủavimạchnhúngchínhxáchơnvàtrungthực

hơn.Vàcũngcómộtnhượcđiểmlàkhôngthửnghiệmđượcbàitoánthờigianthực.

 Môphỏngthờigianthực(HardwareintheLoop)



Hệthốngnàysửdụngnềnphầncứngnhúngđíchthựcnhưngđốitượngthìchỉlàmô
hìnhthờigianthựckhôngphảiđốitượngthực.Ưuđiểmlàkhámềmdẻovà
thayđổi
cấuhìnhđơngiảntrongquátrìnhpháttriểnđểthửnghiệmvớicáchànhvikhácnhau
củađốitượng.Rútngắtvàđơngiảnhóacôngviệcxâydựngđốitượng.

 Môhìnhphát
triểnthực



Hệthốngnàysửdụngnềnphầncứngnhúngđíchthựcvớiđốitượngthực.Tuynhiêncó
sựhỗtrợcủacôngcụpháttriểnđểcóthểcàiđặtvàthửnghiệmtrực tiếptrên
nềnphần
cứngthực.Đâylàmộtdạngmôhìnhchokếtquảtrungthựcvàchínhxácnhấttrongcác

dạnghệthốngpháttriểnnêutrên.Tuynhiêncácnềnphầncứngnày
thườngđượcphát
triểnvàhỗtrợbởicácnhàcungcấpđểcóthểtươngthíchvớicôngc ụphầnmềmkèm
theo.

×