Giáo trình "Chương II: Polling và Interrupt"

Giáo trình có 6 trang gồm 1 chương chính bao gồm các kiến thức cơ bản liên quan: "Chương II: Polling và Interrupt" giúp bạn ôn luyện và nắm vững kiến thức môn học. Mời bạn đọc đón xem!

Polling v.s Interrupt
CHƯƠNG II:
Polling và Interrupt
Mt h thng thßi gian thc đưc gi là “điu khin s kin” có nghĩa là h thng
đó phi có chc năng chính là phn ng li các s kin xy ra trong môi trưßng
ca h thng. Vy thì h thng phn ng li các s kin như thế nào. Hin nay có
hai phương pháp tiếp cn vn đề này. Phương pháp đầu tiên là Polling hay Vòng
lp Polling.
Hình 1 – Vòng lp Polling
Hãy xem đon code trong hình 1. Chương trình được bt đầu bng mt vài cài đặt
ban đầu cho h thng ri truy cp vào trong mt vòng lp vô hn, trong đó, các s
kin mà h thng có th phn ng li được kim tra. Khi có mt s kin xy ra,
dch v phn ng li s kin đó được kích hot.
Tiến trình thc hin ca vòng lp trên t ra khá đơn gin và thích hp vi nhng
h thng nh không đòi hi quá gt gao v mt thßi gian. Tuy nhiên, cũng có mt
s vn đề cn bàn đến:
- Thßi gian phn ng li s kin ph thuc rt ln vào v trí mà chương trình
đang thc hin trong vòng lp. Ly ví d: Nếu s kin event_1 xy ra ngay
trước câu lnh if(event_1) thì thßi gian phn ng là rt ngn. Nhưng nếu s
kin event_1 xy ra ngay sau khi câu lnh kim tra đó, chương trình lúc này
phi quét toàn b vòng lp và quay trá v đim đầu và thc hin dch v
ca s kin event_1.
- Và cũng là mt h qu tt yếu, thßi gian phn ng cũng là mt hàm ca s
lượng s kin được kích hot ti mt thßi đim và sau đó là thßi gian thc
hin các dch v trong mt ln quét vòng lp ca chương trình.
Võ Duy Thành
coinsking208@yahoo.com 1/6
Downloaded by Ng?c Di?p ??ng (ngocdiep10012000@gmail.com)
lOMoARcPSD|36477180
Polling v.s Interrupt
- Tt c các s kin được chương trình đối x mt cách bình đẳng và không
có s ưu tiên nào c.
- Khi có mt đặc tính mi, do đó là dch v mi, được thêm vào chương trình,
thßi gian phn ng li dài thêm ra.
Phương pháp tiếp cn th 2 là ngt (Interrupt). Rt hu dng và cũng gây không ít
khó khăn cho ngưßi lp trình. Ý tưáng ca ngt: s xut hin ca mt s kin có
th “ngt” tiến trình thc hin ca chương trình, “nhi” thêm và thc hin mt tiến
trình khác vào như hình 2. Khi tiến trình nhi thêm được thc hin xong, chương
trình chính li được thc hin tiếp t thßi đim b ngt. Tiến trình ca s kin ngt
được thc hin ngay lp tc mà không phi quan tâm đến chương trình chính.
Nhng tiến trình như thế ngưßi ta gi là “chương trình con dch v ngt
(Interrupt Service Routine) viết tt ISR.
Các thế h vi x lý hin nay thưßng thc hin 3 loi ngt khác nhau
- Câu lnh INT, hay nhiu khi còn được nhc đến vi cái tên là TRAP (by).
Nó như mt câu lnh để gi mt chương trình con đặc bit. Chúng ta s đề
cp đến nó sau.
- Các trưßng hp đặc bit ca b x lý. Các điu kin li như li chia 0, li
truy cp bt hp pháp vào b nh có th được điu khin thông qua cơ chế
ngt.
Hình 2 - Ngt
Hai loi ngt k trên đồng b vi vic thc hin lnh. Trong đó, INT chính là mt
câu lnh và các li đặc bit ca b x lý chính là kết qu trc tiếp ca vic thc
hin lnh.
Võ Duy Thành
coinsking208@yahoo.com 2/6
Downloaded by Ng?c Di?p ??ng (ngocdiep10012000@gmail.com)
lOMoARcPSD|36477180
Polling v.s Interrupt
Loi ngt th 3 được to ra bái s kin xy ra bên ngoài b x lý. Loi ngt này
được to ra bái các I/O phn cng và xy ra không đồng b vi vic thc hin
lnh.
Các ngt ngoài không đồng by:
- Làm ti đa hoá hiu sut và thông lượng ca h thng máy tính
- Gây ra phn ln các li và rc ri cho ngưßi lp trình
Hu hết các b xđều s dng lược đồ ngt ging nhau. Hình 3 ch ra kiến trúc
ngt ca Intel x86. 1kilo byte đầu tiên ca b nh được giành cho bng véctơ ngt
(Interrupt Vector Table). Mi mt véctơ có 4 byte th hin địa ch (segment và
offset) ca chương trình con dch v ngt. Các véctơ này mang nhng ý nghĩa,
chc năng khác nhau và được định nghĩa bái kiến trúc ca b x lý. Ví d: véctơ 0
là li chia 0, véctơ 3 là breakpoint (lnh ngt INT 1byte)…
Hình 3 - Ngt - Bng véctơ ngt
Mt s véctơ được dành cho các ngt ngoài. Trong PC, các véctơ 8 đến 15 và
0x70 đến 0x77 được dành cho phn cng.
Tt c các véctơ được truy cp thông qua lnh ngt INT 2byte, trong đó, byte th 2
ch ra s th t ca véctơ (ngt). Phn mm h thng thưßng thiết lp các quy ước
liên quan đến nhiu véctơ này. Ví d: PC BIOS s dng mt s ngt cho các dch
v phn cng và LINUX s dng ngt INT 0x80 để gi dch v ca kernel.
Sau đây là mt ví d v vic s dng ngt INT 0x80 ca Linux.
- B x lý lưu li giá tr hin thßi ca thanh ghi b đếm chương trình
Program Counter (PC) và Code Segment (CS) vào ngăn xếp stack cùng vi
t điu khin trng thái b x lý Proccesor Status Word (PSW).
Võ Duy Thành
coinsking208@yahoo.com 3/6
Downloaded by Ng?c Di?p ??ng (ngocdiep10012000@gmail.com)
lOMoARcPSD|36477180
Polling v.s Interrupt
- Byte th 2 trong câu lnh INT là mt ch s trong bng véctơ ngt để t đó
tìm được địa ch ca chương trình con dch v ngt (ISR). B x lý np địa
ch này vào thanh ghi PC và CS và vic thc hin chương trình con được
thc hin t đim này.
Hình 4 - Ngt và hot động ca ngt
- Kết thúc ca ISR là câu lnh IRET (Interrupt Return). Nó gii phóng PC và
CS để np li giá tr ca chương trình chính và thc hin tiếp lnh tiếp theo
sau lnh INT.
Lnh INT cũng tương t như lnh gi chương trình con CALL nhưng có đôi chút
khác bit: trong khi địa ch đích ca lnh CALL được nhúng vào trong câu lnh đó
thì vi INT, ta không cn quan tâm đến địa ch ca ISR. Địa ch ca nó nm trong
bng véctơ ngt. Đây là mt đim thun li cho vic truyn thông gia chương
trình được biên dch và chương trình được ti, ví d như chương trình ng dng và
h điu hành.
Các ngt ngoài có cách thc thc hin như th hin trong hình 5. Mt thiết b bên
ngoài đưa ra mt “yêu cu ngt” Interrupt Request (IRQ). Khi b x lý phn ng
li bng mt xác nhn “chp nhn ngtInterrupt Acknowledge (IAK), thiết b đó
s gi s th t ca véctơ ngt lên bus d liu. B x lý sau đó s thiết lp mt
lnh ngt INT vi ch s véctơ ngt đã được cung cp.
Võ Duy Thành
coinsking208@yahoo.com 4/6
Downloaded by Ng?c Di?p ??ng (ngocdiep10012000@gmail.com)
lOMoARcPSD|36477180
Polling v.s Interrupt
Hình 5 – Ngt cng
Trong thc tế, hu hết các h thng đều sát nhp thêm mt thiết b ngoi vi đặc
bit được gi là b điu khin ngt Interrupt Controller để qun lý các công vic
chi tiết chng hn như gi ch s ca véctơ ngt lên bus d liu vào đúng thßi
đim cn thiết. Kiến trúc PC bao gm 2 b điu khin ngt 8259, mi mt b
th qun lý được 8 ngt. Mi mt b 8259 có mt cơ chế qun lý ngt theo kiu ưu
tiên. Do đó, mt thiết b quan trng s đưc ưu tiên hơn thiết b khác ít quan trng
hơn.
Ngt có th được kích hot hoc b vô hiu hoá. à cp độ ca b x lý, ngt có th
được kích hot hoc vô hiu hoá thông qua câu lnh STI và CLI. Các ngt có th
được kích hot hoc vô hiu mt cách có chn lc á c b điu khin ngt 8259
hay á chính thiết b đó. Trên thc tế, vic kích hot và vô hiu ngt chính là đim
mu cht để thiết kế và thc thi mt phn mm thi gian thc.
Cũng không có gì đáng ngc nhiên khi nói rng ngt không đồng b có nhng vn
đề đáng bàn ca nó. Để ý mt ng dng thu thp d liu da trên b A/D đa kênh
như trên hình 6. C mi khi b chuyn đổi A/D thu thp mt tp hp d liu trên
các kênh, nó ngt b x lý. Chương trình con dch vu ngt đọc d liu và ct vào
b nh đệm, nơi mà chương trình khác (còn gi là chương trình nn) s tiếp tc x
lý.
Hình 6 – Ví d v ngt
Võ Duy Thành coinsking208@yahoo.com 5/6
Downloaded by Ng?c Di?p ??ng (ngocdiep10012000@gmail.com)
lOMoARcPSD|36477180
Polling v.s Interrupt
Hot động điu khin ngt cho phép chúng ta phn ng li A/D mt cách nhanh
chóng trong khi b nh đệm tách chương trình nn khi ngun d liu, ví d,
chương trình nn không cn quan tâm đến d liu được t đâu mà được.
Bây giß hãy xem đến đon mã lnh được ghi trong hình 6. Gi thiết ch là thí
nghim, chúng ta cung cp mt tín hiu biến đổi liên tc vào c kênh 5 và 6. Đồng
thßi, gi thiết rng chương trình s không b “fail” khi đang thc hin đo tín hiu
đồng nht.
Trong thc tế, chương trình như đã viết chc chn s b “fail” bái vì mt ngt có
th xy ra trong khi cp nht biến Cur_temp và cp nht biến Set_temp vi kết qu
là giá tr ca biến Cur_temp được cp nht t tp hp d liu cũ trước đó, còn giá
tr ca biến Set_temp được cp nht t tp hp d liu hin thßi. Như vy, khi tín
hiu đầu vào thay đổi theo thßi gian và các tp hp d liu được tách rßi nhau á
các thßi gian xác định, giá tr các biến s khác nhau và do đó, chương trình s
“fail”.
Đây chính là bn cht ca vn đề lp trình thßi gian thc. Cn phi qun lý các
ngt không đồng b để chúng không xy ra vào nhng thi đim không thích
hp.
Có mt gii pháp, dù không hay cho lm, để gii quyết vn đề này. Ta có th dùng
mt lnh vô hiu hoá ngt (CLI) trước khi cp nht biến Cur_temp và kích hot
ngt bng lnh STI sau khi cp nht biến Set_temp. Vic làm này giúp các ngt
tránh khi phin phc ca vic cp nht liên tc như đã đề cp. Có v như chúng
ta đã sáng sut khi s dng các lnh CLI và STI như mt chìa khoá cho mt gii
pháp đúng đắn, nhưng nếu ch đơn gin là ri các lnh CLI và STI trong code ca
chương trình thì cũng chng khác gì vic s dng các lnh “go to” và các biến
toàn cc.
Võ Duy Thành
coinsking208@yahoo.com 6/6
Downloaded by Ng?c Di?p ??ng (ngocdiep10012000@gmail.com)
lOMoARcPSD|36477180
| 1/6

Preview text:

lOMoARcPSD|36477180
Polling v.s Interrupt CHƯƠNG II: Polling và Interrupt
Một hệ thống thßi gian thực được gọi là “điều khiển sự kiện” có nghĩa là hệ thống
đó phải có chức năng chính là phản ứng lại các sự kiện xảy ra trong môi trưßng
của hệ thống. Vậy thì hệ thống phản ứng lại các sự kiện như thế nào. Hiện nay có
hai phương pháp tiếp cận vấn đề này. Phương pháp đầu tiên là Polling hay Vòng lặp Polling.
Hình 1 – Vòng lặp Polling
Hãy xem đoạn code trong hình 1. Chương trình được bắt đầu bằng một vài cài đặt
ban đầu cho hệ thống rồi truy cập vào trong một vòng lặp vô hạn, trong đó, các sự
kiện mà hệ thống có thể phản ứng lại được kiểm tra. Khi có một sự kiện xảy ra,
dịch vụ phản ứng lại sự kiện đó được kích hoạt.
Tiến trình thực hiện của vòng lặp trên tỏ ra khá đơn giản và thích hợp với những
hệ thống nhỏ không đòi hỏi quá gắt gao về mặt thßi gian. Tuy nhiên, cũng có một
số vấn đề cần bàn đến:
- Thßi gian phản ứng lại sự kiện phụ thuộc rất lớn vào vị trí mà chương trình
đang thực hiện trong vòng lặp. Lấy ví dụ: Nếu sự kiện event_1 xảy ra ngay
trước câu lệnh if(event_1) thì thßi gian phản ứng là rất ngắn. Nhưng nếu sự
kiện event_1 xảy ra ngay sau khi câu lệnh kiểm tra đó, chương trình lúc này
phải quét toàn bộ vòng lặp và quay trá về điểm đầu và thực hiện dịch vụ của sự kiện event_1.
- Và cũng là một hệ quả tất yếu, thßi gian phản ứng cũng là một hàm của số
lượng sự kiện được kích hoạt tại một thßi điểm và sau đó là thßi gian thực
hiện các dịch vụ trong một lần quét vòng lặp của chương trình.
Võ Duy Thành – coinsking208@yahoo.com 1/6
Downloaded by Ng?c Di?p ??ng (ngocdiep10012000@gmail.com) lOMoARcPSD|36477180
Polling v.s Interrupt
- Tất cả các sự kiện được chương trình đối xử một cách bình đẳng và không có sự ưu tiên nào cả.
- Khi có một đặc tính mới, do đó là dịch vụ mới, được thêm vào chương trình,
thßi gian phản ứng lại dài thêm ra.
Phương pháp tiếp cận thứ 2 là ngắt (Interrupt). Rất hữu dụng và cũng gây không ít
khó khăn cho ngưßi lập trình. Ý tưáng của ngắt: sự xuất hiện của một sự kiện có
thể “ngắt” tiến trình thực hiện của chương trình, “nhồi” thêm và thực hiện một tiến
trình khác vào như hình 2. Khi tiến trình nhồi thêm được thực hiện xong, chương
trình chính lại được thực hiện tiếp từ thßi điểm bị ngắt. Tiến trình của sự kiện ngắt
được thực hiện ngay lập tức mà không phải quan tâm đến chương trình chính.
Những tiến trình như thế ngưßi ta gọi là “chương trình con dịch vụ ngắt
(Interrupt Service Routine) viết tắt ISR.
Các thế hệ vi xử lý hiện nay thưßng thực hiện 3 loại ngắt khác nhau
- Câu lệnh INT, hay nhiều khi còn được nhắc đến với cái tên là TRAP (bẫy).
Nó như một câu lệnh để gọi một chương trình con đặc biệt. Chúng ta sẽ đề cập đến nó sau.
- Các trưßng hợp đặc biệt của bộ xử lý. Các điều kiện lỗi như lỗi chia 0, lỗi
truy cập bất hợp pháp vào bộ nhớ có thể được điều khiển thông qua cơ chế ngắt.
Hình 2 - Ngắt
Hai loại ngắt kể trên đồng bộ với việc thực hiện lệnh. Trong đó, INT chính là một
câu lệnh và các lỗi đặc biệt của bộ xử lý chính là kết quả trực tiếp của việc thực hiện lệnh.
Võ Duy Thành – coinsking208@yahoo.com 2/6
Downloaded by Ng?c Di?p ??ng (ngocdiep10012000@gmail.com) lOMoARcPSD|36477180
Polling v.s Interrupt
Loại ngắt thứ 3 được tạo ra bái sự kiện xảy ra bên ngoài bộ xử lý. Loại ngắt này
được tạo ra bái các I/O phần cứng và xảy ra không đồng bộ với việc thực hiện lệnh.
Các ngắt ngoài không đồng bộ này:
- Làm tối đa hoá hiệu suất và thông lượng của hệ thống máy tính
- Gây ra phần lớn các lỗi và rắc rối cho ngưßi lập trình
Hầu hết các bộ xử lý đều sử dụng lược đồ ngắt giống nhau. Hình 3 chỉ ra kiến trúc
ngắt của Intel x86. 1kilo byte đầu tiên của bộ nhớ được giành cho bảng véctơ ngắt
(Interrupt Vector Table). Mỗi một véctơ có 4 byte thể hiện địa chỉ (segment và
offset) của chương trình con dịch vụ ngắt. Các véctơ này mang những ý nghĩa,
chức năng khác nhau và được định nghĩa bái kiến trúc của bộ xử lý. Ví dụ: véctơ 0
là lỗi chia 0, véctơ 3 là breakpoint (lệnh ngắt INT 1byte)…
Hình 3 - Ngắt - Bảng véctơ ngắt
Một số véctơ được dành cho các ngắt ngoài. Trong PC, các véctơ 8 đến 15 và
0x70 đến 0x77 được dành cho phần cứng.
Tất cả các véctơ được truy cập thông qua lệnh ngắt INT 2byte, trong đó, byte thứ 2
chỉ ra số thứ tự của véctơ (ngắt). Phần mềm hệ thống thưßng thiết lập các quy ước
liên quan đến nhiều véctơ này. Ví dụ: PC BIOS sử dụng một số ngắt cho các dịch
vụ phần cứng và LINUX sử dụng ngắt INT 0x80 để gọi dịch vụ của kernel.
Sau đây là một ví dụ về việc sử dụng ngắt INT 0x80 của Linux.
- Bộ xử lý lưu lại giá trị hiện thßi của thanh ghi bộ đếm chương trình
Program Counter (PC) và Code Segment (CS) vào ngăn xếp stack cùng với
từ điều khiển trạng thái bộ xử lý Proccesor Status Word (PSW).
Võ Duy Thành – coinsking208@yahoo.com 3/6
Downloaded by Ng?c Di?p ??ng (ngocdiep10012000@gmail.com) lOMoARcPSD|36477180
Polling v.s Interrupt
- Byte thứ 2 trong câu lệnh INT là một chỉ số trong bảng véctơ ngắt để từ đó
tìm được địa chỉ của chương trình con dịch vụ ngắt (ISR). Bộ xử lý nạp địa
chỉ này vào thanh ghi PC và CS và việc thực hiện chương trình con được
thực hiện từ điểm này.
Hình 4 - Ngắt và hoạt động của ngắt
- Kết thúc của ISR là câu lệnh IRET (Interrupt Return). Nó giải phóng PC và
CS để nạp lại giá trị của chương trình chính và thực hiện tiếp lệnh tiếp theo sau lệnh INT.
Lệnh INT cũng tương tự như lệnh gọi chương trình con CALL nhưng có đôi chút
khác biệt: trong khi địa chỉ đích của lệnh CALL được nhúng vào trong câu lệnh đó
thì với INT, ta không cần quan tâm đến địa chỉ của ISR. Địa chỉ của nó nầm trong
bảng véctơ ngắt. Đây là một điểm thuận lợi cho việc truyền thông giữa chương
trình được biên dịch và chương trình được tải, ví dụ như chương trình ứng dụng và hệ điều hành.
Các ngắt ngoài có cách thức thực hiện như thể hiện trong hình 5. Một thiết bị bên
ngoài đưa ra một “yêu cầu ngắt” Interrupt Request (IRQ). Khi bộ xử lý phản ứng
lại bằng một xác nhận “chấp nhận ngắtInterrupt Acknowledge (IAK), thiết bị đó
sẽ gửi số thứ tự của véctơ ngắt lên bus dữ liệu. Bộ xử lý sau đó sẽ thiết lập một
lệnh ngắt INT với chỉ số véctơ ngắt đã được cung cấp.
Võ Duy Thành – coinsking208@yahoo.com 4/6
Downloaded by Ng?c Di?p ??ng (ngocdiep10012000@gmail.com) lOMoARcPSD|36477180
Polling v.s Interrupt
Hình 5 – Ngắt cứng
Trong thực tế, hầu hết các hệ thống đều sát nhập thêm một thiết bị ngoại vi đặc
biệt được gọi là bộ điều khiển ngắt Interrupt Controller để quản lý các công việc
chi tiết chẳng hạn như gửi chỉ số của véctơ ngắt lên bus dữ liệu vào đúng thßi
điểm cần thiết. Kiến trúc PC bao gồm 2 bộ điều khiển ngắt 8259, mỗi một bộ có
thể quản lý được 8 ngắt. Mỗi một bộ 8259 có một cơ chế quản lý ngắt theo kiểu ưu
tiên. Do đó, một thiết bị quan trọng sẽ được ưu tiên hơn thiết bị khác ít quan trọng hơn.
Ngắt có thể được kích hoạt hoặc bị vô hiệu hoá. à cấp độ của bộ xử lý, ngắt có thể
được kích hoạt hoặc vô hiệu hoá thông qua câu lệnh STI và CLI. Các ngắt có thể
được kích hoạt hoặc vô hiệu một cách có chọn lọc á cả bộ điều khiển ngắt 8259
hay á chính thiết bị đó. Trên thực tế, việc kích hoạt và vô hiệu ngắt chính là điểm
mấu chốt để thiết kế và thực thi một phần mềm thời gian thực.
Cũng không có gì đáng ngạc nhiên khi nói rằng ngắt không đồng bộ có những vấn
đề đáng bàn của nó. Để ý một ứng dụng thu thập dữ liệu dựa trên bộ A/D đa kênh
như trên hình 6. Cứ mỗi khi bộ chuyển đổi A/D thu thập một tập hợp dữ liệu trên
các kênh, nó ngắt bộ xử lý. Chương trình con dịch vu ngắt đọc dữ liệu và cất vào
bộ nhớ đệm, nơi mà chương trình khác (còn gọi là chương trình nền) sẽ tiếp tục xử lý.
Hình 6 – Ví dụ về ngắt
Võ Duy Thành – coinsking208@yahoo.com 5/6
Downloaded by Ng?c Di?p ??ng (ngocdiep10012000@gmail.com) lOMoARcPSD|36477180
Polling v.s Interrupt
Hoạt động điều khiển ngắt cho phép chúng ta phản ứng lại A/D một cách nhanh
chóng trong khi bộ nhớ đệm tách chương trình nền khỏi nguồn dữ liệu, ví dụ,
chương trình nền không cần quan tâm đến dữ liệu được từ đâu mà có được.
Bây giß hãy xem đến đoạn mã lệnh được ghi trong hình 6. Giả thiết chỉ là thí
nghiệm, chúng ta cung cấp một tín hiệu biến đổi liên tục vào cả kênh 5 và 6. Đồng
thßi, giả thiết rằng chương trình sẽ không bị “fail” khi đang thực hiện đo tín hiệu đồng nhất.
Trong thực tế, chương trình như đã viết chắc chắn sẽ bị “fail” bái vì một ngắt có
thể xảy ra trong khi cập nhật biến Cur_temp và cập nhật biến Set_temp với kết quả
là giá trị của biến Cur_temp được cập nhật từ tập hợp dữ liệu cũ trước đó, còn giá
trị của biến Set_temp được cập nhật từ tập hợp dữ liệu hiện thßi. Như vậy, khi tín
hiệu đầu vào thay đổi theo thßi gian và các tập hợp dữ liệu được tách rßi nhau á
các thßi gian xác định, giá trị các biến sẽ khác nhau và do đó, chương trình sẽ “fail”.
Đây chính là bản chất của vấn đề lập trình thßi gian thực. Cần phải quản lý các
ngắt không đồng bộ để chúng không xảy ra vào những thời điểm không thích
hợp.
Có một giải pháp, dù không hay cho lắm, để giải quyết vấn đề này. Ta có thể dùng
một lệnh vô hiệu hoá ngắt (CLI) trước khi cập nhật biến Cur_temp và kích hoạt
ngắt bằng lệnh STI sau khi cập nhật biến Set_temp. Việc làm này giúp các ngắt
tránh khỏi phiền phức của việc cập nhật liên tục như đã đề cập. Có vẻ như chúng
ta đã sáng suốt khi sử dụng các lệnh CLI và STI như một chìa khoá cho một giải
pháp đúng đắn, nhưng nếu chỉ đơn giản là rải các lệnh CLI và STI trong code của
chương trình thì cũng chẳng khác gì việc sử dụng các lệnh “go to” và các biến toàn cục.
Võ Duy Thành – coinsking208@yahoo.com 6/6
Downloaded by Ng?c Di?p ??ng (ngocdiep10012000@gmail.com)