Tài liệu Lập trình hệ thống Chương 1
Phạm Hùng Kim Khánh Trang 1
Chương 1
KIẾN TRÚC VÀ HOẠT ĐỘNG CỦA HỆ VI XỬ LÝ /
MÁY TÍNH
1. Cấu trúc luận lý
Máy tính số (Digital computer) là máy giải quyết các vấn đề bằng cách thực hiện
các chỉ thị do con người cung cấp. Chuỗi các chỉ thị này gọi là chương trình (program).
Các mạch điện tử trong một máy tính số sẽ thực hiện một số giới hạn các chỉ thị đơn giản
cho trước. Tập hợp các chỉ thị này gọi là tập lệnh của máy tính. Tất cả các chương trình
muốn thực thi
đều phải được biến đổi sang tập lệnh trước khi được thi hành. Các lệnh cơ
bản là:
- Cộng 2 số.
- So sánh với 0.
- Di chuyển dữ liệu.
Tập lệnh của máy tính tạo thành một ngôn ngữ giúp con người có thể tác động lên
máy tính, ngôn ngữ này gọi là ngôn ngữ máy (machine language). Tuy nhiên, hầu hết các
ngôn ngữ máy đều đơn giản nên để thực hiện một yêu cầu nào đó, người thiết k
ế phải
thực hiện một công việc phức tạp. Đó là chuyển các yêu cầu này thành các chỉ thị có chứa
trong tập lệnh của máy. Vấn đề này có thể giải quyết bằng cách thiết kế một tập lệnh mới
thích hợp cho con người hơn tập lệnh đã cài đặt sẵn trong máy (built-in). Ngôn ngữ máy
sẽ được gọi là ngôn ngữ cấp 1 (L1) và ngôn ngữ vừa được hình thành gọi là ngôn ngữ cấ
p
2 (L2).
Tuy nhiên, trong thực tế, để có thể thực hiện được, các ngôn ngữ L1 và L2 không
được khác nhau nhiều. Như vậy, ngôn ngữ L2 cũng không thật sự giúp ích nhiều cho
người thiết kế. Do đó, một tập lệnh kế tiếp được hình thành sẽ hướng về con người nhiều
hơn là máy tính, tập lệnh này sẽ tạo thành một ngôn ngữ và ta gọi là ngôn ngữ L3. Ta có
thể viết các chương trình trong L3 như là đã tồn tạ
i máy tính sử dụng ngôn ngữ L3 (máy
ảo L3). Các chương trình này sẽ được dịch sang ngôn ngữ L2 và được thực thi bằng một
chương trình dịch L2.
Việc xây dựng toàn bộ chuỗi các ngôn ngữ, mỗi ngôn ngữ được tạo ra sẽ thích hợp
hơn ngôn ngữ trước đó sẽ có thể tiếp tục cho đến khi nhận được ngôn ngữ thích hợp nhất.
Sơ đồ một máy ảo n cấp có thể biểu diễn nh
ư sau:
Tài liệu Lập trình hệ thống Chương 1
Phạm Hùng Kim Khánh Trang 2
Một máy tính số có n cấp có thể xem như có n-1 máy ảo khác nhau, mỗi máy ảo có
một ngôn ngữ máy riêng. Các chương trình viết trên các máy ảo này không thể thực thi
trực tiếp mà phải dịch thành các ngôn ngữ máy cấp thấp hơn. Chỉ có máy thật dùng ngôn
ngữ máy L1 mới có thể thực thi trực tiếp bằng các mạch điện tử. Một lập trình viên sử
dụng máy ảo cấp n không cần biết tấ
t cả các trình dịch này. Chương trình trong máy ảo
cấp n sẽ được thực thi bằng cách dịch thành ngôn ngữ máy cấp thấp hơn và ngôn ngữ máy
này sẽ được dịch thành ngôn ngữ máy thấp hơn nữa hay dịch trực tiếp thành ngôn ngữ
máy L1 và thực thi trực tiếp trên các mạch điện tử.
Cấp n
Cấp 3
Cấp 2
Cấp 1
Máy ảo Mn dùng ngôn
ngữ máy Ln
Chương trình trong Ln được dịch thành
ngôn ngữ của máy cấp thấp hơn
Máy ảo M3 dùng ngôn
ngữ máy L3
Chương trình trong L3 được dịch thành
ngôn ngữ L2 hay L1
Máy ảo M2 dùng ngôn
ngữ máy L2
Chương trình trong L2 được dịch thành
ngôn ngữ máy L1
Máy tính số M1 dùng
ngôn ngữ máy L1
Chương trình trong L1 được thực thi trực
tiếp bằng các mạch điện tử
Hình 1.1. Máy ảo n cấp
Tài liệu Lập trình hệ thống Chương 1
Phạm Hùng Kim Khánh Trang 3
Về cơ bản, máy tính gồm có 6 cấp:
Cấp 0 chính là phần cứng của máy tính. Các mạch điện tử của cấp này sẽ thực thi
các chương trình ngôn ngữ máy của cấp 1. Trong cấp logic số, đối tượng quan tâm là các
cổng logic. Các cổng này được xây dựng từ một nhóm các transistor.
Cấp 1 là cấp ngôn ngữ máy thật sự. Cấp này có một chương trình gọi là vi chương
trình (microprogram), vi chương trình có nhiệm vụ thông dị
ch các chỉ thị của cấp 2. Hầu
hết các lệnh trong cấp này là di chuyển dữ liệu từ phần này đến phần khác của máy hay
thực hiện việc một số kiểm tra đơn giản.
Mỗi máy cấp 1 có một hay nhiều vi chương trình chạy trên chúng. Mỗi vi chương
trình xác định một ngôn ngữ cấp 2. Các máy cấp 2 đều có nhiều điểm chung ngay cả các
máy cấp 2 của các hãng sản xuất khác nhau. Các lệnh trên máy cấ
p 2 được thực thi bằng
cách thông dịch bởi vi chương trình mà không phải thực thi trực tiếp bằng phần cứng.
Cấp thứ 3 thường là cấp hỗn hợp. Hầu hết các lệnh trong ngôn ngữ của cấp máy
này cũng có trong ngôn ngữ cấp 2 và đổng thời có thêm một tập lệnh mới, một tổ chức bộ
Cấp 5
Cấp ngôn ngữ hướng vấn đề
Dịch (chương trình dịch)
Cấp 4
Cấp ngôn ngữ hợp dịch
Dịch (hợp dịch)
Cấp 3
Cấp hệ điều hành
Dịch 1 phần (hệ điều hành)
Cấp 2
Cấp máy quy ước
Thông dịch (vi chương trình)
Cấp 1
Cấp vi lập trình
Vi chương trình (phần cứng)
Cấp 0
Cấp logic số
Hình 1.2 – Các cấp trên máy tính số
Tài liệu Lập trình hệ thống Chương 1
Phạm Hùng Kim Khánh Trang 4
nhớ khác và khả năng chạy 2 hay nhiều chương trình song song. Các lệnh mới thêm vào
sẽ được thực thi bằng một trình thông dịch chạy trên cấp 2, gọi là hệ điều hành. Nhiều
lệnh cấp 3 được thực thi trực tiếp do vi chương trình và một số lệnh khác được thông dịch
bằng hệ điều hành (do đó, cấp này là cấp hỗn hợp).
Cấp 4 thật sự là dạng tượng trưng cho m
ột trong các ngôn ngữ. Cấp này cung cấp
một phương pháp viết chương trình cho các cấp 1, 2, 3 dễ dàng hơn. Các chương trình
viết bằng hợp ngữ được dịch sang các ngôn ngữ của cấp 1, 2, 3 và sau đó được thông dịch
bằng các máy ảo hay thực tương ứng.
Cấp 5 bao gồm các ngôn ngữ được thiết kế cho người lập trình nhằm giải quyết
một vấn đề cụ thể. Các ngôn ngữ này được gọi là c
ấp cao. Một số ngôn ngữ cấp cao như
Basic, C, Cobol, Fortran, Lisp, Prolog, Pascal và các ngôn ngữ lập trình hướng đối tượng
như C++, J++, … Các chương trình viết bằng các ngôn ngữ này thường được dịch sang
cấp 3 hay 4 bằng các trình biên dịch (compiler).
2. Giao tiếp ngoại vi
Ta phân biệt tất cả 3 phương pháp xuất / nhập dữ liệu:
- Nhập / xuất bằng cách hỏi trạng thái của thiết bị ngoại vi (polling)
- Nhập / xuất bằng ngắt (interrupt).
- Nhập / xuất bằng cách truy xuất trực tiếp vào bộ nhớ dùng các phần cứng phụ
trợ (DMA).
2.1. Nhập / xuất dữ liệu bằng cách hỏi vòng (polling)
Ta biết rằng vấn đề
điều khiển nhập / xuất dữ liệu sẽ rất đơn giản trong trường hợp
thiết bị ngoại vi lúc nào cũng có thể làm việc với μP. Ta có thể ví dụ như bộ hiển thị Led
7 đoạn lúc nào cũng sẵn sàng hiển thị dữ liệu khi mà μP gởi dữ liệu ra. Tuy nhiên, trong
thực tế, không phải lúc nào μP cũng làm việc với các thiết bị ngoại vi có tính n
ăng như
trên. Ví dụ như khi làm việc với một máy in, μP yêu cầu in nhưng máy in không sẵn sàng
(giả sử như hết giấy, kẹt giấy, …). Khi đó, μP phải kiểm tra xem một thiết bị mà nó cần
giao tiếp có sẵn sàng hay không nếu thiết bị sẵn sàng thì mới thực hiện trao đổi dữ liệu.
Để kiểm tra các thiết bị ngoại vi, μP phải sử dụng các tín hiệu bắt tay (handshake) xác
định tuần tự từng thiết bị, xem thiết bị nào có yêu cầu trao đổi dữ liệu. Các tín hiệu này
lấy từ các mạch giao tiếp do người thiết kế tạo ra.
Giả sử hệ thống có 2 thiết bị ngoại vi, nếu thiết bị 1 có dữ liệu cần truyền đến μP
thì nó sẽ gởi 1 xung để chốt dữ liệu đồng thời tạo tín hiệu sẵn sàng cho thiết b
ị. Khi μP
kiểm tra tín hiệu sẵn sàng của thiết bị 1 thì nó sẽ đọc dữ liệu vào từ mạch chốt và xoá tín
hiệu sẵn sàng.
Trong trường hợp μP muốn gởi dữ liệu ra thiết bị 2, nó sẽ đọc tín hiệu sẵn sàng của
thiết bị 2, nếu thiết bị 2 có thể nhận dữ liệu thì μP sẽ gởi dữ liệu ra mạch chốt và thiết bị
2
sẽ đọc dữ liệu vào.
Tài liệu Lập trình hệ thống Chương 1
Phạm Hùng Kim Khánh Trang 5
2.2. Ngắt và xử lý ngắt
Trong cách thức thực hiện trao đổi dữ liệu bằng cách hỏi vòng như trên, trước khi
tiến hành thực hiện thì μP phải kiểm tra trạng thái sẵn sàng của thiết bị ngoại vi. Tuy
nhiên trong thực tế ta cần phải tận dụng khả năng của μP để làm các công việc khác mà
không phải tốn thời gian kiểm tra thiết bị, chỉ khi nào có yêu cầu trao đổi dữ li
ệu thì mới
tạm dừng công việc hiện tại. Cách làm việc như vậy gọi là ngắt μP, khi có một ngắt xảy ra
thì ta phải thực hiện gọi các chương trình phục vụ ngắt tại các địa chỉ xác định của μP.
Các tín hiệu ngắt từ thiết bị ngoại vi đưa vào μP thông qua các chân NMI hay INTR.
2.2.1. Các loại ngắt
Ngắt cứng
: là các yêu cầu ngắt từ các chân NMI hay INTR.
Ngắt cứng NMI là ngắt không che được còn ngắt cứng INTR có thể che được. Các
lệnh CLI (Clear Interrupt) và STI (Set Interrupt) chỉ ảnh hưởng đến việc μP có chấp nhận
yêu cầu ngắt tại chân INTR hay không. Yêu cầu ngắt tại chân INTR có thể có các kiểu
ngắt từ 00h ÷ FFh. Kiểu ngắt này sẽ được đưa vào bus dữ liệu để μP xác định kiểu ngắt
(dùng cho các thiết bị ngoại vi khác nhau).
Ngắt mềm
: là các ngắt thực hiện bằng phần mềm tác động do người sử dụng.
2.2.2. Đáp ứng của μP khi có yêu cầu ngắt
Khi có yêu cầu ngắt đến μP và nếu được phép ngắt, μP sẽ thực hiện các công việc
sau:
- [SP] ← SP – 2, [SP] ← FR (Flag Register): cất thanh ghi cờ vào stack.
- IF ← 0, TF ← 0: không cho thực hiện các ngắt khác.
- SP ← SP – 2, [SP] ← CS: cất địa chỉ đoạ
n mã vào stack.
- SP ← SP – 2, [SP] ← IP: cất địa chỉ trở về sau khi phục vụ ngắt
74LS245
2
3
4
5
6
7
8
9
19
1
18
17
16
15
14
13
12
11
A1
A2
A3
A4
A5
A6
A7
A8
G
DIR
B1
B2
B3
B4
B5
B6
B7
B8
INT2
INT1
INT7
INT5
VCC
INT6
INT4
INT0
1
2
3
4
5
6
11
12
8
INT3
8086
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
GND
AD14
AD13
AD12
AD11
AD10
AD9
AD8
AD7
AD6
AD5
AD4
AD3
AD2
AD1
AD0
NMI
INTR
CLK
GND RESET
READY
TEST
INTA (QS1)
ALE (QS0)
DEN (S0)
DT/R (S1)
IO/M (S2)
WR (LOCK)
HLDA (RQ/GT1)
HOLD (RQ/GT0)
RD
MN/MX
BHE/S7
A19/S6
A18/S5
A17/S4
A16/S3
AD15
VCC
Hình 1.3 – Kết nối ngắt đơn giản
Tài liệu Lập trình hệ thống Chương 1
Phạm Hùng Kim Khánh Trang 6
- IP ← [Số_hiệu_ngắt*4], CS ← [Số_hiệu_ngắt*4 + 2]: lấy lệnh tại địa chỉ phục
vụ ngắt tương ứng
- Sau khi kết thúc chương trình con phục vụ ngắt (khi gặp lệnh IRET):
+ IP ← [SP], SP ← SP + 2
+ CS ← [SP], SP ← SP + 2: lấy lại địa chỉ trước khi gọi chương trình phục vụ
ngắt
+ FR ← [SP], SP ← SP + 2: lấy lại giá trị thanh ghi cờ
2.2.3. Xử lý ưu tiên ngắt
Như ta đã biết ở trên, khi μP đang thực hiện lệnh, nếu có ngắt xảy ra thì μP sẽ tạm
ngừng chương trình và thực thi chương trình con phục vụ ngắt. Trong thực tế sẽ có trường
hợp có nhiều yêu cầu ngắt khác nhau cùng một lúc, khi đó μP sẽ phục vụ cho ngắt theo
thứ tự ưu tiên với nguyên tắc là ngắt nào có mức
ưu tiên cao nhất thì sẽ phục vụ cho ngắt
đó trước.
Các mức ưu tiên của các ngắt (từ mức thấp nhất đến mức cao nhất):
- Ngắt thực hiện chạy từng lệnh (INT 1)
- Ngắt che được INTR
- Ngắt không che được NMI
- Ngắt nội bộ (INT 0: xảy ra do phép chia số 0, ngắt mềm)
2.3. Nhập / xuất dữ liệu bằng DMA (Direct Memory Access)
Trong các phương th
ức trao đổi dữ liệu như hai phần trên đã trình bày thì việc trao
đổi dữ liệu giữa thiết bị ngoại vi và hệ thống thường theo trình tự sau: từ ngoại vi đến vi
xử lý rồi đi vào bộ nhớ hay từ bộ nhớ đến vi xử lý rồi ghi ra ngoại vi. Trong thực tế sẽ
có trường hợp ta cần thực hiện trao đổi dữ liệu ngay giữa ngoại vi và bộ
nhớ. Khi đó
người ta đưa ra cơ chế truy xuất bộ nhớ trực tiếp (DMA). Để thực hiện được vấn đề này,
các hệ vi xử lý thông thường dùng thêm các mạch chuyên dụng để điều khiển quá trình
truy xuất bộ nhớ trực tiếp (DMAC – Direct Memory Access Controller). Có tất cả 3 cơ
chế hoạt động:
¾ Tận dụng thời gian CPU không dùng bus:
Ta phải dùng thêm mạch phát hiện các chu kỳ xử
lý nội của CPU và tận dụng các
chu kỳ này để thực hiện trao đổi dữ liệu.
¾ Treo CPU để trao đổi từng byte:
CPU không bị treo trong khoảng thời gian dài mà chỉ bị treo trong thời gian ngắn
đủ để trao đổi 1 byte dữ liệu giữa bộ nhớ và ngoại vi. Do đó, công việc của CPU không bị
gián đoạn mà chỉ bị chậm đi.
¾ Treo CPU một khoảng thời gian để trao đổi mộ
t khối dữ liệu:
Trong cơ chế này, CPU bị treo trong suốt quá trình trao đổi dữ liệu.
- CPU ghi từ lệnh và từ chế độ làm việc vào DMAC.
- Khi thiết bị ngoại vi có yêu cầu trao đổi dữ liệu, nó gởi tín hiệu DRQ = 1
(DMA Request) đến DMAC.