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

Nghiên cứu, thiết kế hệ điều hành trên bộ vi điều khiển 8 bít

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 (705.14 KB, 43 trang )

-2-

bộ giáo dục và đào tạo
trờng đại học bách khoa hà nội

Lời cam đoan

----------------------------------------Tôi xin cam đoan bản luận văn này là kết quả nghiên cứu của bản thân dới
sự hớng dẫn của TS. Nguyễn Linh Giang. Nếu có gì sai phạm, tôi xin hoàn toàn
chịu trách nhiệm.

luận văn thạc sỹ khoa học

Nghiên cứu, thiết kế hệ điều hành trên
bộ vi điều khiển 8 bít
ngành: xử lý thông tin và truyền thông
M số:

vũ trung kiên
Ngời hớng dẫn khoa học: TS. Nguyễn Linh Giang

hà nội 2006

Ngời làm cam đoan

Vũ Trung Kiên


-3-

Mục lục



-42.2.1. Tổng quan về các ngôn ngữ lập trình cho vi điều khiển. ......................... 39
2.2.2. Những vấn đề với ngôn ngữ C viết cho các bộ vi điều khiển................... 42

Chơng 3 - thiết
Lời cam đoan.....................................................................................................2
Danh mục các ký hiệu, các chữ viết tắt ..........................................................5
Danh mục các bảng ..........................................................................................6

kế hệ vi điều khiển ............................49

3.1. Xác định yêu cầu thiết kế. ........................................................................... 50
3.2. Lựa chọn cấu hình cho hệ thống................................................................. 51

Lời nói đầu ........................................................................................................9

3.2.1. Lựa chọn bộ điều khiển trung tâm. .......................................................... 51
3.2.2. Giao diện ngời sử dụng. ......................................................................... 52
3.2.3. Các thiết bị mô phỏng quá trình hoạt động của tiến trình. ...................... 53
3.3. Thiết kế mạch điện....................................................................................... 58

Chơng 1 - Tổng

3.4. Đo thử và kiểm tra lỗi. ................................................................................. 59

Danh mục các hình vẽ, đồ thị ..........................................................................7

quan về hệ điều hành ......................11

1.1. Khái niệm về hệ điều hành (OS-Operating System)................................. 11

1.1.1. Khái niệm................................................................................................. 11
1.1.2. Chức năng của hệ điều hành. ................................................................... 11
1.1.3. Các thành phần của hệ điều hành............................................................. 13
1.2. Quản lý tiến trình......................................................................................... 16
1.2.1. Các trạng thái của một tiến trình.............................................................. 16
1.2.2. Khái niệm về tài nguyên găng và đoạn tới hạn .................................... 17
1.2.3. Hiện tợng bế tắc ..................................................................................... 19
1.3. Lập lịch cho CPU ......................................................................................... 20
1.3.1. Khái niệm giờ CPU .................................................................................. 20
1.3.2. Các trạng thái của tiến trình liên quan đến giờ CPU................................ 20
1.3.3. Lập lịch cho CPU ..................................................................................... 22
1.4. Quản lý bộ nhớ ............................................................................................. 25
1.4.1. Yêu cầu phải quản lý bộ nhớ ................................................................... 25
1.4.2. Các sơ đồ quản lý bộ nhớ......................................................................... 26

Chơng 2 -

Vi điều khiển và ngôn ngữ lập trình

cho vi điều khiển ......................................................................28
2.1. Vi điều khiển ........................................................................................28
2.1.1. Vi xử lý và vi điều khiển.......................................................................... 28
2.1.2. Tổ chức bộ nhớ của vi điều khiển. ........................................................... 30
2.1.3. Các bộ định thời. ...................................................................................... 35
2.1.4. Bộ xử lý ngắt. ........................................................................................... 37
2.2. Ngôn ngữ lập trình cho vi điều khiển......................................................... 39

Chơng 4 - Thiết

kế hệ điều hành .....................................60


4.1.1. Mục đích và yêu cầu thiết kế. .................................................................. 60
4.1.2. Mục đích. ................................................................................................. 60
4.1.2. Yêu cầu .................................................................................................... 63
4.2. Trình tự thiết kế hệ điều hành. ................................................................... 64
4.3. Xây dựng các tiến trình. .............................................................................. 65
4.3.1. Xây dựng các tác vụ tơng ứng các tiến trình.......................................... 65
4.3.2. Giải quyết bài toán tài nguyên găng ........................................................ 69
4.4. Lập lịch cho CPU. ........................................................................................ 71
4.4.1. Sự kiện và chuyển trạng thái giữa các tiến trình. ..................................... 71
4.4.2. Lập lịch cho CPU ..................................................................................... 80
4.5. Quản lý bộ nhớ. ............................................................................................ 83

Kết luận và kiến nghị .....................................................................................86
Tài liệu tham khảo .........................................................................................87


-5-

-6-

Danh môc c¸c ký hiÖu, c¸c ch÷ viÕt t¾t

Danh môc c¸c b¶ng

STT

Ch÷ viÕt t¾t

Ch÷ ®Çy ®ñ


1

FCFS

First Come First Served

2

FIFO

First In First Out

3

LIFO

Last In First Out

4

MCS

Micro Controller System

5

OS

6


RTOS

7

RR

Round Robbin

8

SJF

Shortest Job First

9

SRT

Shortest Remain Time

10

uC

B¶ng 1.1. Tr¹ng th¸i cña c¸c tiÕn tr×nh............................................................... 19
B¶ng 1.2. Thêi gian thùc hiÖn cña c¸c tiÕn tr×nh................................................ 25

Operating System
Real Time Operating System


Micro Controller

B¶ng 1.3. Thêi gian chê cña c¸c tiÕn tr×nh......................................................... 25
B¶ng 2.1. Bé nhí d÷ liÖu trªn chÝp cña AT89S52 .............................................. 33


-7-

-8Hình 4.5. Các tiến trình đợc phân bổ thời gian CPU bằng nhau ...................... 71
Hình 4.6. Chuyển giữa các tiến trình bằng sự kiện time out .............................. 73

Danh mục các hình vẽ, đồ thị

Hình 4.7. Các tiến trình đợc phân bổ thời gian CPU khác nhau ...................... 74
Hình 4.8. Ngời sử dụng ra lệnh vào các thời điểm khác nhau ......................... 75
Hình 4.9. Chuyển giữa cá tiến trình bằng sự kiện interrupt ............................... 76

Hình 1.1. Các trạng thái của một tiến trình ........................................................ 17
Hình 1.2. Các trạng thái của tiến trình liên quan đến giờ CPU.......................... 20
Hình 1.3. Sơ đồ thực hiện tiến trình ................................................................... 21
Hình 1.4. Sơ đồ tổ chức hàng đợi các tiến trình ................................................. 22
Hình 1.5. Sơ đồ Grant......................................................................................... 25
Hình 2.1. Sơ đồ khối của bộ vi điều khiển AT89S52 ......................................... 29
Hình 2.2. Tổ chức bộ nhớ của vi điều khiển ...................................................... 30
Hình 2.3. Sơ đồ ghép nối AT89S52 với EPROM ............................................... 31
Hình 2.4. Sơ đồ ghép nối AT89S52 với RAM .................................................. 34
Hình 2.5. Giải mã địa chỉ cho các vi mạch nhớ ................................................. 34
Hình 2.6. Bộ nhớ dữ liệu đọc nh bộ nhớ chơng trình ..................................... 35
Hình 2.7. Hoạt động của Timer0 và Timer1 ở chế độ 1..................................... 36

Hình 2.8. Các nguồn ngắt của AT89S52 ............................................................ 38
Hình 3.1. Trình tự thiết kế phần cứng cho hệ thống.......................................... 49
Hình 3.2. Sơ đồ khối của hệ vi điều khiển ......................................................... 51
Hình 3.3. Ghép nối vi điều khiển với RAM ngoài. ............................................ 52
Hình 3.4. Giao diện ngời sử dụng trên hệ vi điều khiển................................... 53
Hình 3.5. Hiển thị trên LED 7 đoạn bằng kỹ thuật quét .................................... 54
Hình 3.6. Ghép nối ma trận LED trên hệ vi điều khiển ..................................... 57
Hình 3.7. Nguyên tắc xếp chữ trên ma trận LED............................................... 58
Hình 4.1. Các tác vụ đợc thực hiện đồng thời (song song) .............................. 62
Hình 4.2. Các tác vụ đợc thực hiện luân phiên liên tục.................................... 62
Hình 4.3. Giản đồ xung trên P1.......................................................................... 69
Hình 4.4. Chốt lại giá trị của P1 ......................................................................... 70

Hình 4.9. Mô tả trạng thái của các tài nguyên của tiến trình. ............................ 77
Hình 4.10. Các tài nguyên cần lu khi dừng một tiến trình. .............................. 78
Hình 4.11. Phân bổ ngăn xếp cho các tiến trình ................................................ 79
Hình 4.12. Lập lịch cho 8 tiến trình thực hiện quét chữ trên ma trận LED ....... 81
Hình 4.13. Lập lịch cho 4 tiến trình quét các số trên 4 LED 7 đoạn ................. 81
Hình 4.14. Lập lịch cho tiến trình điều khiển LCD........................................... 82
Hình 4.15. Lập lịch cho tiến trình thời gian thực .............................................. 82
Hình 4.16. Tổ chức bộ nhớ ROM của hệ vi điều khiển ..................................... 83
Hình 4.17. Thay đổi vị trí đặt các chơng trình con phục vụ ngắt..................... 84
Hình 4.18. Phân bổ bộ nhớ ROM....................................................................... 85
Hình 4.19. Phân bổ bộ nhớ RAM....................................................................... 85


-9-

-10-


Lời nói đầu

xã hội, hiện nay các môn học về hệ nhúng đã và đang đợc đa vào giảng dạy tại
các trờng Cao đẳng và Đại học. Tuy nhiên để có một hiệu qủa giảng dạy tốt

Cùng với sự phát triển của khoa học kỹ thuật, cụm từ tự động hoá đã trở
nên hết sức phổ thông. Từ các máy móc tự động trong các nhà máy xí nghiệp

nhất thì cần có một phơng pháp nghiên cứu và thiết kế đúng chính tắc và cũng
cần phải có một thiết bị phục vụ qua trình thí nghiệm.

thay thế cho sức lao động của công nhân, từ các đồ gia dụng tự động trong gia

Trờng Đại học Công nghiệp Hà nội là một trờng đào tạo các cử nhân và

đình giúp ích cho ngời nội trợ...nói chung các thiết bị có khả năng tự động hoá

các kỹ s thực hành. Trong chơng trình đào tạo cũng đã có môn kỹ thuật vi điều

xuất hiện ở khắp mọi nơi. Một câu hỏi đặt ra với khá nhiều ngời là nhờ đâu mà

khiển, đây có thể coi là nền tảng để tiếp cận với các hệ thống nhúng sử dụng vi

các thiết bị có khả năng tự động đợc? Để trả lời câu hỏi này chúng ta cần phải đi

điều khiển có hệ điều hành. Việc nghiên cứu để đa vào giảng dạy môn thiết kế

từ khi có cụm từ tự động hoá ra đời.

hệ điều hành cho các hệ vi điều khiển là phù hợp với yêu cầu hiện tại.


Trớc kia, khi cha có công nghệ bán dẫn, các phần tử có tiếp điểm nếu

Với sự hớng dẫn của TS Nguyễn Linh Giang, trong khuôn khổ luận văn

đợc đầu nối với nhau theo một mạch logic nào đó thì vẫn có thể tạo ra một hệ

này, tôi mạnh dạn nghiên cứu về các nguyên tắc cơ bản khi thiết kế một hệ điều

thống tự động, tuy nhiên khả năng đáp ứng và tính tự động cả hệ thống này

hành trên hệ vi điều khiển.

không cao. Công nghệ bán dẫn ra đời, nó giải quyết đợc hạn chế về đáp ứng (tốc
độ) của các phần tử có tiếp điểm tuy nhiên cũng phải chờ đến khi có sự xuất hiện
của các bộ vi xử lý, các hệ thống có tính tự động hoá cao mới ra đời. Đặc trng
của các hệ thống này đợc mô tả bằng một công thức đơn giản: Phần cứng +
Phần mềm = ứng dụng. Theo công thức này thì khi tuỳ biến một trong 2 thành

Nội dung của luận văn bao gồm 4 chơng, trong đó:
Chơng 1: Giới thiệu tổng quan hệ điều hành.
Chơng 2: Giới thiệu bộ vi điều khiển đợc sử dụng để viết hệ điều hành và
ngôn ngữ lập trình cho vi điều khiển.

phần là phần cứng hoặc phần mềm thì sẽ cho ra ứng dụng khác. Thông thờng

Chơng 3. Thiết kế phần cứng hệ vi điều khiển.

phần mềm là thành phần đợc tuỳ biến.


Chơng 4. Thiết kế hệ điều hành cho hệ vi điều khiển

Một hệ thống với các bộ vi xử lý có thể giả các suy nghĩ và hành động của
con ngời vì lý do đơn giản là chúng hoạt động theo một chơng trình của ngời
thiết kế đa vào mà chơng trình chính là các thuật toán là ý nghĩ của ngời lập
trình. Nh vậy để một hệ thống có tính thông minh, tự động hoá cao thì phần
mềm viết cho nó là vấn đề hết sức quan trọng.

Do thời gian và khả năng có hạn nên luận văn này sẽ còn nhiều thiếu sót.
Rất mong đợc sự góp ý và thông cảm của các thầy giáo, cô giáo.
Hà nội, ngày 30 tháng 10 năm 2006
Học viên

Một hệ thống với cùng một phần cứng nhng nếu nó đợc viết hệ điều hành
thì khả năng của nó sẽ trở nên mạnh hơn rất nhiều so với một hệ thống chỉ có
một chơng trình tuần tự. Với mục đích không ngừng đáp ứng các nhu cầu của

Vũ Trung Kiên


-11-

Chơng 1 - Tổng quan về hệ điều hành

-12Để đạt đợc mục tiêu trên hệ điều hành phải thực hiện 2 chức năng chính
sau đây:

1.1. Khái niệm về hệ điều hành (OS-Operating System)
1.1.1. Khái niệm
Khó có một khái niệm hay định nghĩa chính xác về hệ điều hành, vì hệ điều

hành là một bộ phận đợc nhiều đối tợng khai thác nhất, họ có thể là ngời sử
dụng thông thờng, có thể là lập trình viên, có thể là ngời quản lý hệ thống và
tuỳ theo mức độ khai thức hệ điều hành mà họ có thể đa ra những khái niệm
khác nhau.

- Tạo ra một hệ thông mở rộng bao gồm các thành phần vật lý và các thành
phần logic:
Nh chúng ta biết, một hệ thống khả trình (ví dụ nh máy tính) gồm các bộ
phận chính nh: Processor, Memory, I/O Device, Bus, vv, do đó để đối thoại
hoặc khai thác máy tính ngời sử dụng phải hiểu đợc cơ chế hoạt động của các
bộ phận này và phải tác động trực tiếp vào nó tất nhiên là bằng những con số 0,1
(ngôn ngữ máy). Điều này là quá khó đối với ngời sử dụng hệ điều hành phải
che đậy các chi tiết phần cứng máy tính bởi một máy tính mở rộng, máy tính mở

Khái niệm 1: Hệ điều hành là hệ thống chơng trình với các chức năng giám

rộng này có đầy đủ các chức năng của một máy tính thực nhng đơn giản và dễ

sát điều khiển việc thực hiện các chơng trình của ngời sử dụng quản lý và phân

sử dụng hơn. Theo đó khi cần tác động vào máy tính thực ngời sử dụng chỉ cần

chia tài nguyên cho nhiều chơng trình ngời sử dụng đồng thời sao cho việc

tác động vào máy tính mở rộng mọi sự chuyển đổi thông tin điều khiển từ máy

khai thác chức năng của hệ thống máy tính của ngời sử dụng là thuận lợi và hiệu

tính. Mục đích của chức năng này kà: Giúp ngời sử dụng khai thức các chức


quả nhất.

năng của phần cứng máy tính dễ dàng và hiệu quả hơn.

Khái niệm 2: Hệ điều hành là một chơng trình đóng vai trò nh giao diện
giữa ngời sử dụng và phần cứng máy tính nó quản lý và điều khiển phần cứng
cũng nh sự thực hiện của tất cả các chơng trình.

- Quản lý tài nguyên của hệ thống:
Tài nguyên hệ thống có thể là: prrocessor, Memory, I/O Device..., đây là
những tài nguyên mà hệ điều hành dùng để cấp phát cho các tiến trình, chơng

Khái niệm thứ hai rất gần với các hệ điều hành đang sử dụng trên các máy

trình trong quá trình điều khiển sự hoạt động của hệ thống. Khi ngời sử dụng

tính hiện nay trong khi khái niệm thứ nhất lại gần với các hệ thống đo lờng điều

cần thực hiện một chơng trình hay một chơng trình cần nạp thêm một tiến

khiển trong công nghiệp sử dụng các bộ điều khiển khả trình (Ví dụ nh vi điều

trình mới vào bộ nhớ thì hệ điều hành phải cấp phát không gian nhớ cho chơng

khiển).

trình, tiến trình đó để chơng trình, tíên trình đó nạp đợc vào bộ nhớ và hoạt

1.1.2. Chức năng của hệ điều hành.


động đợc. Trong môi trờng hệ điều hành đa nhiệm có thể có nhiều chơng

Có thể nói hệ điều hành là 1 hệ thống các chơng trình đóng vai trò trung
gian giữa ngời sử dụng và phần cứng. Nhiệm vụ chính của nó là cung cấp một
môi trờng thuận lợi để ngời sử dụng dễ dàng thực hiện các chơng trình ứng
dụng của họ trên máy tính và khai thác triệt để các chức năng của phần cứng.

trình, tiến trình đồng thời cần đợc nạp vào bộ nhớ nhng không gian lu trữ củâ
bộ nhớ có giới hạn do đó hệ điều hành phải tổ chức cấp phát bộ nhớ sao cho hợp
lý để đảm bảo tất cả các chơng trình tiến trình khi cần để đợc nạp vào bộ nhớ
để hoạt động. Ngoài ra hệ điều hành còn phải tổ chức bảo vệ các không gian nhớ
đã cấp cho các chơng trình tiến trình để tránh sự truy cập bất hợp lệ và sự tranh


-13-

-14-

chấp bộ nhớ giữa các chơng trình, tiến trình, đặc biệt là các tiến trình đồng thời

Trong quá trình hoạt động nếu vì một lý do nào đó tiến trình không thể tiếp

hoạt động trên hệ thống. Đây là một trong những nhiệm vụ quan trọng của hệ

rục hoạt động đợc thì hệ điều hành phải tạm dừng tiến trình thu hồi tài nguyên

điều hành.

mà tiến trình đang chiếm giữ, sau đó nếu diều kiện thuận lợi thì hệ điều hành


Trong quá trình hoạt động của hệ thống đặc bệt là các hệ thống đa ngời

phải tái kích hoạt tiến trình để tiến trình tiếp tục hoạt động cho đến khi kết thúc.

dùng đa chơng trình, đa tiến trình. Còn xuất hiện một hiện tợng khác, đó là

Trong các hệ thống có nhiều tiến trình hoạt động song song hệ điều hành

nhiều chơng trình, tiến trình đồng thời sử dụng một không gian nhớ hau một tập

phải giải quyết vấn đề tranh chấp tài nguyên giữa các tiến trình, đều phối

tin (dữ liệu, chơng trình) nào đó. Trong trờng hợp này hệ điều hành phải tổ

processor cho các tiến trình, giúp các tiến trình trao đổi thông tin và hoạt động

chức việc chia sẻ và giám sát việc truy xuất đồng thời trên các tài nguyên nói

đồng bộ với nhau, đảm bảo nguyên tắc tất cả các tiến trình đã đợc khởi tạo phải

trên sao cho việc sử dụng tài nguyên có hiệu quả nhng tránh đợc sự mất mát dữ

đợc thực hiện và kết thúc đợc.

liệu và làm hỏng các tập tin.
Hai dẫn chứng điển hình giúp chúng ra thấy vai trò của hệ điều hành trong
việc quản lý tài nguyên hệ thống sau này chúng ra sẽ thấy việc cấp phát, chia sẻ,
bảo vệ tài nguyên của hệ điều hành là một trong những công việc khó khăn và
phức tạp nhất. Hệ điều hành đã chi phí nhiều cho công việc nói trên để đát đợc


Tóm lại, bộ phận quản lý tiến trình của hệ điều hành phải thực hiện nhứng
nhiệm vụ sau đây:
Tạo lập, huỷ bỏ tiến trình.
Tạm dừng, tái kích hoạt động tiến trình.

mục tiêu: Trong mọi trờng hợp tất cả các chơng trình, tiến trình nếu cần đợc

Tạo cơ chế thông tin liên lạc giữa các tiến trình.

cấp phát tài nguyên để hoạt động thì sớm muộn nó đều đợc cấp phát và đợc

Tạo cơ chế đồng bộ hoá giữa các tiến trình.

đa vào trạng thái hoạt động.
1.1.3. Các thành phần của hệ điều hành
1.1.3.1. Thành phần quản lý tiến trình.
Hệ điều hành phải có nhiệm vụ tạo lập tiến trình và đa nó vào danh sách

1.1.3.2. Thành phần quản lý bộ nhớ.
Bộ nhớ chính là một trong những tài nguyên quan trọng của hệ thống, đây là
thiết bị lu trữ duy nhất mà CPU có thể truy xuất trực tiếp đợc.
Các chơng trình của ngời sử dụng muốn thực hiện đợc bởi CPU thì

quản lý tíên trình của hệ thống. Khi tiến trình kết thúc hệ điều hành phải loại bỏ

trwocs hết nó phải đợc hệ điều hành nạp vào bộ nhớ chính, chuyển đổi các địa

tiến trình ra lhỏi danh sác quản lý tiến trình của hệ thống.

chỉ sử dụng trong chơng trình thành những địa chỉ mà CPU có thể truy xuất


Hệ điều hành phải cung cấp đầy đủ tài nguyên để tiến trình đi vào hoạt động

đợc.

và phải đảm bảo đủ tài nguyên để duy trì sự hoạt động của tiến trình cho đến khi

Khi chơng trình, tiến trình có yêu cầu đợc nạp vào bộ nhớ thì hệ điều

tiến trình kết thúc. Khi tiến trình kết thúc hệ điều hành phải thu hồi những tài

hành phải cấp phát không gian nhớ cho nó. Khi chơng trình, tiến trình kết thúc

nguyên mà hệ điều hành đã cấp cho tiến trình.

thì hệ điều hành phải thi hồi lại không gian nhớ đã cấp phát cho chơng trình,
tiến trình trớc đó.


-15-

-16-

Trong các hệ thống đa chơng hay đa tiến trình, trong bộ nhớ tồn tại nhiều

Phát hiện và xử lý lỗi: quá trình trao đổi dữ liệu thờng xảy ra các lỗi nh:

chơng trình/ nhiều tiến trình, hệ điều hành phải thực hiện nhiệm vụ bảo vệ các

thiết bị vào/ra cha sẵn sàng, đờng truyền hỏng, vv, do đó hệ điều hành phải tạo


vùng nhớ đã cấp phát cho các chơng trình/tiến trình, tránh sự vi phạm trên các

ra các cơ chế thích hợp để phát hiện lỗi sớm nhất và khằc phục các lỗi vừa xảy ra

vùng nhớ của nhau.

nếu có thể.

Tóm lại, bộ phận quản lý bộ nhớ chính của hệ điều hành thực hiện những

1.2. Quản lý tiến trình

nhiệm vụ sau:

Tiến trình là một chơng trình đang xử lý, nó sở hữu một con trỏ lệnh, lập

Cấp phát, thu hồi vùng nhớ.

các thanh ghi và các biến. Để hoàn thành nhiệm vụ của mình, các tiến trình có

Chi nhận trạng thái bộ nhớ.

thể còn yêu cầu một số tài nguyên hệ thống nh: CPU, bộ nhớ và các thiết bị.

Bảo vệ bộ nhớ.

1.2.1. Các trạng thái của một tiến trình
Trạng thái của tiến trình tại mỗi thời điểm đợc xác định bởi hoạt động


Quyết định tiến trình nào đợc nạp vào bộ nhớ.
1.1.3.3. Thành phần quản lý vào ra.
Một trong những mục tiêu của hệ điều hành là giúp ngời sử dụng khai thức
hệ thống máy tính dễ dàng và hiệu quả, do đó các thao tác trao đổi thông tin trên
thiết bị xuất / nhập phải trong suốt đối với ngời sử dụng.
Để thực hiện đợc điều này hệ điều hành phải tồn tại một bộ phận điều

hiện thời của tiến trình tại thời điểm đó. Trong suốt khoảng thời gian tồn tại trong
hệ thống, một tiến trình có thể thay đổi trạng thái do rất nhiều nguyên nhân nh:
Chờ đợi sự kiện nào đó xảy ra, đợi một thao tác vào/ra hoàn tất, hết thời gian xử
lý...
Tại mỗi thời điểm, tiến trình có thể nhận một trong các trạng thái sau:

khiển thiết bị, bộ phận này phối hợp cùng CPU để quản lý sự hoạt động và trao

- Khởi tạo (new): Tiến trình đang đợc tạo lập.

đổi thông tin giữa hệ thóng, chơng trình ngời sử dụng và ngời sử dụng với các

- Sẵn sàng (ready): Tiến trình chờ đợc cấp phát CPU để xử lý.

thiết bị xuâts/nhập.

- Thực hiện (runing): Tiến trình đợc xử lý.

Bộ phận điều khiển thiết bị thực hiện những nhiệm vụ sau:
Gởi mã lệnh điều khiển đến thiết bị: Hệ điều hành điều khiển các thiết bị
bằng các mã điều khiển, do đó trớc khi bắt đầu một quá trình trao đổi dữ liệu
với thiết bị thì hệ điều hành phải gởi mã điểu khiển đến thiết bị.
Tiếp nhận yêu cần ngắt (Interrupt) từ các thiết bị khi cần trao đổi với hệ

thống khi nó phát ra một tín hiệu yêu cầu ngắt, hệ điều hành tiếp nhận yêu cầu
ngắt từ các thiết bị, xem xết và thực hiện một thủ tục để đáp ứng yêu cầu các
thiết bị.

- Đợi (waiting): Tiến trình phải dừng vì thiếu tài nguyên hoặc chờ một sự
kiện nào đó.
- Kết thúc (halt): Tiến trình đã hoàn tất công việc xử lý.
Các trạng thái của tiến trình có thể đợc biểu diễn qua sơ đồ (hình 1.1)


-17-

-18Sản xuất thông tin và chứa trong NextP;
Runing

Ready

New

Halt

...
While Counter = n do Skip;

Buffer [In]:=NextP;
In:= In + 1 mod n;
Waiting

Until false;


(Tiến trình C)
Hình 1.1. Các trạng thái của một tiến trình

Repeat
While Counter = 0 do Skip;

Hệ điều hành quản lý hoạt động của các tiến trình trong hệ thống thông

NextC:= Buffer [Out];

qua khối mô tả tiến trình (process control block - PCB). Khối mô tả tiến trình bao

Out:= Out + 1 mod n;

gồm các thành phần:

...

- Số thứ tự của tiến trình

Lấy thông tin trong chứa trong NextC

- Con trỏ trạng thái của tiến trình (cho biết trạng thái hiện tại của tiến

...

trình).

Until false;
- Vùng nhớ lu trữ giá trị các thanh ghi mà tiến trình đang sử dụng.

- Thông tin về tài nguyên tiến trình đang sử dụng hoặc đợc phép sử dụng.
1.2.2. Khái niệm về tài nguyên găng và đoạn tới hạn
Chúng ta cùng xem thuật toán sau:

ltem = ...;

Type

Var Buffer: array [0..n-1] of ltem;

End;
Nhận xét: Vì hai tiến trình P và C song hành nên có thể xảy ra trờng hợp
trong cùng 1 thời điểm, tiến trình P tăng biến Counter lên 1 (Counter:= Counter
+ 1) còn tiến trình C lại giảm biến Counter đi 1 (Counter:= Counter 1) dẫn tới
kết quả sai. Nh vậy biến Counter trong trờng hợp này đợc gọi là tài nguyên
găng. Đoạn trình sử dụng biến Counter gọi là đoạn tới hạn.

In. Out: 0..n-1

Định nghĩa:

Counter: 0..n

- Các tài nguyên logic và vật lý phân bổ cho các tiến trình song hành là tài

Begin

(Tiến trình P)
Repeat
...


nguyên găng.
Các đoạn trình sử dụng tài nguyên găng gọi là đoạn tới hạn (Critical
Section).


-19-

-20- Có hiện tợng chờ đợi vòng tròn.

1.2.3. Hiện tợng bế tắc

1.2.3.3. Các mức phòng tránh bế tắc

1.2.3.1. Khái niệm về bế tắc
Giả sử có hai tiến trình P1 và P song hành sử dụng các tài nguyên r1 và r,
đợc điều khiển bởi hai đèn hiệu S1 và S. Tại mỗi thời điểm, mỗi tài nguyên chỉ

Để tránh hiện tợng bế tắc, thông thờng hệ thống áp dụng ba mức:
- Ngăn chặn: áp dụng các biện pháp để hệ thống rơi vào trạng thái bế tắc.

phục vụ cho sự hoạt động của một tiến trình. Xét trạng thái:
Bảng 1.1. Trạng thái của các tiến trình

- Dự báo và tránh bế tắc:

áp dụng các biện pháp để kiểm tra các tiến trình

xem có bị rơi vào trạng thái bế tắc hay không. Nếu có thì thông báo trớc khi bế
P1


Thời điểm

P2

Wait (S1)

t1

Wait (S2)

...

t2

...

Wait (S2)

t3

...

1.3. Lập lịch cho CPU

t4

Wait (S1)

1.3.1. Khái niệm giờ CPU


tắc xảy ra.
- Nhận biết và khắc phục: Tìm cách phát hiện và giải quyết.

Nhận xét: Tại vị trí trên, sau thời điểm t3, tiến trình P1 rơi vào trạng thái

CPU là một loại tài nguyên quan trọng của máy tính. Mọi tiến trình muốn

chờ tài nguyên r2 đang đợc P2 sử dụng; Sau thời điểm t4, tiến trình P2 rơi vào

hoạt động đợc đều phải có sự phục vụ của CPU (để xử lý, tính toán...). Thời gian

trạng thái chờ tài nguyên r1 đang đợc tiến trình P1 sử dụng và bắt đầu từ đây, cả

mà CPU phục vụ cho tiến trình hoạt động đợc gọi là giờ CPU.

hai tiến trình rơi vào trạng thái chờ đợi vô hạn về hệ thống gặp bế tắc.
Nh vậy bế tắc là trạng thái khi hai hoặc nhiều tiến trình cùng chờ đợi một
số sự kiện nào đó và nếu không có tác động đặc biệt từ bên ngoài thì sự chờ đợi

Tại mỗi thời điểm nhất định, chỉ có một tiến trình đợc phân phối giờ CPU
để hoạt động (thực hiện các lệnh của mình).
1.3.2. Các trạng thái của tiến trình liên quan đến giờ CPU

đó là vô hạn.
Trong chế độ đa chơng trình, có ba trạng thái của tiến trình liên quan mật
1.2.3.2. Điều kiện xảy ra bế tắc trong hệ thống.

thiết đến giờ CPU bao gồm:


Hiện tợng bế tắc xảy ra khi và chỉ khi trong hệ thống tồn tại 4 điều kiện:

Runing

Ready

- Có tài nguyên găng
- Có hiện tợng giữ và đợi, có một tiến trình đang giữ một số tài nguyên và
đợi tài nguyên bổ sung đang đợc giữ bởi các tiến trình khác.
- Không có hệ thống phân phối lại tài nguyên: Việc sử dụng tài nguyên

Waiting

không bị ngắt.
Hình 1.2. Các trạng thái của tiến trình liên quan đến giờ CPU


-21-

-22-

- Sẵn sàng (ready): Là trạng thái mà tiến trình đợc phân phối đầy đủ mọi
tài nguyên cần thiết và đang chờ giờ CPU.

1.3.3. Lập lịch cho CPU
1.3.3.1. Khái niệm

- Thực hiện (running): Là trạng thái mà tiến trình đợc phân phối đầy đủ
mọi tài nguyên cần thiết và giờ CPU.


Để điều khiển tiến trình ở nhiều trạng thái khác, hệ thống thờng tổ chức
các từ trạng thái (thực chất là các khối điều khiển tiến trình) để ghi nhận tình

- Đợi (waiting): Là trạng thái tiến trình không thực hiện đợc vì thiếu một
vài điều kiện nào đó (đợi dữ liệu vào/ra, đợi tài nguyên bổ sung...). Khi sự kiện

trạng sử dụng tài nguyên và trạng thái tiến trình. Các từ trạng thái đợc tổ chức
theo kiểu đợi nh sau:

mà nó chờ đợi xuất hiện, tiến trình sẽ quay trở lại trạng thái sẵn sàng.
Nh vậy, trong suốt thời gian tồn tại của mình, các tiến trình sẽ tuân thủ

Ready queue

CPU

theo sơ đồ thực hiện sau:
Sử dụng CPU

Sử dụng CPU
Bắt đầu

Đợi I/O

Sử dụng CPU
Đợi I/O

I/O

I/O queue


I/O

I/O queue

Kết thúc

Hình 1.3. Sơ đồ thực hiện tiến trình

Một tiến trình đang trong trạng thái thực hiện, nó có thể rời khỏi trạng thái
bởi một trong ba lý do:

M

M

- Tiến trình đã hoàn thành công việc và chuyển sang trạng thái kết thúc, nó
trả lại giờ CPU cho hệ thống.

I/O

I/O queue

- Tiến trình tự ngắt: Khi tiến trình chờ đợi một sự kiện nào đó, tiến trình sẽ
đợc chuyển sang trạng thái thực hiện khi xuất hiện sự kiện nó đang chờ.
- Tiến trình sử dụng hết giờ CPU dành cho nó, khi đó nó sẽ đợc chuyển
sang trạng thái sẵn sàng.
Việc chuyển tiến trình sang trạng thái sẵn sàng về bản chất là thực hiện
việc phân phối lại giờ CPU.


Hình 1.4. Sơ đồ tổ chức hàng đợi các tiến trình

Nh vậy, lập lịch cho CPU có nghĩa là tổ chức một hàng đợi các tiến trình
sẵn sàng để phân phối giờ CPU cho chúng dựa trên độ u tiên của các tiến trình
sao cho hiệu suất sử dụng CPU là tối u nhất.
Mỗi tiến trình ở trạng thái sẵn sàng đợc gắn với một thứ tự u tiên. Thứ tự
u tiên này đợc xác định dựa vào các yếu tố nh: Thời điểm hình thành tiến
trình, thời gian thực hiện tiến trình, thời gian kết thúc tiến trình...


-23-

-24-

1.3.3.2. Một số thuật toán lập lịch cho CPU

vào hàng đợi vòng tròn và đợc đặt ở vị trí phục vụ ngay. Các tiến trình dù ngắn

1. First Come First Served (FCFS)

hay dài đều có độ u tiên phục vụ nh nhau.

Trong thuật toán này, độ u tiên phục vụ tiến trình căn cứ vào thời điểm
hình thành tiến trình. Hàng đợi các tiến trình đợc tổ chức theo kiểu FIFO. Mọi
tiến trình đều đợc phục vụ theo trình tự xuất hiện cho đến khi kết thúc hoặc bị

Trên thực tế, để đảm bảo độ u tiên cho các tiến trình dài, hệ thống sẽ
phân chia các tiến trình thành m lớp. Số lần đợc phục vụ và thời gian một lần
phục vụ tiến trình tại mỗi lớp khác nhau (giả sử ở lớp thứ i, tiến trình đợc phục
vụ k lần và mỗi lần với thời gian qi).


ngắt.
2. Shortest Job First (SJF).
Thuật toán SJF xác định thứ tự u tiên thực hiện tiến trình dựa vào tổng
thời gian thực hiện tiến trình. Tiến trình nào có tổng thời gian thực hiện ngắn sẽ
đợc u tiên phục vụ trớc.
3. Shortest Remain Time (SRT)
Tơng tự nh SJF nhng trong thuật toán này, độ u tiên thực hiện các tiến
trình dựa vào thời gian cần thiết để thực hiện nốt tiến trình (bằng tổng thời gian =
thời gian đã thực hiện). Nh vậy trong thuật toán này cần phải thờng xuyên cập
nhật thông tin về thời gian đã thực hiện tiến trình. Đồng thời chế độ phân bổ lại

Nếu sau khoảng thời gian đã đợc phân phối mà tiến trình cha kết thúc
hoặc không bị ngắt thì nó đợc chuyển sang lớp thứ i+1 (với ki+1 và qi+1 lớn hơn).
Lợng từ thời gian sẽ tăng dần cho đến khi tiến trình rơi vào lớp ngoài cùng (lớp
m). ở đó nó sẽ đợc phục vụ với lợng tử qm không đổi. Nh vậy thứ tự u tiên
của các tiến trình sẽ tăng dần theo thời gian xếp hàng đợi.
Ưu điểm của phơng pháp phục vụ đồng mức theo lớp sẽ cho phép hệ
thống u tiên những tiến trình ngắn (vì nó kết thúc sớm) nhng không gây tổn hại
lớn cho các tiến trình dài.
Nhợc điểm là do phải thờng xuyên phân phối lại giờ CPU nên thời gian
chờ đợi trung bình của Round Robin có thể lớn hơn so với FCFS.

giờ CPU cũng phải đợc áp dụng nếu không sẽ làm mất tính u việt của thuật
Chú ý: Trong thụât toán, cần chọn giá trị lợng tử thời gian (time

toán.

quantum) thích hợp. Nếu chọn giá trị time quantum lớn thì việc bổ sung tiến trình
4. Round Robin (RR)

Trong thuật toán này, hệ thống quy định một lợng tử thời gian (time
quantum) khoảng từ 10-100 mili giây. Mỗi tiến trình trong hàng đợi lần lợt đợc
phân phối một lợng tử thời gian để thực hiện. Sau khoảng thời gian đó, nếu tiến
trình cha kết thúc hoặc không rơi vào trạng thái đợi thì nó đợc chuyển về cuối
hàng đợi.
Hàng đợi các tiến trình đợc tổ chức theo kiểu vòng tròn và các tiến trình
luôn luôn đảm bảo đợc phục vụ. Khi có tiến trình mới phát sinh, nó sẽ đợc đa

mới hoặc kích hoạt tiến trình bị ngắt sẽ làm tăng thời gian chờ đợi trung bình
nhng ngợc lại nếu chọn giá trị time quantum nhỏ thì nó sẽ làm cho các tiến
trình phải liên tục chuyển trạng thái dẫn đến giảm hệ số hữu ích của CPU.
Thông thờng giá trị time quantum đợc chọn theo công thức: q = t/n hoặc
q=t/n s. Trong đó: t là thời gian khống chế trớc; n là số tiến trình; s thời gian
chuyển từ tiến trình này sang tiến trình khác.
Ví dụ: Cho dãy tiến trình với thời gian thực hiện tơng ứng theo bảng 1.2
và time quantum có giá trị q= 4


-25-

-26-

Bảng 1.2. Thời gian thực hiện của các tiến trình

Tiến trình

T thực hiện

P1


24

P2

3

P3

3

Hệ điều hành chịu trách nhiệm cấp phát không gian nhớ cho các tiến trình
khi có yêu cầu. Để thực hiện tốt nhiệm vụ này, hệ điều hành cần phải xem xét
một số khía cạnh sau:
- Sự tơng ứng giữa địa chỉ logic và địa chỉ vật lý: Làm thế nào để chuyển
đổi một địa chỉ logic thành một địa chỉ vật lý.
- Quản lý bộ nhớ vật lý bao gồm: Phân bổ không gian nhớ cho các tiến
trình hoạt động, thu hồi không gian nhớ khi tiến trình kết thúc, quản lý đợc

Sơ đồ Grant biểu thị thứ tự thực hiện các tiến trình nh hình 1.5.
P1
0

P2
4

P3
7

P1
10


P1
14

P1
18

P1
22

không gian nhớ tự do.

P1
26

30

- Chia sẻ thông tin: Cho phép các tiến trình đang hoạt động trong bộ nhớ
có thể chia sẻ thông tin với nhau.

Hình 1.5. Sơ đồ Grant

Theo sơ đồ này chúng ta thấy thời chờ đợi của các tiến trình nh bảng 1.2.
Bảng 1.3. Thời gian chờ của các tiến trình

- Bảo vệ bộ nhớ: Ngăn chặn các tiến trình xâm phạm đến vùng nhớ đợc
cấp phát cho các tiến trình khác.
1.4.2. Các sơ đồ quản lý bộ nhớ

Processes


T thực hiện

T đợi

P1

24

6

P3

3

1

P1

3

7

đợc sử dụng nh một bộ nhớ độc lập gọi là một phân hoạch. Mỗi phân hoạch có

Tổng

30

17


thể nạp đợc một chơng trình và tổ chức thực hiện một cách đồng thời. Nh vậy

Dẫn đến thời gian chờ đợi trung bình của các tiến trình là 17/3 = 5.66
1.4. Quản lý bộ nhớ
1.4.1. Yêu cầu phải quản lý bộ nhớ
Bộ nhớ là thiết bị lu trữ duy nhất mà thông qua đó CPU có thể trao đổi
thông tin với môi trờng bên ngoài. Do vậy, nhu cầu tổ chức, quản lý bộ nhớ là
một trong những nhiệm vụ cơ bản hàng đầu của hệ điều hành. Bộ nhớ đợc tổ
chức nh mảng một chiều các từ nhớ (word), mỗi từ nhớ có một địa chỉ. Việc
trao đổi thông tin với môi trờng bên ngoài đợc thực hiện thông qua các thao tác
đọc/ghi dữ liệu vào một địa chỉ cụ thể nào đó trong bộ nhớ.

1.4.2.1. Sơ đồ phân hoạch cố định
Bộ nhớ đợc chia thành n phần không nhất thiết phải bằng nhau và mỗi phần

trên lý thuyết nếu có n phân hoạch thì sẽ có thể nạp đợc n chơng trình và thực
hiện một cách đồng thời (n đợc gọi là hệ số song song của hệ thống).
1.4.2.2. Sơ đồ phân hoạch động
Trong sơ đồ này, bộ nhớ có một bảng quản lý không gian nhớ tự do thống
nhất. Khi thực hiện chơng trình, hệ thống dựa vào kích thớc chơng trình để
phân bổ không gian nhớ thích hợp, tạo thành một vùng nhớ độc lập và tạo bảng
quản lý riêng. Khi các chơng trình kết thúc, bộ nhớ giành cho nó sẽ bị thu hồi.


-271.4.2.3. Sơ đồ hoán đổi (swapping)

-28-

Chơng 2 - Vi điều khiển và ngôn ngữ lập trình


Sơ đồ hoán đổi dựa trên nguyên tắc nội dung chơng trình ở trạng thái chờ

cho vi điều khiển

đợi trong một khoảng thời gian dài sẽ đợc tạm thời chuyển ra bộ nhớ ngoài
(swap out) để giải phóng vùng nhớ cấp phát cho chơng trình khác hoạt động.

2.1. Vi điều khiển

Khi chơng trình kết thúc trạng thái chờ nó sẽ đợc nạp trở lại bộ nhớ trong

2.1.1. Vi xử lý và vi điều khiển.

(swap in) để tiếp tục thực hiện.
Bộ vi xử lý đã có lịch sử ra đời từ 1971 khi Intel giới thiệu bộ 8080 dùng
cho máy tính đơn board. Kể từ khi ra đời, qua nhiều thế hệ, có nhiều cải tiến
nhng lĩnh vực của các bộ vi xử lý vẫn là các hệ thống máy tính. Trong hệ thống
máy tính, bộ vi xử lý cùng với bộ nhớ, các thiết bị vào/ra...,hợp thành một hệ
thống có khả năng xử lý, điều khiển, lu trữ... cực mạnh.
Một hệ thống máy tính nếu dùng cho một ứng dụng lớn yêu cầu xử lý
nhanh, lu trữ lớn... thì không có vấn để gì để bàn. Tuy nhiên nếu mang hệ thống
này vào dùng cho các ứng dụng nhỏ thì lại trở thành lãng phí. Từ thực tế này các
nhà sản xuất đã nghiên cứu và đa ra các hệ máy tính nhỏ với một bộ xử lý nhỏ,
một bộ nhớ chơng trình và dữ liệu nhỏ, một số các thành phần vào ra cơ bản.
Tất cả các thành phần này đợc gói gọn trong một chip đơn và đây chình là bộ vi
điều khiển.
Nh vậy để phân biệt hai khái niệm vi xử lý và vi điều khiển thì cần phải
xem xét trên 2 phơng diện: Kiến trúc phần cứng và lĩnh vực ứng dụng. Phần
cứng của một bộ vi điều khiển là một bộ vi xử lý, bộ nhớ, các thiết bị vào/ra. Vi

điều khiển có đủ những thành phần cơ bản của một hệ máy tính nên bộ vi điều
khiển có thể hoạt động độc lập đợc còn vi xử lý thì không. Xuất phát từ những
đặc trng vừa nêu nên bộ vi điều khiển đợc tìm thấy trong các ứng dụng nhỏ còn
vi xử lý nằm trong các hệ thống máy tính.
AT89S52 là bộ vi điều khiển 8 bit, đợc chế tạo bởi hãng ATMEL theo kiến
trúc của 8051.


-29-

-302.1.2. Tỉ chøc bé nhí cđa vi ®iỊu khiĨn.

Intermal Devices
Oscillatior

Memory

AT89S52 có bộ nhớ theo cấu trúc Harvard: có những vùng cho bộ nhớ

I/O devices

riêng biệt cho chương trình và dữ liệu. Như đã nói ở trên, cả bộ nhớ chương

CPU

ROM
8Kb

RAM
256

byte

Timer0
Timer1
Timer2
(16 bit)

UART

Interrupt
Controller

trình và dữ liệu có sẵn ở trên chip tuy nhiên dung lượng của các bộ nhớ trên
chip là hạn chế. Khi thiết kế các ứng dụng đòi hỏi bộ nhớ lớn người ta có thể
dùng bộ nhớ ngoài với dung lượng lên tới 64 Kbytes cho bộ nhớ chương trình
và cho 64 Kbytes bộ nhớ dữ liệu (hình 2.2).

System Bus

FFFFH

....
ROM
64Kb

Bộ nhớ
chương
trình
(64Kb)


I/O devices

Memory

RAM
64Kb

....

Bộ nhớ
chương
trình
(8Kb)

...

Extermal Devices

Bộ nhớ
dữ liệu
(64Kb)

1FFFH

00FFH
256
bytes

Bộ nhớ trong


0000H
Bộ nhớ ngoài

H×nh 2.1. S¬ ®å khèi cđa bé vi ®iỊu khiĨn AT89S52
H×nh 2.2. Tỉ chøc bé nhí cđa vi ®iỊu khiĨn

Trªn h×nh 2.1 lµ s¬ ®å khèi cđa bé vi ®iỊu khiĨn nµy, theo ®ã bé vi ®iỊu

2.1.2.1. Bé nhí ch−¬ng tr×nh.

khiĨn cã ®Çy ®đ c¸c phÇn cøng cÇn thiÕt cho mét hƯ ®iỊu hµnh thêi gian thùc nh−
AT89S52 cã 8Kb Flash Rom trªn chip, khi ch©n EA (ch©n sè 31) ®−ỵc ®Ỉt ë

bé xư lý trung t©m, bé nhí, c¸c bé timer ®Ĩ t¹o c¸c time tick, bé xư lý ng¾t ®Ĩ
thùc hiƯn chun m¹ch gi÷a c¸c tiÕn tr×nh, khèi vµo ra ®Ĩ thùc hiƯn c¸c thao t¸c

møc logic cao (+5V), bé vi ®iỊu khiĨn sÏ thùc hiƯn ch−¬ng tr×nh trong Rom néi

trong c¸c tiÕn tr×nh...Nh− vËy chØ cÇn mét bé vi ®iỊu khiĨn AT89S52víi gi¸ thµnh

b¾t dÇu tõ ®Þa chØ 0000H. Sè lÇn lËp tr×nh (ghi) cho bé nhí nµy lµ kho¶ng 1000

kh¸ rỴ lµ ®· cã thĨ thùc hiƯn c¸c øng dơng thêi gian thùc víi chi phÝ rÊt thÊp. §©y

lÇn.

còng chÝnh lµ lý do ®Ĩ t¸c gi¶ ®Ị tµi chän nghiªn cøu vi ®iỊu khiĨn vµ øng dơng
vµo hƯ thèng thêi gian thùc.

Khi ch©n EA ®−ỵc ®Ỉt ë møc logic thÊp, bé vi ®iỊu khiĨn sÏ thùc hiƯn

ch−¬ng tr×nh ë bé nhí ch−¬ng tr×nh ngoµi (EPPOM ngoµi), tuy nhiªn ®Ĩ cã ®−ỵc


-31®iỊu nµy th× cÇn ph¶i cã mét m¹ch phèi ghÐp AT89S52 víi EPROM ®−ỵc lùa
chän.

-32Các lệnh dùng các thanh ghi RO - R7 sẽ ngắn hơn và nhanh hơn so với
các lệnh có chức năng tương ứng dùng kiểu đòa chỉ trực tiếp. Các dữ liệu được

Trªn h×nh 2.3: Mét vi m¹ch chèt (Latch) sÏ t¸ch riªng Bus ®a hỵp ®Þa chØ vµ
d÷ liƯu AD0-AD7; T theo dung l−ỵng cđa EPROM sÏ cã sè ®−êng ®Þa chØ
t−¬ng øng ®−ỵc dïng; EPROM ®−ỵc ®äc nhê tÝn hiƯu PSEN.

dùng thường xuyên nên dùng một trong các thanh ghi này.
Do có 4 bank thanh ghi nên tại một thời điểm chỉ có một bank thanh ghi
được truy xuất bởi các thanh ghi RO - R7 đểà chuyển đổi việc truy xuất các

89S52

bank thanh ghi ta phải thay đổi các bit chọn bank trong thanh ghi trạng thái.
- RAM đòa chỉ hóa từng bit có đòa chỉ từ 20H đến 2FH.
AT89S52 có 128 bit có chứa các byte đònh đòa chỉ theo bit từ 20H đến
2FH.
Ý tưởng truy xuất từng bit bằng phần mềm là các đăëc tính mạnh của các
bộ vi điều khiển nói chung. Các bit có thể được đặt, xóa, AND, OR, ... , với 1

H×nh 2.3. S¬ ®å ghÐp nèi AT89S52 víi EPROM

2.1.2.2. Bé nhí d÷ liƯu.


lệnh đơn.

a.Bé nhí d÷ liƯu trªn chip.

- RAM đa dụng từ 30H đến FFH.

AT89S52 cã 256 bytes Ram nh− bảng 2.1 được phân chia như sau:
- Các bank thanh ghi có đòa chỉ từ 00H đến 1FH.
32 byte thấp của bộ nhớ nội được dành cho các bank thanh ghi. Bộ lệnh
AT89S52 hổ trợ 8 thanh ghi có tên là R0 -R7 và theo mặc đònh sau khi reset
hệ thống, các thanh ghi này có các đòa chỉ từ 00H - 07H.

-Các thanh ghi chức năng đặc biệt từ 80H đến FFH.


-33-

-34-

B¶ng 2.1. Bé nhí d÷ liƯu trªn chÝp cđa AT89S52

FF

b. Bé nhí d÷ liƯu ngoµi.

FF

Port 0

Vùng RAM đa dụng


D0-D7
74HC373

EA

8051

O

D

G

ALE
Port 2

30
2F
2E
2D
2C
2B
2A
29
28
27
26
25
24

23
22
21
20
1F
18
17
10
0F
08
07
00

A8-A15

RD

7F
77
6F
67
5F
57
4F
47
3F
37
2F
27
1F

17
0F
07

7E
76
6E
66
5E
56
4E
46
3E
36
2E
26
1E
16
0E
06

7D
75
6D
65
5D
55
4D
45
3D

35
2D
25
1D
15
0D
05

7C 7B
74 73
6C 6B
64 63
5C 5B
54 53
4C 4B
44 43
3C 3B
34 33
2C 2B
24 23
1C 1B
14 13
0C 0B
04 03
Bank 3

7A
72
6A
62

5A
52
4A
42
3A
32
2A
22
1A
12
0A
02

79
71
69
61
59
51
49
41
39
31
29
21
19
11
09
01


78
70
68
60
58
50
48
40
38
30
28
20
18
10
08
00

H×nh 2.4. S¬ ®å ghÐp nèi AT89S52 víi RAM
Dành cho các thanh ghi đặc biệt (SFR)

Address Bus (A0- A15)

Data Bus (D0-D7)

2764
PSEN

OE

WR RD


D0-D7

A0-A12
CS

EPROM
8KBytes
text

CS

6264
OE
WE

D0-D7

A0-A12

C

0

B

1

A


2

RAM
CS

3

Bank 1

4
5

E

6

E

7

Tíi c¸c vi m¹ch
Select
another EPROM/RAM
ROM/RAM
kh¸c

E

80


RAM
8KBytes

CS

CS

74HC138

RAM

OE
WE

WR

Bank 2

Bank thanh ghi 0
(mặc đònh cho R0 -R7)

RAM

A0-A7

Các thanh ghi chức năng
H×nh 2.5. Gi¶i m∙ ®Þa chØ cho c¸c vi m¹ch nhí

CS


RAM


-35-

-36-

Bộ nhớ dữ liệu ngoài là bộ nhớ RAM được đọc hoặc ghi bởi tín hiệu /RD

xem như số đếm số xung nhòp (hoặc các sự kiện) từ khi khởi động Timer.

và WR.Các RAM có thể giao tiếp với AT89S52 tương tự cách thức như

Ví dụ Timer 16 bit sẽ đếm lên từ 0000H đến FFFFH, cờ báo tràn sẽ lên 1

EPROM ngoại trừ chân /RD của AT89S52 nối với chân /OE (Output Enable)

khi số đếm tràn từ FFFFH đến 0000H.

của RAM và /chân WR của AT89S52 nối với chân /WE của RAM (hình 2.10).
Nếu có nhiều vi mạch ROM và RAM cùng được ghép nối với AT89S52
thì có thể dùng thêm vi mạch giải mã 74LS138 (hình 2.5).

AT89S52 có 3 Timer 16 bit, mỗi Timer có bốn chế độ hoạt độïng. Người
ta sử dụng các Timer để: Đònh khoảng thời gian, đếm sự kiện hoặc tạo tốc độ
baud cho port nối tiếp trong.

Như đã nói ở trên, bộ nhớ chương trình và bộ nhớ dữ liệu của AT89S52
có thể trùng đòa chỉ, điều này cho phép người thiết kế có thể xây dựng một bộ
nhớ dữ liệu chứa chương trình thực thi (bộ nhớ dữ liệu đọc như bộ nhớ chương

trình) như hình 2.6.

RAM

W

RD

W

OE

PSEN

H×nh 2.7. Ho¹t ®éng cđa Timer0 vµ Timer1 ë chÕ ®é 1.

Nguyªn t¾c ho¹t ®éng cđa c¸c bé ®Þnh thêi nh− sau:
Ngn xung clock ®−ỵc ®−a tíi Timer tõ mét trong c¸ch phơ thc vµo bit
C-T trong thanh ghi TMOD:
• NÕu C-/T = 1, xung clock sÏ ®−ỵc lÊy tõ bé t¹o xung bªn ngoµi qua
ch©n Tx(T0,T1 hc T2).

H×nh 2.6. Bé nhí d÷ liƯu ®äc nh− bé nhí ch−¬ng tr×nh

2.1.3. C¸c bé ®Þnh thêi.
Các bộ đònh thời (Timer) có thể hiểu là một chuỗi các flip-flop chia
đôi tần số nối tiếp với nhau, chúng nhận tín hiệu vào làm nguồn xung nhòp,
ngõ ra của tần số cuối làm nguồn xung nhòp cho flip-flop báo tràn của
Timer (flip-flop cờ). Giá trò nhò phân trong các flip-flop của Timer có thể


• NÕu C-/T = 0, xung clock sÏ ®−ỵc lÊy tõ bé chia tÇn trong chip, tÇn
sè cđa xung ë ®©y lµ 1/12 tÇn sè cđa bé dao ®éng th¹ch anh (Fosc).
Ngn xung clock nãi trªn sÏ ®−ỵc ®iỊu khiĨn ®Ĩ ®−a tíi c¸c Timer b»ng
c¸c bit: TR, GATE vµ møc logic trªn c¸c ch©n INTx:
• NÕu TRx=0, c¸c Timer sÏ bÞ cÊm mµ kh«ng cÇn quan t©m tíi GATE
vµ møc logic trªn c¸c ch©n INTx (thĨ hiƯn b»ng “cỉng AND”).


-37 Nếu TRx=1, các Timer sẽ hoạt động với một trong 2 điều kiện sau
xảy ra (thể hiện bằng cổng OR): Thứ nhất: bit GATE=1; thứ hai: trên chân
INTx có mức logic 1.

-38- Ngắt do Port nối tiếp.
6 nguồn ngắt này đợc xoá khi Reset và đợc đặt riêng bằng phần mềm bởi
các bit trong các thanh ghi cho phép ngắt (IE), thanh ghi u tiên ngắt (IP).

Giá trị lớn nhất mà các Timer chứa đợc là 65535 (tơng ứng FFFF(H)), khi
đếm quá giá trị này sẽ xảy ra tràn, khi cờ tràn TF sẽ đợc đặt bằng 1 và gây ra
ngắt do bộ định thời. Căn cứ vào sự kiện này bộ xử lý ngắt sẽ nạp dịa chỉ của
vector ngắt cho con trỏ PC, bộ vi điều khiển sẽ thực hện chơng trình ở đây.
Trong hệ điều hành thời gian thực, bộ định thời là một trong những tài
nguyên phần cứng không thể thiếu. Bộ định thời dùng để xác định các khoảng
thời gian thích hợp cho mỗi tiến trình hoạt động (gọi là timer tick). Khoảng thời
gian này có thể thay đổi dẽ dàng nhờ việc nạp các giá trị khác nhau cho bộ timer.
Khoảng thời gian này cũng thay đổi tuỳ theo các ứng dụng thời gian thực sao cho
nó luôn nhỏ hơn thời gian đáp ứng của hệ thống với các kích thích bên ngoài.
2.1.4. Bộ xử lý ngắt.
Ngắt có thể hiểu đơn giản là tạm dừng một hoạt động A nào đó và chuyển
sang một hoạt động B khác có nhu cầu cấp thiết hơn. Khi xảy ra ngắt, toàn bộ các
công việc, trạng thái của hoạt động A sẽ đợc cất vào ngăn xếp để làm căn cứ

tiếp diễn khi bộ vi xử lý đã hoàn thành xong hoạt động B và quay trở lại với hoạt
động A.
AT89S52 có 6 nguồn ngắt:

Hình 2.8. Các nguồn ngắt của AT89S52

- Ngắt ngoài đến từ chân /INT0.

Nh đã trình bày ở mục 2.3, các bộ định thời tạo ra các khoảng thời gian

- Ngắt ngoài đến từ chân /INT1.

(time tick), theo đó các một tiến trình phải đợc tạm dừng và một tiến trình khác
sẽ đợc thực hiện. Sự chuyển mạch sang tiến trình mới kéo theo việc phải lu lại

- Ngắt do bộ timer 0.
- Ngắt do bộ timer 1.
- Ngắt do bộ timer 2.

các công việc của tiến trình cũ. Ngắt do bộ định thời chính là cơ sở để có thể thực
hiện việc chuyển mạch giữa các tiến trình.


-39Ngoài ra trên vi điều khiển còn có một số các nguồn ngắt khác. Các nguồn
ngắt này khi đợc đặt ở các thứ tự u tiên thích hợp sẽ là con đờng để một hệ

-40đợc khá nhiều công sức khi lập trình cho vi điều khiển. Tuy nhiên chúng ta cùng
xem xét ví dụ sau:

thống thời gian thực có thể phản ứng kịp thời với các kích thích từ bên ngoài.


Thực hiện phép toán AX=7 * 9 + 12 * 8.

2.2. Ngôn ngữ lập trình cho vi điều khiển

Hợp ngữ:

2.2.1. Tổng quan về các ngôn ngữ lập trình cho vi điều khiển.
Cho đến nay khi lập trình cho các bộ vi điều khiển ngời ta thờng sử dụng
2 ngôn ngữ chính đó là hợp ngữ và C. Hợp ngữ (assembly) là ngôn ngữ lập trình
bậc thấp (chỉ đứng trên ngôn ngữ máy một bậc). Hợp ngữ sử dụng chính ngay tập
lệnh của bộ vi điều khiển tơng ứng để viết nên một chơng trình. Để biên dịch
thành mã máy có thể sử dụng trình dịch hợp ngữ (assembler) hoặc có thể dùng
chính bảng mã lệnh do nhà sản xuất cung cấp để mã hoá các lệnh và tổng hợp
thành mã (code) của chơng trình. Chúng ta cùng xem xét ví dụ sau:

MOV AL,7

;số hạng thứ nhất chứa trong AL

MOV BL,9

;số hạng thứ hai chứa trong BL

MUL BL

;nhân 2 số, kết quả chứa trong AX

MOV CX,AX ;chuyển kết quả vào thanh ghi khác để
chuẩn bi cho phép ;nhân thứ hai

MOV AL,12
MOV BL,8
MUL BL
ADD AX,CX ;cộng hai tích với nhau

MOV AL,80H

; chuyển số 80H vào AL

MOV BL,12H

; chuyển số 12H vào BL

AINSI C:

ADD AL,BL ; cộng hai số với nhau.

AX=7*9+12*8;

Trong đoạn chơng trình trên nếu tra bảng mã sẽ có đợc mã của 3 lệnh lần

Rõ ràng với cùng một nhiệm vụ nhng AINSI C chỉ cần 1 dòng lệnh trong

lợt là:
B0 80
B3 12

khi hợp ngữ cần tới 8 dòng lệnh và cả 8 dòng lệnh trên đều phải thao tác trên các
thanh ghi (phần cứng). Từ lý do này mà ngời ta nghĩ đến việc nên sử dụng một
ngôn ngữ cấp cao hơn để thay thế cho hợp ngữ và xây dựng trình dịch (compiler)

cho ngôn ngữ cấp cao đó.

80 C0
Khi thiết kế phần mềm cho một hệ thống nhúng nhỏ sử dụng 8085, việc
Nếu tổng hợp lại thì mã của đoạn chơng trình trên sẽ là B0 80 B3 12
80 C0.

sử dụng mã hợp ngữ (assembly code) để phát triển toàn bộ sản phẩm đã trở thành
chuyện bình thờng. Đối với nhiều đề tài, đây là tiếp cận khả thi vì lợng mã cần

Cách tra bảng mã lệnh và hoá lệnh sau đó tổng hợp thành mã chơng trình

đợc tạo ra thờng nhỏ hơn 8 Kbyte và tơng đối đơn giản về bản chất. Nếu một

có thể gây ra nhầm lẫn và mất rất nhiều thời gian chính vì vậy mà trình dịch hợp

kỹ s phần cứng đợc giao nhiệm vụ thiết kế cả phần cứng lẫn phần mềm, ngời

ngữ ra đời. Có trong tay trình dịch hợp ngữ ngời lập trình có thể đã giảm bớt

này thờng có khuynh hớng viết phần mềm bằng hợp ngữ. Ngời kỹ s phần


-41cứng thờng không quen với một ngôn ngữ cấp cao nh C chẳng hạn hoặc ngời
này không quan tâm đến ngôn ngữ cấp cao.

-42Nhiều bộ vi điều khiển có các trình dịch ngôn ngữ C, các trình dịch này hỗ
trợ AINSI C.

Khuyết điểm của các đề tài đợc viết bằng hợp ngữ có thể là khó đọc và


Tất cả các điều này không có ý muốn nói rằng hợp ngữ không có vai trò

khó bảo trì, đặc biệt khi các chơng trình cho các đề tài này không đợc chú

của mình. Trên thực tế nhiều hệ thống nhúng (đặc biệt là các hệ thống thời gian

thích tốt. Ngoài ra, lợng mã có thể sử dụng lại từ một đề tài viết bằng hợp ngữ

thực) kết hợp chơng trình C và chơng trình hợp ngữ.

thờng rất thấp. Việc sử dụng ngôn ngữ cấp cao nh C có thể giải quyết các vấn
đề này.

Đối với các thao tác có thời gian tới hạn, chơng trình hợp ngữ thờng là
phơng pháp duy nhất đợc lựa chọn. Tuy nhiên theo kinh nghiệm, phần còn lại

Một chơng trình đợc viết bằng C sẽ dễ đọc hơn so với chơng trình đợc

của đề tài (bao gồm nhiều giao diện phần cứng) có thể và nên đợc phát triển

viết bằng hợp ngữ. Do chơng trình viết bằng C sở hữu các cấu trúc lớn hơn, ta

bằng C. Một trong những điều quan trọng nhất về ngôn ngữ C là ngôn ngữ này

dễ dàng hiểu và bảo trì chơng trình. Do tính có module của ngôn ngữ C, một

cho phép ta thực hiện các thao tác mức thấp của phần cứng nếu cần, lại còn cung

chơng trình viết bằng C có thể sử dụng lại mã một cách tốt hơn khi đi từ đề tài


cấp cho ta chức năng và khái niệm trừu tợng của ngôn ngữ cấp cao.

khác. Việc chia chơng trình thành nhiều hàm sẽ thúc đẩy cấu trúc phần mềm tốt

2.2.2. Những vấn đề với ngôn ngữ C viết cho các bộ vi điều khiển.

hơn và dẫn đến các hàm có thể đợc lấy ra từ một đề tài và sử dụng vào đề tài
khác, nh vậy sẽ giảm tổng thời gian phát triển.

Ngôn ngữ lập trình C là một ngôn ngữ lập trình đợc sử dụng rộng rãi trên
thế giới. Nhiều ngời cho rằng đây là ngôn ngữ lập trình bậc cao vì C có khá

Một ngôn ngữ cấp cao chẳng hạn nh C cho phép ngời phát triển viết
chơng trình tơng đồng nhiều hơn với suy nghĩ của con ngời so với chơng
trình viết bằng hợp ngữ. Ngời phát triển có thể tập trung nhiều thời gian hơn vào
việc thiết kế các giải thuật của hệ thống thay vì phải tập trung vào việc thực hiện
riêng rẽ các giải thuật. Điều này sẽ làm giảm một cách đáng kể thời gian phát
triển và làm giảm thời gian gỡ rối vì chơng trình sẽ dễ hiểu hơn.
Bằng cách sử dụng ngôn ngữ giống nh C, ngời lập trình không cần phải
am tờng kiến trúc của bộ vi điều khiển. Điều này có nghĩa là một ngời cha
quen với một bộ vi điều khiển cho sẵn có thể xây dựng một đề tài nhanh hơn vì tổ
chức bên trong của bộ vi điều khiển đích có thể không cần nghiên cứu. Ngoài ra
chơng trình đợc phát triển bằng C sẽ dễ dàng sử dụng với các hệ thống khác so
với chơng trình đợc phát triển bằng hợp ngữ.

nhiều thuộc tính giống các ngôn ngữ lập trình bậc cao, ví dụ nh: cấu trúc của
chơng trình, cách định nghĩa và gọi các thủ tục...,tuy nhiên sức mạnh thực sự
của C không phải ở đó mà chính là khả năng truy nhập phần cứng, thao tác trên
các bit, byte, word của phần cứng đối tợng. Cũng chính bởi lý do này mà C

đợc rất nhiều nhà thiết kế hệ điều hành sử dụng là ngôn ngữ lập trình bên cạnh
hợp ngữ, có thể kể ra các hệ điều hành có sử dụng C để lập trình nh: UNIX,
LINUX, MS-Windows...
Trên bộ vi điều khiển 8bit, dễ hiểu là không thể đem so sánh về tài nguyên
đối với các bộ vi xử lý đợc chọn để viết hệ điều hành LINUX hay Windows. Có
thể kể ra một số dẫn chứng: tài nguyên về bộ nhớ của vi điều khiển chỉ vài Kbyte
đối với bộ nhớ chơng trình và vài trăm byte đối với bộ nhớ dữ liệu; không gian
địa chỉ cũng chỉ là vài chục Kbyte...


-43Trình dịch C có khả năng nhận mã nguồn C (C source code) của ngời lập

-442.2.2.3. Không sử dụng số dấu chấm động.

trình và tạo ra mã đối tợng (object code) đợc tối u hoá cao từ mã nguồn này.

Việc thực hiện các phép toán số dấu chấm động trên các giá trị 32-bit với

Tuy nhiên có nhiều điều mà chúng ta, với t cách là ngời thiết kế, có thể thực

một bộ vi điều khiển 8 bit cũng giống nh ta cắt một bãi cỏ bằng các đồ dùng cắt

hiện để giúp cho trình dịch tạo ra mã tốt hơn để có thể tiết kiệm đợc tối đa các tài

móng tay. Ta có thể thực hiện đợc điều này nhng sẽ hoang phí một lợng thời

nguyên của vốn hạn chế của bộ vi điều khiển.

gian lớn khủng khiếp. Bất kỳ lúc nào ta dự định sử dụng dụng số dấu chấm động


2.2.2.1. Giảm kích thớc biến.

trong một ứng dụng, ta cần phải tự hỏi xem có phải điều này là tuyệt đối cần thiết

Một trong những điều cơ bản nhất mà ta cần phải làm để cải thiện chơng

hay không? Thông thờng, các số dấu chấm động có thể đợc loại bỏ bằng cách

trình của ta là đặc biệt lu ý đến kích thớc của các biến. Đối với ngời thờng

tăng cấp tất cả các giá trị bằng một cặp cùng bậc về độ lớn và sử dụng các phép

lập trình bằng C trên các máy chẳng hạn nh một mainframe hoặc PC, việc khai

toán số nguyên. Ta sẽ xử lý tốt hơn các số kiểu int và long so với các số kiểu

báo những điều nh là các bộ đếm vòng lặp dới dạng các số nguyên là rất bình

double và float. Chơng trình của ta sẽ thực thi nhanh hơn và các thờng trình số

thờng, ngay cả đối với các biến mà giá trị của chúng không bao giờ vợt quá

dấu chấm động sẽ không đợc liên kết vào trong ứng dụng của ta. Ngoài ra nếu

255. Trên một máy 8 bit nh 8051, việc sử dụng rộng rãi các kiểu dữ liệu có

ta cần phải sử dụng số dấu chấm động, ta cần xem xét việc sử dụng các phiên bản

kích thớc lớn hơn 8 bít sẽ gây ra sự hoang phí lớn về khả năng xử lý và bộ nhớ.


của 8051, các phiên bản này đã đợc tối u hoá đối với các phép toán số học

Ta cần phải cẩn thận xem xét tầm giá trị đối với biến mà ta khai báo và kế đến

chẳng hạn nh Siemens 80517, 80537 hoặc Dallas Semiconductor 80320.

chọn kiểu nhỏ nhất thoả yêu cầu. Hiển nhiên kiểu đợc a chuộng nhất đối với

Có nhiều khi ta bị ép buộc phải liên kết chặt chẽ với việc sử dụng các số

các biến sẽ là unsigned char, do kiểu này chỉ sử dụng 1 byte.

dấu chấm động trong hệ thống của ta. Ta đã biết những bất lợi về kích thớc

2.2.2.2. Sử dụng kiểu unsigned.

chơng trình và tốc độ mà ta phải đối phó. Ngoài ra, ta cần ý thức đợc rằng nếu

Đến đây, ta có thể ngạc nhiên vì kiểu đợc a chuộng là kiểu unsigned
char thay vì là kiểu char. Lập luận đằng sau điều này là 8051 không hỗ trợ số học
có dấu và đoạn mã phụ đợc yêu cầu bởi một giá trị có dấu, trái ngợc với một
giá trị không dấu, sẽ lấy đi toàn bộ các tài nguyên của bộ vi điều khiển. Nh vậy
cùng với việc chọn lựa các kiểu biến tơng ứng với tầm giá trị, ta cũng phải xem
xét xem có phải biến sẽ đợc sử dụng cho một thao tác nào đó sẽ yêu cầu các số
âm. Nếu không, ta cần đảm bảo rằng ta chỉ ra biến có kiểu unsigned. Ta cần loại
bỏ các số âm ra khỏi một hàm hoặc toàn bộ ứng dụng của ta.

ta sử dụng các phép toán số dấu chấm động trong một thờng trình mà thờng
trình này có thể bị ngắt, ta phải đảm bảo rằng thờng trình ngắt (interrupting
routine) không đợc sử dụng các phép toán số dấu chấm động ở bất kỳ nơi nào

trong cây gọi (calling tree) của thờng trình, hoặc ta phải lu giữ trạng thái của
hệ thống số dấu chấm động ở nơi bắt đầu của ISR bằng cách sử dụng fpsave và
phục hồi lại trạng thái ban đầu của hệ thống số dấu chấm động ở nơi kết thúc ISR
bằng cách sử dụng fprestore. Một phơng pháp khác là bao bọc lời gọi đến các
chơng trình số dấu chấm động chẳng hạn nh sin() cùng với một hàm vô hiệu
hoá các ngắt trớc lời gọi đến hàm toán học và cho phép các ngắt trở lại sau lời
gọi.


-45-

-46Nếu ta phải sử dụng số dấu chấm động trong chơng trình của ta, ta cần nỗ

include <math.h>
void timer0_isr(void) interrupt 1 {

lực xác định độ chính xác cực đại cần có. Một khi đã tính đợc số bit cực đại của

struct FPBUF fpstate;

độ chính xác cần có trong việc tính toán số dấu chấm động, ta hãy đa số này vào

// đoạn mã khởi động hoặc đoạn mã

trong hộp thoại các lựa chọn của trình dịch bên dới điều khiển Bit to round for

// Không sử dụng số dấu chấm động nào đó

float compare. Điều này sẽ cho phép các thờng trình số dấu chấm động giời


fpsave(&fpstate);

// Lu trạng thái của

hạn lợng công việc mà chúng thực hiện chỉ đến độ chính xác có ý nghĩa đối với

// hệ thống số dấu chấm động

hệ thống của ta.
2.2.2.4. Sử dụng biến bit

// đoạn mã ISR bất kỳ, bao gồm

Khi ta dự định sử dụng các cờ (flag) chỉ có hai trạng thái 0 và 1, ta nên sử

// đoạn mã số dấu chấm động.

dụng kiểu bit thay vì sử dụng kiểu unsigned char. Điều này nhằm mục đích để

fprestore (&fpstate);

dành bộ nhớ cho sau này vì ta không hoang phí 7 bit kia. Ngoài ra, các biến bit

// khôi phục trạng thái

của hệ thống

luôn luôn đợc cất ở RAM bên trong và do vậy sẽ đợc truy cập trong một chu

// số dấu chấm động


kỳ.

// đoạn mã ISR bầt kỳ không sử dụng

3.8.5. Sử dụng biến cục bộ thay cho biến toàn cục

// số dấu chấm động
Các biến đợc khai báo là dữ liệu toàn cục (global data) sẽ sử dụng kém

}

hiệu quả hơn so với các biến đợc khai báo là dữ liệu cục bộ (local data). Lý do

float my_sin(float arg) {

cho điều này là trình dịch luôn cố gắng gán các biến cục bộ cho các thanh ghi

float retval;

bên trong, trong khi đó dữ liệu toàn cục có thể hoặc không thể ở trong các thanh

bit old_ea;

ghi bên trong tuỳ thuộc và khai báo của ta. Trong những trờng hợp mà các biến

old_ea = EA; // lu trạng thái ngắt hiện hành
EA = 0;

// cấm các ngắt


Retval = sin(arg);

/* thực hiện lời gọi hàm

số dấu chấm động*/
EA = old_ea;
thái ngắt*/
return retval;
}

toàn cục đợc gán mặc định cho XDATA (chẳng hạn nh các chơng trình theo
mô hình bộ nhớ lớn), ta đã từ bỏ việc truy cập nhanh. Lý do khác để tránh các
biến toàn cục là ta phải phối hợp việc truy cập đến các biến nh vậy giữa các quá
trình trong hệ thống của ta. Điều này sẽ là một vấn đề trong các hệ thống ngắt

/* đặt trở lại trạng

hoặc các hệ thống đa tác vụ, trong đó có thể có nhiều hơn một quá trình sẽ cố
gắng sử dụng biến toàn cục. Nếu ta có thể tránh các biến toàn cục và sử dụng các
biến cục bộ, trình dịch sẽ quản lý chơng trình của ta một cách có hiệu quả nhất.


-472.2.2.6. Sử dụng bộ nhớ bên trong cho các biến.

-48Đôi với các thao tác quay trên một byte, các hàm nội tại _crol_ (quay

Các biến toàn cục và cục bộ có thể bị buộc ở trong một vùng nhớ bất kỳ mà

trái) _cror_ (quay phải) tơng ứng trực tiếp với các lệnh hợp ngữ RL A và


ta muốn. Nh ta đã biết qua các thảo luận ở trên về các thoả hiệp giữa các đoạn

RR A. Nếu ta muốn thực hiện phép quay bít trên các đối tợng lớn hơn chẳng

nhớ, ta cần thấy rõ rằng ta có thể tối u hoá tốc độ của chơng trình bằng cách

hạn nh một đối tợng có kiểu int hoặc long, hàm nội tại sẽ phức tạp hơn

đặt các biến đợc sử dụng thờng xuyên ở RAM bên trong. Ngoài ra chơng

và do vậy sẽ dài hơn. Các phép quay này có thể đợc gọi bằng cách sử dụng các

trình của ta sẽ nhỏ hơn do có ít lệnh hơn và cung cấp việc truy cập các biến ở

hàm nội tại _irol, _iror_ cho các kiểu int và các hàm nọi tại _lrol,

RAM bên trong nhanh hơn so với chơng trình phải truy cập các biến ở RAm

_lror_ cho các kiểu long.

ngoài. Nhằm tăng tốc độ thực thi chơng trình, ta sẽ muốn lấp đầy các đoạn nhớ

Lệnh nhảy và xoá bít nếu bít đợc thiết lập bằng 1 (jump and clear bit

theo thứ tự sau: DATA, IDATA, PDATA, XDATA. Một lần nữa ta cần cẩn thận

if set) JBC từ cũng đợc thực hiện dới dạng một hàm nội tại để sử dụng trong

để dành đủ không gian nhớ trong đoạn nhớ DATA cho vùng xếp chồng bên trong


C. Hàm này đợc gọi bởi _testbit_. Hàm nội tại này trả về giá trị đúng nếu bít

của bộ vi điều khiển.

thông số đợc thiết lập bằng 1 và sai nếu ngợc lại. Điều này thờng hữu dụng

2.2.2.7. Sử dụng các con trỏ bộ nhớ cụ thể.

khi kiểm tra các cờ chẳng hạn nh RI, TI hoặc các cờ tràn của bộ định thời và

Nếu chơng trình của ta dự định sử dụng các con trỏ cho các thao tác nào

dẫn đến chơng trình viết bằng C dễ đọc hơn nhiều. Hàm này có thể dịch trực

đó, ta có thể muốn khảo sát cách sử dụng chúng và lu giữ chúng trong một vùng

tiếp thành lệnh JBC. Ví dụ sau đây sẽ minh hoạ rõ hơn điều này

nhớ cụ thể chẳng hạn nh không gian XDATA hoặc CODE. Nếu ta có thể thực

#include<instrins.h>

hiện điều này, ta sẽ sử dụng các con trỏ bộ nhớ cụ thể. Nh đã đề cập trớc đây,

void serial_intr(void) interrupt 4 {

các con trỏ bộ nhớ cụ thể sẽ không cần đến một bộ chọn và chơng trình sử dụng

if (!_testbit_(TI)){ /* nếu đây là ngắt truyền*/


chúng sẽ chặt chẽ hơn do trình dịch có thể bổ sung chúng để áp dụng một tham

P0 = 1;

chiếu đến một đoạn nhớ cho trớc thay vì phải xác định đoạn nhớ nào con trỏ

_nop_(); // chờ 1 chu kỳ

nhắm đến.

P0 = 0;

2.2.2.8. Sử dụng hàm nội tại

.... /* thực hiện các câu lệnh khác...*/
}

Đối với những hàm đơn giản chẳng hạn nh quay bit các biến (bit wise
rotation of variables), trình dịch cung cấp cho ta các hàm nội tại (intrinsic

// đổi trạng thái P0.0.

if (!_testbit_(RI)){

function), các hàm này có thể đợc gọi. Nhiều hàm nội tại tơng ứng trực tiếp với

test = _cror_(SBUF,1);

các lệnh của hợp ngữ trong khi những hàm khác đợc yêu cầu nhiều hơn và cung


..../* thực hiện các thao tác khác*/.

cấp tính tơng thích của ANISI. Tất cả các hàm nội tại là hàm reentrant và do vậy

}

có thể đợc gọi một cách an toàn từ bất kỳ nơi nào trong chơng trình.

}


-49-

Chơng 3 - thiết kế hệ vi điều khiển

-503.1. Xác định yêu cầu thiết kế.

Thiết kế phần cứng là thiết kế mạch điện tử bao gồm các linh kiện, phụ kiện

Hệ thống nhúng gồm phần cứng và hệ điều hành thời gian thực đợc thiết kế

phù hợp tạo thành một hệ vi điềukhiển hợp nhất. Nói chung một hệ vi điều khiển

với mục đích làm thiết bị thí nghiệm ở trờng Đại học Công nghiệp Hà nội, vì

cũng tơng đơng với một hệ máy tính, tức là nó phải có đủ 03 khối chính: Khối

vậy hệ thống phải đáp ứng đợc một số yêu cầu sau:


xử lý trung tâm, khối bộ nhớ và khối vào ra. Chi tiết về từng khối này nh thế nào

-Tính s phạm:

là tuỳ thuộc vào từng ứng dụng cụ thể. Có những ứng dụng yêu cầu xử lý tính

Khác với các thiết bị mang tính thơng mại, thiết bị dạy học phải đảm bảo

toán nhanh thì cần một bộ xử lý mạnh, có ứng dụng yêu cầu lu trữ lớn thì cần
phải có bộ nhớ có dung lợng lớn...Khối cần phải tuỳ biến nhiều nhất chính là
khối vào ra bởi lẽ khối này chính là khối giao tiếp với thế giới thực để tạo ra các

đợc các yêu cầu về s phạm nh:
+Phù hợp với nội dung, chơng trình học.

ứng dụng thực. Nói chung để thiết kế đợc một hệ vi điều khiển có khả năng hoạt

+Phù hợp với đối tợng học.

động tốt, độ tin cậy cao thì ngời thiết kế cần phải đi theo một trình tự nhất định,

-Tính trực quan:

cũng có thể gọi là nguyên tắc thiết kế. Có 2 nhóm nguyên tắc chính đó là đi từ

Tính trực quan là một trong những yêu cầu quan trọng nhất của một thiết bị

trên xuống và đi từ dới lên. Nguyên tắc đi từ trên xuống thờng đợc áp dụng

dạy học. Một thiết bị có tính trực quan sẽ giúp sinh dễ thí nghiệm hơn và tạo


với các hệ nhúng nhỏ, cụ thể trong trờng hợp thiết kế một hệ vi điều khiển thì

hứng thú cho sinh viên trong qua trình học. Trong thiết bị này thì tính trực quan

trình tự thiết kế nh sau:

phải đợc thể hiện ở một số khía cạnh sau:
Xác yêu cầu thiết kế

+ Các thiết bị vào/ra phải là các thiết bị dễ nhìn, dễ quan sát, dễ xác định kết
quả và dễ đo đạc, kiểm tra.

Lựa chọn cấu hình cho hệ thống
theo yêu cầu thiết kế

+Giao diện ngời sử dụng phải đơn giản dễ tơng tác với hệ thống nhất.
-Tính khoa học:

Thiết kế mạch điện và lắp ráp linh
kiện

Thiết bị đợc thiết kế phải đảm bảo tính khoa học của một sản phẩm kỹ
thuật, các khâu thiết kế, vật t linh kiện sử dụng phải đảm bảo các yêu cầu kỹ

Đo thử và kiểm tra lỗi

thuật.
-Tính thực tiễn.


Hình 3.1. Trình tự thiết kế phần cứng cho hệ thống

-Tính thẩm mỹ.
-Tính kinh tế.


×