Hệ điều hành được thiết kế trên một phần cứng là hệ vi điều khiển. Hệ vi
điều khiển chỉ có bộ nhớ ROM và bộ nhớ RAM, không giống các máy tính có
nhiều cấp bộ nhớ nên cũng không có các kỹ thuật phân đoạn phân trang.
được áp dụng. Trong mục này chỉ đi vào giải quyết việc tổ chức phân chia bộ
nhớ cho các tiến trình, các chương trình của nhân hệ điềuhành sao cho hợp lý
và tránh xung đột bộ nhớ.
86 trang |
Chia sẻ: lylyngoc | Lượt xem: 2609 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Luận văn Nghiên cứu, thiết kế hệ điều hành trên bộ vi điều khiển 8 bít, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
rình dịch luôn cố gắng gán các biến cục bộ cho các thanh ghi
bên trong, trong khi đó dữ liệu toàn cục có thể hoặc không thể ở trong các thanh
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
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
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.
-47-
2.2.2.6. Sử dụng bộ nhớ bên trong cho các biến.
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à
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
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
đặt các biến đ−ợc sử dụng th−ờng xuyên ở RAM bên trong. Ngoài ra ch−ơng
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 ở
RAM bên trong nhanh hơn so với ch−ơng trình phải truy cập các biến ở RAm
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ớ
theo thứ tự sau: DATA, IDATA, PDATA, XDATA. Một lần nữa ta cần cẩn thận
để dành đủ không gian nhớ trong đoạn nhớ DATA cho vùng xếp chồng bên trong
của bộ vi điều khiển.
2.2.2.7. Sử dụng các con trỏ bộ nhớ cụ thể.
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
đó, ta có thể muốn khảo sát cách sử dụng chúng và l−u giữ chúng trong một vùng
nhớ cụ thể chẳng hạn nh− không gian XDATA hoặc CODE. Nếu ta có thể thực
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,
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
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
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ỏ
nhắm đến.
2.2.2.8. Sử dụng hàm nội tại
Đố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
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
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
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.
-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
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à
‘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
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
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
hàm nội tại _irol, _iror_ cho các kiểu int và các hàm nọi tại _lrol,
_lror_ cho các kiểu long.
Lệnh “nhảy và xoá bít nếu bít đ−ợc thiết lập bằng 1” (“jump and clear bit
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
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
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
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à
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
tiếp thành lệnh JBC. Ví dụ sau đây sẽ minh hoạ rõ hơn điều này
#include
void serial_intr(void) interrupt 4 {
if (!_testbit_(TI)){ /* nếu đây là ngắt truyền*/
P0 = 1; // đổi trạng thái P0.0.
_nop_(); // chờ 1 chu kỳ
P0 = 0;
.... /* thực hiện các câu lệnh khác...*/
}
if (!_testbit_(RI)){
test = _cror_(SBUF,1);
..../* thực hiện các thao tác khác*/.
}
}
-49-
Xác yêu cầu thiết kế
Lựa chọn cấu hình cho hệ thống
theo yêu cầu thiết kế
Thiết kế mạch điện và lắp ráp linh
kiện
Đo thử và kiểm tra lỗi
Ch−ơng 3 - thiết kế hệ vi điều khiển
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
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
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
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
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
toán nhanh thì cần một bộ xử lý mạnh, có ứng dụng yêu cầu l−u 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
ứ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
độ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,
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ừ
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
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ì
trình tự thiết kế nh− sau:
Hình 3.1. Trình tự thiết kế phần cứng cho hệ thống
-50-
3.1. Xác định yêu cầu thiết kế.
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ế
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ì
vậy hệ thống phải đáp ứng đ−ợc một số yêu cầu sau:
-Tính s− phạm:
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
đ−ợ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.
+Phù hợp với đối t−ợng học.
-Tính trực quan:
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ị
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
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
phải đ−ợc thể hiện ở một số khía cạnh sau:
+ 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.
+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 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ỹ
thuật.
-Tính thực tiễn.
-Tính thẩm mỹ.
-Tính kinh tế.
-51-
3.2. Lựa chọn cấu hình cho hệ thống.
Căn cứ vào yêu cầu thiết kế thì hệ thống có thể gồm các thành phần nh−
sau:
- Bộ điều khiển trung tâm (bao gồm : Bộ xử lý (CPU), bộ nhớ, khối điều
khiển vào ra).
- Giao diện ng−ời sử dụng.
- Các thiết bị mô phỏng cho qua trình thực hiện của các tiến trình.
Hình 3.2. Sơ đồ khối của hệ vi điều khiển
3.2.1. Lựa chọn bộ điều khiển trung tâm.
Trên thị tr−ờng hiện nay có khá nhiều bộ vi xử lý có thể cho phép viết hệ
điều hành tuy nhiên để đảm bảo các yêu cầu nh− mục 1 đã nêu thì có thể chọn bộ
vi điều khiển AT89S52 là bộ xử lý trung tâm những lý do sau:
-AT89S52 là một bộ vi điều khiển, trên bộ vi điều khiển này đã tích hợp sẵn
bộ nhớ ROM, bộ nhớ RAM, các bộ định thời, bộ xử lý ngắt, khối điều khiển
vào/ra, đây là những tài nguyên cơ bản dùng để viết một hệ điều hành. Nếu chọn
một bộ vi xử lý thì hệ thống vẫn cần thêm bộ nhớ, bộ định thời... nh− vậy sẽ tốn
kém kinh phí và hệ thống sẽ kồng kềnh hơn.
Vi điều
khiển
Bộ
nhớ
Vào/
Ra
Mô phỏng các tiến trình
hoạt động
Giao diện ng−ời sử dụng
Bộ điều khiển trung tâm
-52-
-AT89S52 là bộ vi điều khiển 8bit đ−ợc phát triển trên cơ sở bộ vi điều
khiển 8051, đây là bộ vi điều khiển với cấu trúc và tập lệnh cơ bản, dễ dàng tiếp
cận đối với những đối t−ợng nh− học sinh sinh viên.
-Giá thành của AT89S52 là khả rẻ so với các bộ vi điều khiển có cùng tính
năng hơn nữa bộ vi điều khiển này có tích hợp sắn mạch nạp ROM trên chip nên
có thể thí nghiệm mà không cần tốn chi phí để mua sắm một bộ nạp ROM.
Hạn chế duy nhất của bộ vi điều khiển mày là dung l−ợng bộ nhớ RAM nhỏ
(256 byte). Để khắc phục hạn chế này có thể dùng một vi mạch SRAM ngoài có
dung l−ợng 8 Kb ghép nối theo sơ hình 3.3.
A5
A4AD4
10K
CS4
A9
A8
X2
AD3
X1
WR
AD6
VCC
X2
A12
A14
A15
A6
AD1
AD5
RTS
CS1
10uf
A8
AD2
IC2
74HC573
2
3
4
5
6
7
8
9
11
1
19
18
17
16
15
14
13
12
D0
D1
D2
D3
D4
D5
D6
D7
LE
OE
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
AD5
AD0
JP1 SEL
1
2
3
PSEN
A10
IC1
29
30
31
19
18
9
39
38
37
36
35
34
33
32
1
2
3
4
5
6
7
8
21
22
23
24
25
26
27
28
10
11
12
13
14
15
16
17 PSEN
ALE
EA
X1
X2
RST
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD
A2
CS7
CS1
A2
VCC
A14
AD1
11.0592MHz
EA
AD0
CP2
0.1uF
AD7
CS2
CS5
RTS
AD2
AD6
EA
AD0
A1
SW1
AD3
VCC
A3
IC3
MC74F138
1
2
3
15
14
13
12
11
10
9
7
6
4
5
A
B
C
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
G1
G2A
G2B
RD
RD
VCC
AD3
A1
TX
A0
A15
AD2
A5
CS3
6264
10
9
8
7
6
5
4
3
25
24
21
23
2
11
12
13
15
16
17
18
19
22
27
20
26
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
D0
D1
D2
D3
D4
D5
D6
D7
OE
WE
CS1
CS2
ALE
A13
AD4
C2
33P
A7
CP1
0.1uF
CS0
A3
A7
WR
A11
AD4 A4
VCC
A10
A6
AD1
AD6
C1
33P
CS6
AD7
AD5
A0
ALE
A12
RX
A13
CS1
AD7
A9
A11
Hình 3.3. Ghép nối vi điều khiển với RAM ngoài.
3.2.2. Giao diện ng−ời sử dụng.
Với tính chất là một thiết bị dạy học, ng−ời sử dụng là sinh viên, học sinh vì
vậy giao diện ng−ời sử dụng phải đơn giản và hiệu quả nhất. Màn hình máy tính,
màn hình tinh thể lỏng, LED... là các thiết bị đ−a tin ra hay đ−ợc sử dụng trong
-53-
các hệ thống nhúng. Bàn phím, các contact, nút nhấn, cảm biến... là các thiết bị
đ−a tin vào hay đ−ợc sử dụng. Trong điều kiện thực tế và căn cứ vào các yêu cầu
thiết kế hệ thống thì có thể chọn màn hình tinh thể lỏng và hệ thống các nút nhấn
để làm giao diện ng−ời sử dụng, từ đây ng−ời sử dụng có thể tác động vào hệ
điều hành trong một giới hạn nào đó (hình 3.4).
CONTACT1
D0
D6
Y1
12MHz
VCC
D6
EN_LCD
RW
D4
C1
C_LCD
D5
D7
VCC
VCC
D5
VCC
VCC
RW
10K
VR_LCD
20K
D2
SW1
D3
C2
33P
D1
D4
RS
D7
IC1
8051
29
30
31
19
18
9
39
38
37
36
35
34
33
32
1
2
3
4
5
6
7
8
21
22
23
24
25
26
27
28
10
11
12
13
14
15
16
17 PSEN
ALE
EA
X1
X2
RST
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD
D2
VCC
D1
10K
C1 33P
D0
C3
C
VCC
D3
CONTACT2
ULCD
LCD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
RS
EN_LCD
Hình 3.4. Giao diện ng−ời sử dụng trên hệ vi điều khiển.
3.2.3. Các thiết bị mô phỏng quá trình hoạt động của tiến trình.
Tính trực quan là yêu cầu đầu tiên khi lựa chọn các thiết bị mô phỏng cho
quá trình hoạt động của tiến trình trong hệ điều hành. Trên một thiết bị dạy học
thì không thể đ−a các thiết bị máy móc kồng kềnh vào đ−ợc, hơn nữa tiêu chí
chính của thiết bị dạy học này là hệ nhúng và hệ điều hành trên bộ vi điều khiển
vì vậy có thể chọn hệ thống các LED để mô phỏng là đảm bảo đ−ợc tính trực
quan và kinh tế nhất.
-54-
VCC
R2
1K
QL3
A1013
QLED2
LED7SEGMENT
1 2 3 4 5 6 7 8
9
a b c d e f g d
p
V
c
c
R1
1K
VCC
QLED3
LED7SEGMENT
1 2 3 4 5 6 7 8
9
a b c d e f g d
p
V
c
c
QL2
A1013
C1
33P
10K
C3
C
QL1
A1013
R3
1K
VCC
IC1
8051
29
30
31
19
18
9
39
38
37
36
35
34
33
32
1
2
3
4
5
6
7
8
21
22
23
24
25
26
27
28
10
11
12
13
14
15
16
17 PSEN
ALE
EA
X1
X2
RST
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD
R3
1K
C2
33P
SW1
QLED1
LED7SEGMENT
1 2 3 4 5 6 7 8
9
a b c d e f g d
p
V
c
c
Y1
12MHz
QL5
A1013
QLED4
LED7SEGMENT
1 2 3 4 5 6 7 8
9
a b c d e f g d
p
V
c
c
Hình 3.5. Hiển thị trên LED 7 đoạn bằng kỹ thuật quét
-56-
Trên hệ thống có 2 thiết bị chính đó là 03 ma trận LED dùng để hiển thị
các ký tự bất kỳ và 04 LED 7 đoạn dùng để hiển thị thời gian thực của hệ
thống.
3.2.3.1. Kỹ thuật quét hiển thị trên LED 7 đoạn.
Để hiển thị trên 1 LED 7 đoạn thì cần 8 đ−ờng điều khiển theo cách hiển
thị thông th−ờng hoặc cần 4 đ−ờng nếu dùng vi mạch 74xx47. Với cả hai cách
vừa nêu nếu cần điều khiển một số l−ợng lớn các LED 7 đoạn thì t−ơng ứng sẽ
cần một số l−ợng lớn các đ−ờng điều khiển trong khi số l−ợng các đ−ờng điều
khiển trên bộ vi điều khiển là có hạn.
Nếu dùng cách hiển thị theo nguyên tắc quét (hình 3.5) thì n LED 7 đoạn
sẽ cần 8+n đ−ờng khiển khiển, tiết kiệm các đ−ờng dẫn điều khiển hơn nhiếu
so với hai cách trên.
3.2.3.1. Kỹ thuật quét hiển thị trên ma trận LED.
Cấu tạo của ma trận LED bao gồm 64 mắt DIODE, mỗi mắt gồm 1 led
màu đỏ . Trên MCS toàn bộ các hàng của 3 ma trận LED đ−ợc điều khiển bởi
P3, các cột của 3 ma trận led đ−ợc điều khiển bởi P0,P1,P2 thông qua các bộ
phân kênh 74HC138 (hình 3.6).
Nguyên tắc xếp chữ trên ma trận LED:
Giả sử ta cần xếp chữ H màu đỏ trên ma trận led (hình 3.7).
Vì không thể tại một thời điểm tất cả các mắt xếp theo hình chữ H đều
sáng đ−ợc nên có thể chia chữ H thành 3 phần:
Phần 1 gồm 6 mắt, để 6 mắt này sáng chúng ta gán: P0=00100010B;
P1=00011111B
Phần 2 gồm 5 mắt, để 5 mắt này sáng chúng ta gán: P0=00111110B;
P1=11101111B
Phần 3 gồm 8 mắt, để 8 mắt này sáng chúng ta gán: P0=00100010B;
P1=11110000B
-57-
C
5
1
2
3
15
14
13
12
11
10
9
7
6
4
5
A
B
C
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
G1
G2A
G2B
R1
C11
C23
C
12
P35
X2
P35
C
18
10K
P27
P11
L6
P00
CP1
0.1uF
C6
L8
C
23
P13
L7
C
11
P27
R6
P37
C21
P21
C5
P34
P16 P06
VCC
P24
VCC
EA
11.0592MHz
VCC
P36
C
7
C
8
VCC
IC1
29
30
31
19
18
9
39
38
37
36
35
34
33
32
1
2
3
4
5
6
7
8
21
22
23
24
25
26
27
28
10
11
12
13
14
15
16
17 PSEN
ALE
EA
X1
X2
RST
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD
C13
JP1 SEL
1
2
3
C8
R4
P04
C15
P12
P24
P22
C
2
C
20
P36
C9
R3
P20
C20
C
19
10uf
P10
P25
R7
P22
R5
1
2
3
15
14
13
12
11
10
9
7
6
4
5
A
B
C
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
G1
G2A
G2B
C7
C17
C
6
P03
C24
C
16
P31
1
2
3
15
14
13
12
11
10
9
7
6
4
5
A
B
C
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
G1
G2A
G2B
C12
X2
C1
33P
C14
C22
1
2
3
15
14
13
12
11
10
9
7
6
4
5
A
B
C
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
G1
G2A
G2B
P05
C19
VCC
P30
C3
P23
RTS
P15
R8
P26
RTS
P37
L1
C
10
P23
P34
C2
P02
C16
C
3
C
22
C
21
P14
L2
C2
33PSW1
VCC
C10
C1
C
1
P25
C
15
X1
L3
C
17C
4
P01
P30
C4
1
2
3
4
5
6
7
8
1 2 3 4 5 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
L1
L2
L3
L4
L5
L6
L7
L8
C
1
C
2
C
3
C
4
C
5
C
7
C
8
C
9
C
10
C
11
C
12
C
13
C
14
C
15
C
16
C
17
C
18
C
19
C
20
C
21
C
22
C
23
C
24
P26
C18
L4
C
13
C
14
P07P17
R2
P31
L5
VCC
EA
C
9
Hình 3.6. Ghép nối ma trận LED trên hệ vi điều khiển
-58-
Hình 3.7. Nguyên tắc xếp chữ trên ma trận LED.
Để có thể hiển thị các dòng chữ bất kỳ trên ma trận LED thì cần có một
bộ nhớ để l−u lại font của tất cả các chữ. Font của các chữ có thể hiểu là các
byte dữ liệu cần xuất ra trên các Port để ma trận sáng theo chữ đó. Trong
khuôn khổ luận văn này tôi chỉ xây dựng một bộ font chữ đơn giản gồm 26
chữ cái không dấu, bộ font này đ−ợc nạp vào ROM, khi cần thay đổi kiểu chữ
có thể xây dựng và nạp lại cho ROM.
3.3. Thiết kế mạch điện.
Để đảm bảo đ−ợc các yêu cầu về kỹ thuật, mỹ thuật thì mạch điện của
thiết bị phải đ−ợc thiết kế trên máy bằng các phần mềm vẽ mạch chuyên dụng.
Trên thực tế hiện nay có khá nhiều phần mềm thiết kế mạch nh− Protel,
Orcad, Circuit Maker...mỗi phần mềm này đều có những điểm mạnh riêng,
tuy nhiên để thiết kế hệ thống này thì Protel tỏ ra có −u thể hơn cả vì th− viện
phần mềm này có đủ các linh kiện cần cho hệ thống, đối với mạch 2 lớp trở
lên thì phần mềm này tỏ ra tối −u hoá các đ−ờng mạch tốt hơn.
Nh− đã đề cập trong mục 2, công việc thiết kế đ−ợc chia thành 3 hạng
mục là; Thiết kế bộ xử lý trung tâm, thiết kế giao diện ng−ời sử dụng và thiết
kế các thiết bị mô phỏng sự hoạt động của các tiến trình.
P17
P16
P15
P14
P13
P12
P11
P10
P00 P01 P02 P03 P04 P05 P06 P07
-59-
3.4. Đo thử và kiểm tra lỗi.
Đối với một đối t−ợng nh− hệ vi điều khiển thì đo thử và kiểm tra lỗi
bằng các dụng cụ thông th−ờng nh− đồng hồ, máy hiện sóng là ch−a đủ vì lý
do đây là một hệ thống khả trình. Cách tốt nhất để kiểm tra là viết các đoạn
ch−ơng trình cho từng khối trên hệ thống và kiểm tra hoạt động của từng khối
đó. Quá trình kiểm tra phát hiện khối nào có lỗi thì khắc phục ngay trên khối
đó.
-60-
Ch−ơng 4 - Thiết kế hệ điều hành
4.1.1. Mục đích và yêu cầu thiết kế.
4.1.2. Mục đích.
Trên thực tế, trong các hệ thống nhúng có thể có một hoặc một số công
việc cần phải thực hiện lặp đi lặp lại liên tục, chúng ta cùng xem xét 3 ví dụ
sau đây:
Ví dụ 1:
int counter;
void main (void)
{
counter = 0;
while (1) /* lặp vô tận */
{
counter++; /* tăng biến counter */
}
}
Ví dụ 2:
int counter;
void main (void)
{
counter = 0;
while (1) /* lặp vô tận */
{
check_serial_io ();
process_serial_cmds ();
check_kbd_io ();
process_kbd_cmds ();
-61-
}
}
Ví dụ 3:
#include
int counter0;
int counter1;
void job0 (void) _task_ 0
{
os_create (1); /* đặt task 1 ở trạng thái sẵn
sàng */
while (1) { /* lặp vô tận */
counter0++; /* tăng biến counter */
}
}
void job1 (void) _task_ 1
{
while (1) { /* lặp vô tận */
counter1++; /* tăng biến counter */
}
}
Trong ví dụ 1, câu lệnh counter++ đ−ợc đặt trong một vòng lặp vô tận
trong ch−ơng trình chính. Khi thực hiện ch−ơng trình này, bộ vi điều khiển chỉ
thực hiện một tác vụ duy nhất là tăng giá trị của biến counter lên. Ch−ơng
trình này minh hoạ cho các ch−ơng trình đơn tác vụ.
Trong ví dụ 2, có tới 4 tác vụ đ−ợc luân phiên thực hiện lặp và lặp đi lặp
lại liên tục. Cách viết nh− ví dụ 2 có thể mở rộng đ−ợc khả năng của bộ vi
điều khiển hơn tuy nhiên có một vấn đề tồn tại là tính đáp ứng của hệ thống.
Giả thiết khi ch−ơng trình đang đ−ợc thực thi ở tác vụ check_kbd_io()thì
có các byte dữ liệu đến từ cổng nối tiếp và hệ thống phải xử lý các byte dữ liệu
-62-
đó nghĩa là cần phải thực hiện tác vụ process_serial_cmds().Hạn chế
này sẽ đ−ợc khắc phục bằng cách viết ở ví dụ 3.
Trong ví dụ 3, đầu tiên vi điều khiển sẽ thực thi ở tác vụ có tên là job0,
tác vụ này khởi tạo cho 2 tác vụ job1 và job2 đồng thời là nhiệm vụ của chính
nó là tăng biến counter0. Sau khi thực hiện xong task 0, CPU sẽ chuyển sang
thực hiện task 1 và task 2 sau đó lại quay trở lại thực hiện task 0. ý t−ởng chia
thời gian xử lý của CPU thành các khe thời gian một các thích hợp và luân
phiên thực hiện các tác vụ chính là ý t−ởng của hệ điều hành đa nhiệm (hình
4.2). Trên thực tế nếu tổ chức các tác vụ một cách hợp lý và phân chia thời
gian của CPU một các hợp lý cho các tác vụ sao cho khi đang thực thi ở tác vụ
này, các tác vụ khác không bị ảnh h−ởng thì cảm giác d−ờng nh− tất cả các tác
vụ đang đ−ợc thực hiện đồng thời (hình 4.1).
Hình 4.1. Các tác vụ đ−ợc thực hiện đồng thời (song song)
Hình 4.2. Các tác vụ đ−ợc thực hiện luân phiên liên tục
Trong thực tế chúng ta gặp rất nhiều các hệ thống đo l−ờng điều khiển tự
động hoá mà các hệ thống này th−ờng phải xử lý nhiều công việc cùng một
t1 t2 ... tn time
task 0
task 1
task 2
t1 t2 ... tn time
task 0
task 1
task 2
-63-
lúc với đáp ứng khắt khe vê thời gian. Với các hệ thống này thì các ch−ơng
trình điều khiển viết theo cấu trúc tuần tự đơn giản (ví dụ 1, ví dụ 2) tỏ ra
không thể đáp ứng đ−ợc. Vấn đề đó chỉ có thể đ−ợc giải quyết nếu hệ thống có
một hệ điều hành.
Tr−ờng Đại học Công nghiệp là một trong những cơ sở đào tạo có sự gắn
kết giữa hoạt động đào tạo và thực tiễn xã hội cao. Việc đ−a vào giảng dạy
môn “thiết kế hệ điều hành trên vi điều khiển” là một việc hết sức cần thiết
vào thời điểm khi mà công nghệ tự động hoá đang phát triển mạnh nh− hiện
nay.
4.1.2. Yêu cầu
Do đặc thù là một hệ điều hành thời gian thực (RTOS - Real Time
Operating System) đ−ợc thiết kế trên một hệ vi điều khiển 8 bít và thiết kế để
phục vụ công tác thí nghiệm ở một cơ sở đào tạo nên hệ điều hành phải có một
số yêu cầu cụ thể sau:
- Phải thực thi đồng thời đ−ợc nhiều ch−ơng trình nạp trong bộ nhớ ROM
nh− chức năng của một hệ điều hành đa nhiệm.
- Phải có đáp ứng tức thì với các tác động của ng−ời sử dụng nh− yêu cầu
của một hệ điều hành thời gian thực.
- Kích th−ớc của nhân hệ điều hành và các ch−ơng trình đ−ợc nạp sẵn
trong bộ nhớ ROM không đ−ợc v−ợt quá 8 Kb. Bộ nhớ RAM dành cho hệ
điều hành tối đa là 8 Kb – 256 byte.
- Hệ điều hành đ−ợc viết bằng 2 ngôn ngữ chính là C và hợp ngữ nhúng
trong trình dịch C, đây là 2 ngôn ngữ học sinh đã đ−ợc học tr−ợc khi học môn
“thiết kế hệ điều hành trên vi điều khiển”. Các thành phần của hệ điều hành
đ−ợc viết thành các module, thuận tiện cho ng−ời học có thể soát lỗi và thay
đổi.
Đứng trên góc độ ng−ời sử dụng thì hệ thống phải thực hiện đ−ợc 3
nhiệm vụ đồng thời là quét hiển thị thông tin trên ma trận LED; quét hiển thị
-64-
thời gian trên LED 7 đoạn và hiển thị các thông tin cần thiết trên màn hình
tinh thể lỏng. Khi có tác động của ng−ời sử dụng trên các phím nhấn, hệ thống
phải có đáp ứng tức thì bằng việc thông báo lên LCD và thay đổi các thông tin
theo phím nhấn trên các LED.
4.2. Trình tự thiết kế hệ điều hành.
Do đặc tr−ng hệ vi điều khiển 8 bit là một một hệ thống nhỏ chỉ phục vụ
quá trình thí nghiệm nên hệ điều hành viết cho nó cũng không qua phức tạp.
Với những hệ điều hành kiểu này chúng ta có thể thiết kế theo nguyên tắc
Module hoá, nghĩa là liệt kê các module có trong hệ điều hành, thiết kế chúng,
sau đó liên kết chúng lại. Các b−ớc tiến hành có thể nh− sau:
-B−ớc 1: Từ mục đích yêu cầu thiết kế, liệt kê các module cần thiết cho hệ
điều hành.
-B−ớc 2: Thiết kế các module đồng thời có thể chạy thử các module để đảm
bảo tính chính xác của chúng tr−ớc khi đ−ợc liên kết.
- B−ớc 3: Liên kết các module của hệ điều hành.
- B−ớc 4: Chạy thử và kiểm tra kết quả.
B−ớc 2 và b−ớc 3 chính là hai b−ớc quan trọng nhất. Thông th−ờng thì hai
b−ớc này đôi khi đ−ợc thực hiện đồng thời vì có những module công việc
chính của nó là liên kết các module khác.
Công việc của b−ớc 2 và b−ớc 3 gồm 2 phần chính:
- Thiết kế các ch−ơng trình th−ờng trú trong bộ nhớ ROM, khi hệ điều hành
hoàn tất các ch−ơng trình này sẽ trở thành các tiến trình song song. Công việc
này bao gồm cả việc giải quyết tài nguyên găng và đoạn tới hạn. Công việc
này có thể gọi là “xây dựng các tiến trình”
- Thiết kế nhân của hệ điều hành. Công việc này thực chất là làm thế nào để
có thể quản lý, phân bổ tài nguyên cho các tiến trình hoạt động. Hai tài
nguyên quan trọng nhất đó chính là thời gian của CPU và bộ nhớ. Phân bổ
-65-
thời gian CPU một cách hợp lý để tận dụng tối đa khả năng làm việc của CPU;
phân bổ bộ nhớ cho các tiến trình một cách khoa học để không bị xung đột là
mục đích chính của phần này. Công việc của phần này chính là 2 công việc:
Lập lịch cho CPU và quản lý bộ nhớ.
4.3. Xây dựng các tiến trình.
4.3.1. Xây dựng các tác vụ t−ơng ứng các tiến trình.
4.3.1.1. Nguyên tắc xây dựng các tác vụ trên trình dịch C.
Trình dịch C cho phép xây dựng tới 16 tác vụ, 16 tác vụ này có thể luân
phiên thực hiện, khi đó hệ thống có thể có tới 16 tiến trình.
Các tác vụ đ−ợc trình dịch C định nghĩa nh− sau :
void name (void) _task_ task ID
Trong đó:
name là tên các tác vụ.
task ID là số hiệu của các tác vụ (task ID- 0 đến 15).
Ví dụ:
void init (void) _task_ task 0
Khi thực hiện, CPU luôn thực hiện ở task 0 tr−ớc tiên, chính vì vậy task 0
luôn đ−ợc dùng để khởi tạo hoặc không khởi tạo cho các task khác.
Để khởi tạo cho một task, trình dịch C cung cấp sắn hàm
os_create(task ID).
Ví dụ cần khởi tạo task 5 thì câu lệnh t−ơng ứng sẽ là: os_create(5)
Để không khởi tạo một task nào đó (đ−a task đó vào trạng thái dừng-
halt), trình dịch C cung cấp sẵn hàm os_delete (task ID).
Ví dụ cần dừng task 5 thì câu lệnh t−ơng ứng sẽ là: os_delete (5)
-66-
4.3.1.2. Xây dựng các tác vụ.
Nh− đã đề cập trong ch−ơng 3, hệ thống phần cứng đ−ợc thiết kế với các
thành phần chính bao gồm (1):
- Hệ thống hiển thị thông tin trên ma trận LED bao gồm 3 ma trận LED.
- Đồng hồ thời gian thực hiển thị bằng 4 LED 7 thanh.
- Giao diện ng−ời sử dụng gồm 1 màn hình tinh thể lỏng LCD và các
phím nhấn.
Với hệ thông này thì có thể chia thành các tác vụ nh− sau:
- Tác vụ 0 (task 0) : Dùng để khởi tạo cho các tác vụ khác
- Tác vụ 1 (task 1): Dùng để nhận lệnh điều khiển từ ng−ời sử dụng, từ đó
gửi tín hiệu điều khiển cho các tác vụ khác.
- Tác vụ 2 (task 2): Dùng để hiển thị các thông báo trên LCD phục vụ
ng−ời điều khiển.
- Tác vụ 3 (task 3): Tác vụ thời gian, tác vụ này cung cấp thời gian thực
cho các tác vụ 4
- Tác vụ 4 (task 4) : Dùng để quét các thông số phút, giây theo thời gian
thực lên 4 LED 7 thanh.
- Tác vụ 5 (task 5) : Dùng để quét các thông tin cần hiển thị trên ma trận
LED.
Giải thuật của các tác vụ nh− sau:
Tác vụ 4 (task 4):
while (1) /* lặp vô tận */
{
Trễ 1 giây (dùng bộ định thời);
Tăng biến giây lên 1 đơn vị;
if (biến giây == 60)
-67-
{
biến giây = 0;
Tăng biến phút lên 1 đơn vị;
if (biến phút == 60)
{
Biến phút = 0;
Tăng biến giờ lên 1 đơn vị;
if (biến giờ == 24)
{
biến giờ=0;
}
}
}
}
Tác vụ 5 (task 5):
Giả thiết cần hiển thị x phút và y giây:
while(1) /*lặp vô tận*/
{
cập nhật thời gian thực vào hai biến x và y;
phut_hang_don_vi=x%10;
phut_hang_chuc =x/10;
giay_hang_don_vi=y%10;
giay_hang_chuc =x/10;
P1=M[x/10]; //xuất mã của chỉ số hàng chục lên
LED thứ nhất.
P2.0=1; //cấp nguồn để LED thứ nhất sáng
Trễ 30ms; //chu kỳ quét nhở hơn 1/14 giây.
-68-
P1=M[x%10]; //xuất mã của chỉ số hàng đơn vị lên
LED thứ hai.
P2.1=1; //cấp nguồn để LED thứ hai sáng
Trễ 30ms; //chu kỳ quét nhở hơn 1/14 giây.
P1=M[y/10]; //xuất mã của chỉ số hàng chục lên
LED thứ ba.
P2.2=1; //cấp nguồn để LED thứ ba sáng
Trễ 30ms; //chu kỳ quét nhở hơn 1/14 giây.
P1=M[y/%0]; //xuất mã của chỉ số đơn vị của LED
thứ t−.
P2.3=1; //cấp nguồn để LED thứ t− sáng
Trễ 30ms; //chu kỳ quét nhở hơn 1/14 giây.
}
-Tác vụ 5 (task 5) :
while(1) //lặp vô tận
{
Xuất mã của dòng chữ thứ nhất lên các cột của ma
trận LED (Port 0,2,3);
Dòng thứ nhất sáng;
Trễ 30ms; chu kỳ quét nhỏ hơn 1/24 giây.
Xuất mã của dòng chữ thứ hai lên các cột của ma
trận LED (Port 0,2,3);
Dòng thứ hai sáng;
Trễ 30ms; chu kỳ quét nhỏ hơn 1/24 giây.
Xuất mã của dòng chữ thứ ba lên các cột của ma
trận LED (Port 0,2,3);
Dòng thứ ba sáng;
Trễ 30ms; chu kỳ quét nhỏ hơn 1/24 giây.
...
-69-
Xuất mã của dòng chữ thứ tám lên các cột của ma
trận LED (Port 0,2,3);
Dòng thứ tám sáng;
Trễ 30ms; chu kỳ quét nhỏ hơn 1/24 giây.
}
4.3.2. Giải quyết bài toán tài nguyên găng
4.3.2.1. Tài nguyên găng trong hệ thống.
Nh− đã đề cập trong phần thiết kế phần cứng, Port 1 của bộ vi điều khiển
đ−ợc thiết kế để quét hàng cho các ma trận LED và cũng đ−ợc dùng để quét
cho các LED 7 thanh. Chu của 2 kỹ thuật quét này là t−ơng đ−ơng nhau và
đ−ợc chọn là 30 ms. Giản đồ xung trên Port 1 có thể mô tả nh− hình 4.3
Hình 4.3. Giản đồ xung trên P1
Sau khi xuất giá trị lên Port 1 để quét hàng, tác vụ 4 có câu lệnh trễ 30
ms. Trong khoảng thời gian này CPU sẽ chuyển sang thực hiện một tác vụ
30ms
30ms
Thời điểm cần
xuất giá trị
00001011 trên
Port 1 để quét
hàng ma trận LED
Thời điểm cần
xuất giá trị
00101011 trên
Port 1 để quét
LED 7 đoạn
t3
to t2
t1
-70-
khác nh−ng riêng tài nguyên I/O là Port 1 thì không đ−ợc sử dụng vào mục
đích khác. Trong khoảng thời gian 30ms này, giả thiết CPU chuyển sang thực
hiện tác vụ 5 và tác vụ này cũng làm công việc là xuất giá trị lên Port 1 để
quét LED 7 đoạn. Nh− vậy Port 1 chính là tài nguyên găng trong bài toán này
và đoạn ch−ơng trình sử dụng Port 1 chính là đoạn ch−ơng trình tới hạn.
4.3.2.2. Giải pháp giải quyết tài nguyên găng.
Nh− đã trình bày ở ch−ơng 1, có khá nhiều ph−ơng pháp để giải quyết
tuy nhiên hầu hết các ph−ơng pháp đều đ−a ra giải pháp là giải quyết cho từng
tiến trình đi vào đoạn tới hạn của nó, tiến trình còn lại phải chờ.
Các giải pháp này không phù hợp với bài toán này vì cả hai tiến trình có
tài nguyên găng đều là các tiến trình làm nhiệm vụ hiển thị bằng kỹ thuật
quét. Nếu một tiến trình nào đó phải chờ tiến trình kia ra khỏi đoạn tới hạn thì
tần số quét sẽ bị thay đổi, đây là điều không thể cháp nhận.
Hiện tại thời gian sử dụng Port 1 của cả hai tiến trình đều là 30 ms tuy
nhiên thời gian tác động đến Port 1 của mỗi tiến trình chỉ là vài micro giây
(thời gan thực hiện một lệnh). Nếu nh− dùng một vi mạch chốt để l−u lại giá
trị của Port 1 cho các tiến trình khác nhau thì P1 sẽ không bị chiếm giữ liên
tục trong 30 ms và đồng nghĩa với việc loại trừ đ−ợc tài nguyên găng trong hệ
thống (hình 4.4).
74HC573
2
3
4
5
6
7
8
9
11
1
19
18
17
16
15
14
13
12
D0
D1
D2
D3
D4
D5
D6
D7
LE
OE
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
29
30
31
19
18
9
39
38
37
36
35
34
33
32
1
2
3
4
5
6
7
8
21
22
23
24
25
26
27
28
10
11
12
13
14
15
16
17PSEN
ALE
EA
X1
X2
RST
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD 74HC573
2
3
4
5
6
7
8
9
11
1
19
18
17
16
15
14
13
12
D0
D1
D2
D3
D4
D5
D6
D7
LE
OE
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
Hình 4.4. Chốt lại giá trị của P1
Tới
hàng
của ma
trận
LED
Tới
LED
7 đoạn
-71-
4.4. Lập lịch cho CPU.
4.4.1. Sự kiện và chuyển trạng thái giữa các tiến trình.
4.4.1.1. Sự kiện(event).
Khái niệm về sự kiện trong bài toán cụ thể này có thể hiểu là các điểm
thời gian mà các tiến trình có thể đ−ợc thực thi (running), có thể bị dừng...Có
thể có một số loại sự kiện sau:
- Time out.
Một hệ thống có hệ điều hành đa nhiệm sẽ có khả năng thực thi nhiều tác
vụ cùng một lúc. Tuy nhiên điều này chỉ thấy trên khía cạnh ng−ời sử dụng hệ
điều hành còn trên khái cạnh ng−ời thiết kế thì đó chỉ là việc phân chia thời
gian CPU sao cho các tiến trình để tạo cảm giác nh− các tiến trình đều đang
đ−ợc thực hiện. Việc phân chia thời gian cho CPU có thể làm một cách đơn
giản là dùng một bộ định thời, định ra các khoảng thời gian bằng nhau và chia
cho các tiến trình các khoảng thời gian bằng nhau đó để thực hiện. Khoảng
thời gian đó gọi là time out.
Hình 4.5. Các tiến trình đ−ợc phân bổ thời gian CPU bằng nhau
Trên hình 4.5 mô tả 3 tiến trình đ−ợc phân phối các khoảng thời gian
bằng nhau và bằng 100 ms. Theo đó trong 100 ms đầu CPU sẽ thực thi task 0,
task 1 và task 2 ở trạng thái chờ, kết thúc 100 ms, CPU sẽ chuyển dừng task 0,
t
task 0
task 1
task 2
Time out
=100 ms
-72-
chuyển sang thực hiện ở task 2, task 3 ở trạng thái chờ, kết thúc 200 ms, CPU
sẽ dừng task 2, chuyển sang thực hiện task 3...
Giải pháp tạo ra time out để luân phiên thực hiện giữa các tiến trình là sử
dụng ngắt của bộ định thời 0 theo giải thuật sau:
/*phần khởi tạo*/
-khởi tạo cho bộ định thời 0 chế độ 2(chế độ tự
nạp lại) với giá trị ban đầu=giátrị nạp lại=-100 .
-Cho phép ngắt do bộ định thời 0.
counter=0;
...
/*ch−ơng trình phục vụ ngắt do bộ định thời 0*/
ISRtimer0(){
if(counter<=2) //giả sử có 3 tiến trình, nếu
biến counter ch−a tăng quá 2 {
tăng biến counter;
cất các thanh ghi vào vùng ngăn xếp của tiến
trình hiện tại
chuyển con trỏ lệnh IP tới tiến trình có số hiệu
bằng biến counter.
} ;
else {
counter=0;
cất các thanh ghi vào vùng ngăn xếp của tiến
trình hiện tại
chuyển con trỏ lệnh IP tới tiến trình có số hiệu
bằng biến counter. }
}
-73-
Có thể mô tả hoạt động của ch−ơng trình trên bằng hình 4.6.
Hình 4.6. Chuyển giữa các tiến trình bằng sự kiện time out
-Signal.
Nếu nh− dùng các khoảng thời gian bằng nhau để phân phối cho các tiến
trình thì có thể sẽ xảy ra hiện t−ợng là có những tiến trình khoảng thời gian đó
là không đủ để thực hiện một phần việc; có những tiến trình khoảng thời gian
đó là thừa để thực hiện một phần việc. Điều này có thể khắc phục bằng cách
không chờ đến hết 100ms mới chuyển quyền chiếm thời gian của CPU sang
tiến trình khác mà một tiến trình chỉ cần thực hiện hết phần việc của mình là
có thể gửi tín hiệu (signal) cho tiến trình khác thực hiện ngay. Nh− vậy sẽ tận
dụng đ−ợc thời gian của CPU hơn. cúng ta cùng xem xét ví dụ sau:
void job0 (void) _task_ 0
{
//thực hiện công việc của task 0
os_send-signal(1); //gửi tín hiệu tới task 1
}
t
task 0
task 1
task 2
Hết 100ms,
xảy ra ngắt do
bộ định thời 0.
ISRtimer0()
{
while(counter<=2)
{
tăng biến counter;
cất các thanh ghi vào
vùng ngăn xếp của tiến
trình hiện tại;
chuyển con trỏ lệnh IP
tới tiến trình có số hiệu
bằng biến counter;
} ;
else
{
counter=0;
cất các thanh ghi vào
vùng ngăn xếp của tiến
trình hiện tại
chuyển con trỏ lệnh IP
tới tiến trình có số hiệu
bằng biến counter.
}
}
-74-
void job1 (void) _task_ 1
{
os_wait(K_SIG,0)//đợi tín hiệu từ task 0
//thực hiện công việc của task 1
os_send-signal(2); //gửi tín hiệu tới task 2
}
void job1 (void) _task_ 2
{
os_wait(K_SIG,1)//đợi tín hiệu từ task 1
//thực hiện công việc của task 2
}
Hoạt động của ch−ơng trình ở ví dụ trên có thể mô tả nh− sau:
Hình 4.7. Các tiến trình đ−ợc phân bổ thời gian CPU khác nhau
Trong khoảng thời gian từ t1 đến t2, task 0 thực hiện xong công việc của
mình, nó gửi tín hiệu cho task 1(os_send-signal(1)). task 1 trong trạng
thái sẵn sàng và chờ tín hiệu của task 0(os_wait(K_SIG,0)). Khi nhận
đ−ợc nó thực hiện ngay công việc của mình.T−ơng tự, Trong khoảng thời gian
từ t2 đến t3, task 1 thực hiện xong công việc của mình, nó gửi tín hiệu cho
task 2(os_send-signal(2)). task 2 trong trạng thái sẵn sàng và chờ tín
hiệu của task 1(os_wait(K_SIG,1)). Khi nhận đ−ợc nó thực hiện ngay
công việc của mình. Nh− vậy ngay khi tiến trình này kết thúc thì tiến trình kia
đi vào hoạt động, thời gian nhàn rỗi của CPU là không có.
t1 t2 t3 t4
task 0
task 1
task 2
-75-
- interrupt.
Một trong những đặc tr−ng của hệ điều hành thời gian thực là khả năng
đáp ứng của nó với kích thích từ thế giới bên ngoài hay còn gọi là lệnh của
ng−ời sử dụng trong tình huống cụ thể này.
Giả thiết hệ thống đ−ợc thiết kế với 5 tiến trình trong đó có tiến trình 1 là
tiến trình điều khiển, tiến trình này sẽ nhận lệnh từ ng−ời sử dụng và điều
khiển sự hoạt động của các tiến trình khác. Hệ thống sẽ đáp ứng tốt nếu nh−
ng−ời sử dụng ra lệnh vào đúng thời điểm mà thời gian của CPU đang đ−ợc
phân phối cho tiến trình 1(tình huống 1). Tr−ờng hợp ng−ợc lại nếu ng−ời sử
dụng ra lệnh vào đúng thời điểm mà thời gian của CPU đang đ−ợc phân phối
cho một tiến trình khác không phải là tiến trình 1(tình huống 1) thì lệnh đó
không thể đ−ợc đáp ứng kịp thời hoặc có thể không đ−ợc đáp ứng (hình 4.8).
Hình 4.8. Ng−ời sử dụng ra lệnh vào các thời điểm khác nhau
Để khắc phụ tình trạng này, các lệnh từ phía ng−ời sử dụng đều phải
đ−ợc thiết kế để có thể gây ra ngắt. Mỗi lệnh sẽ gây ra một ngắt t−ơng ứng với
t
task 0
task 1
task 2
task 3
task 4
task 5
Tình huống 1: Ng−ời sử
dụng ra lệnh vào thời điểm
CPU đang thực hiện tiến
trình 1
Tình huống 2: Ng−ời sử
dụng ra lệnh vào thời điểm
CPU đang thực hiện tiến
trình 3
-76-
câu lệnh đó, khi đó mỗi khi ra lệnh, CPU sẽ ngừng ngay tiến trình hiện thời và
chuyển sang ch−ơng trình con phục vụ ngắt có véc tơ t−ơng ứng. Từ ch−ơng
trình con phục vụ ngắt sẽ quay về tiến trình 1 để điều khiển các tiến trình khác
theo lệnh của ng−ời sử dụng.
Hình 4.9. Chuyển giữa cá tiến trình bằng sự kiện interrupt
4.4.1.2. Chuyển giữa các tiến trình(context switching).
1. Khái niệm.
Một tiến tình có thể coi nh− một ch−ơng trình, ch−ơng trình này đ−ợc mã
hoá và chiếm một đoạn nào đó trong bộ nhớ. Ch−ơng trình này sẽ đ−ợc gọi
đến (để thực thi) bất kỳ lúc nào và cũng có thể kết thúc bất kỳ lúc nào sau đó
lại bắt đầu lại cũng vào thời diểm bất kỳ. Việc quyết định tiến trình hoạt động
hay dừng vào thời điểm nào là hoàn toàn do nhân của hệ điều hành.
Khi mỗi tiến trình hoạt động nó đều sử dụng các tài nguyên nh− CPU, bộ
nhớ RAM, các thanh ghi...Mỗi tiến trình đều sử dụng các tài nguyên đó theo
cách khác nhau và khi bị dừng chúng cũng làm thay đổi các tài nguyên đó
khác nhau, ví dụ nh− trạng thái của CPU, giá trị của các thanh ghi, giá trị của
các ô nhớ trong RAM...
t
task 0
task 1
task 2
Ng−ời sử
dụng ra lệnh
ISR()
{
L−u lại lệnh ng−ời sử
dụng vào cá biến;
Quay trở về tiến trình 1;
}
Tới các tiến trình khác
-77-
Hình 4.9. Mô tả trạng thái của các tài nguyên của tiến trình.
Một vấn đề đặt ra là làm thế nào để có thể dừng tiến trình sau đó lại bắt
đầu lại mà không bị ảnh h−ởng gì. Để thực hiện đ−ợc điều này thì hệ điều
hành cần phải l−u lại đ−ợc trạng thái của các tài nguyên mà tiến trình đang sử
dụng khi nó bị dừng bởi hệ điều hành và lấy lại đ−ợc trạng thái của các tài
nguyên này khi tiến trình đ−ợc bắt đầu lại. Hoạt động l−u, và phục hồi trạng
thái của các tài nguyên của một tiến trình gọi là Context Switching.
Trong bị vi điều khiển, một số tài nguyên cần phải đ−ợc cất mỗi khi
chuyển từ tiến trình này sang tiến trình khác nh− sau:
- Các thanh ghi trung gian.
- Thanh ghi trạng thái.
- Bộ đếm ch−ơng trình (con trỏ lệnh).
Tiến trình bị dừng ngày tr−ớc khi nó đi vào thực hiện lệnh cộng
Hai câu lệnh tr−ớc của tiến trình đã đặt 2 số hạng vào 2 thanh ghi để thực
hiện lệnh cộng. Tuy nhiên tr−ớc khi thực hiện phép cộng tiến trình bị
dừng và một tiến trình khác hoạt động. Khi quay trở lại thì tiến trình sẽ
thực hiện cau lệnh cộng tuy nhiên lúc đó 2 số hạng trong 2 thanh ghi có
thể đã bị thay đổi bời các câu lệnh của các tiến trình khác.
-78-
- Con trỏ ngăn xếp.
Hình 4.10. Các tài nguyên cần l−u khi dừng một tiến trình.
2. L−u các tài nguyên của tiến trình.
Các bộ vi điều khiển đều có một vùng nhớ đặc biệt gọi là ngăn xếp, vùng
nhớ này cho phép có thể cất nội dung của các thanh ghi vào và cho phép lấy ra
theo nguyên tắc LIFO (Last in First out). Mặt khác trong tập lệnh của các bộ
vi điều khiển đều có câu lệnh cất vào ngăn xếp (push) và lấy ra từ ngăn xếp
(pop). Dựa vào các căn cứ này chúng ta có thể xây dựng một ch−ơng trình con
chuyên làm nhiệm vụ cất các thanh ghi mỗi khi tiến trình bị dừng.
Có 2 vấn đề đặt ra với ch−ơng trình này là:
Thứ nhất: Phải phân bổ ngăn xếp cho hợp lý. Vùng dành để l−u trạng thái
các thanh ghi cho các tiến trình phải đủ cho n tiến trình. Vùng dành cho các
-79-
tiến trình sử dụng phải đủ cho tiến trình có dug l−ợng ngăn xếp cần sử dụng
lớn nhất trong các tiến trình (hình 4.11).
Hình 4.11. Phân bổ ngăn xếp cho các tiến trình
Thứ hai: Vì ngăn xếp hoạt động theo nguyên tắc LIFO nên trong ch−ơng
trình phải xác định đ−ợc thanh ghi nào cần phải đ−ợc cất tr−ớc và thnh ghi nào
cần phải đ−ợc cất sau.
Giải thuật của ch−ơng trình nh− sau:
#define SAVE_CONTEXT()
asm volatile {
-đọc biến task_num để xác định tiến trình nào bị
dừng.
-cất nội dung của con trỏ ngăn xếp hiện tại sang
biến save_SP.
-Cập nhật vị trí ngăn xếp cần cất vào thanh ghi
con trỏ ngăn xếp
-Cất giá trị của thanh ghi con trỏ ngăn xếp
trong biến save_SP
-Cất các thanh ghi trung gian
-Cất thanh ghi trạng thái.
- Cất bộ đếm ch−ơng trình.
}
Vùng dành cho
các tiến trình
sử dụng
Tiến trình 1
Tiến trình 2
....
Tiến trình n
Vùng dành
để l−u trạng
thái các
thanh ghi
cho các tiến
trình
-80-
3. Phục hồi các tài nguyên của tiến trình.
Vì ngăn xếp hoạt động theo nguyên tắc LIFO nên giải thuật của ch−ơng
trình RESTORE_CONTEXT() sẽ ng−ợc với ch−ơng trình
SAVE_CONTEXT():
#define RESTORE_CONTEXT()
asm volatile
{
-đọc biến task_num để xác định tiến trình nào
đ−ợc phục hồi.
-Cập nhật vị trí ngăn xếp cần cất vào thanh ghi
con trỏ ngăn xếp
-Lấy bộ đếm ch−ơng trình.
-Lấy thanh ghi trạng thái.
-Lấy các thanh ghi trung gian
-Lấy con trỏ ngăn xếp.
}
4.4.2. Lập lịch cho CPU
Nh− đã trình bày trong ch−ơng 1, có khá nhiều thuật toán để lập lịch cho
CPU tuy nhiên do đặc thù của hệ thống có 6 tác vụ và các tiến trình cũng đ−ợc
xác định tr−ớc nên có thể chọn thuật toán RR kết hợp với xử lý ngắt khi có sự
tác động của ng−ời sử dụng lên các phím nhấn.
Các tác vụ trên hệ thống có những đặc thù khác nhau chính vì vậy có thể
phân loại và áp dụng cách phân phối tài giờ CPU theo các nguyên tắc khác
nhau trên cơ sở thuật toán RR.
Quét chữ trên ma trận LED:
Nh− đã trình bày ở ch−ơng 3, để quét chữ trên ma trận LED thì cần có 8
lần xuất dữ liệu và giữa các lần đó là các khoảng thời gian trễ 25 ms chính vì
vậy 8 tiến trình này mỗi tiến trình thực chất chỉ chạy (running) trong khoảng
-81-
thời gian cở vài micro giây (khoảng thời gian thực hiện 2 lệnh), thời gian trễ
tiến trình sẽ đi vào trạng thái đợi (waitting) cho đến khi sự kiện time out (hết
25ms) xảy ra thì tiến trình lại đ−ợc tiếp tục (hình 4.12).
Khoảng thời gian từ t0 đến t1: Tiến trình 1 (P1) ở trạng thái running.
Khoảng thời gian từ t1 đến t3 (25 ms): Tiến trình 1 (P1) ở trạng thái waiting.
Khoảng thời gian từ t2 đến t3: Tài nguyên giờ CPU đ−ợc phân phối cho các tiến trình
khác (ngoài 8 tiến trình trên).
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
Quét các số trên LED 7 đoạn :
Hệ thống đ−ợc thiết kế với 4 LED 7 đoạn để hiển thị các thông tin về thời
gian thực vì vậy cần 4 tiến trình để thực hiện tác vụ này. Nguyên tắc quét trên
LED 7 đoạn t−ơng tự nguyên tắc quét trên ma trận LED vì vậy 4 tiến trình này
cũng hoạt động theo nguyên tắc của 4 tiến trình trên (hình 4.13).
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
P1
P2
P3
P4
P5
P6
P7
P8
t0 t1 t2 t3
t
......... Tiến trình ỏ trạng thái waiting.
Tiến trình ở trạng thái running
P9
P10
P11
P12
t0 t1 t2 t3
t
......... Tiến trình ỏ trạng thái waiting.
Tiến trình ở trạng thái running
-82-
Hiển thị thông tin trên LCD:
Khi bật nguồn, hệ thông sẽ chạy mặc định với một dòng chữ trên ma trận
LED và mặc định kiểu đồng hồ thời gian là phút và giây, trên LCD cùng hiển
thị một dòng chữ mặc định. Khi có lệnh của ng−ời sử dụng, tuỳ theo câu lệnh
của ng−ời sử dụng có các dòng chữ hiển thị khá nhau trên LCD. Nh− vậy tiến
trình này ban đầu chỉ gồm các lệnh xuất ký tự hiển thị sau đó đi vào trạng thái
đợi vô thời hạn cho đến khi có sự kiện ng−ời sử dụng ra lệnh (gây ra ngắt) thì
mới bắt chạy lại và sau đó lại đợi sự kiện ng−ời sử dụng ra lệnh tiếp theo.
Khoảng thời gian tiến trình ở chạy (running) chỉ cở vài micro giây còn khoảng
thời gian nó ở trạng thái đợi là không biết tr−ớc chính vì vậy có thể dùng sự
kiện signal để đợi từ một tiến trình khác.
Hình 4.14. Lập lịch cho tiến trình điều khiển LCD
- Quản lý thời gian thực:
Giải thuật của tác vụ này là liên tục tăng biến giây lên mỗi đơn vị sau 40
sự kiện timeout (25ms x 40 = 1000ms = 1s) và tăng biến phút lên 1 đơn vị sau
khi biến giây tăng đ−ợc 60 lần... Căn cứ vào giải thuật này có thể chọn sự kiện
timeout để đ−a tiến trình trở lại trạng thái running từ trạng thái waiting.
Hình 4.15. Lập lịch cho tiến trình thời gian thực
Running waiting running
Ng−ời sử dụng ra lệnh
P13
Running waiting(25ms) running
Hết 25 ms
P14
-83-
- Khởi tạo các thông số:
Màn hình tinh thể lỏng, các thanh ghi cho phép ngắt, các thnh ghi của các
bộ định thời...là các đối t−ợng cần đ−ợc khởi tạo tr−ớc khi chúng đ−ợc các tiến
trình sử dụng nh− một tài nguyên hệ thống.
Tiến trình này cần phải đ−ợc hoạt động tr−ớc tiên khi hệ thống bắt đầu đi
vào hoạt động. Tiến trình này là một tiến trình khá đặc biệt, do thao tác khởi
tạo chỉ cần một lần nên tiến trình này cũng chỉ cần chạy một lần duy nhất.
Tiến trình này sẽ mang số hiệu 0, khi thực hiện, nó sẽ đ−ợc −u tiên thực hiện
đầu tiên.
4.5. Quản lý bộ nhớ.
Hệ điều hành đ−ợc thiết kế trên một phần cứng là hệ vi điều khiển. Hệ vi
điều khiển chỉ có bộ nhớ ROM và bộ nhớ RAM, không giống các máy tính có
nhiều cấp bộ nhớ nên cũng không có các kỹ thuật phân đoạn phân trang...
đ−ợc áp dụng. Trong mục này chỉ đi vào giải quyết việc tổ chức phân chia bộ
nhớ cho các tiến trình, các ch−ơng trình của nhân hệ điều hành sao cho hợp lý
và tránh xung đột bộ nhớ.
Hình 4.16. Tổ chức bộ nhớ ROM của hệ vi điều khiển
0000H
0003H
000BH
0013H
001BH
0023H
002BH
.
.
.
1FFFH
Ngắt do reset hệ thống
Ngắt ngoài 0
Ngắt do bộ định thời 0
Ngắt ngoài 1
Ngắt do bộ định thời 1
Ngắt do port nối tiếp
Ngắt do bộ định thời 2
-84-
Nh− trên hình 4.12 không gian dành cho các ch−ơng trình con phục vụ
ngắt là rất nhỏ trong khi đây chính là nhân của hệ điều hành. Để khắc phục
vấn đề này, ch−ơng trình con phục vụ ngắt có thể đặt ở vị trí khác trong bộ
nhớ và ở vị trí của các véc tơ ngắt có thể đặt câu lệnh để nhảy tới các điểm đặt
ch−ơng trình con phục vụ ngắt (hình 4.17).
Hình 4.17. Thay đổi vị trí đặt các ch−ơng trình con phục vụ ngắt
Ngoài các vùng dùng để chứa các ch−ơng trình con phục vụ ngắt ra, vùng
nhớ còn lại sẽ thuộc về mã của các ch−ơng trình t−ơng ứng với các tiến trình.
Nh− vậy bộ nhớ ch−ơng trình sẽ đ−ợc chia thành 3 vùng chính:
Vùng 1: Vùng này chỉ đặt các câu lệnh nhảy tới các ch−ơng trình con
phục vụ ngắt tại vị trí của các véc tơ ngắt t−ong ứng.
Vùng 2: Là vùng để đặt các ch−ơng trình con phục vụ ngắt.
Vùng 3: Là vùng chứa mã của các ch−ơng trình t−ơng ứng với các tiến
trình có trong hệ thống.
JMP Main
JMP EX0ISR
0000H
0003H
000BH
0013H
001BH
0023H
002BH
.
.
.
1FFFH
Main:
EX0ISR:
-85-
Hình 4.18. Phân bổ bộ nhớ ROM
Cũng t−ơng tự nh− bộ nhớ ch−ơng trình, bộ nhớ dữ liệu cũng phải đ−ợc
tổ chức thành các vùng khác nhau để tránh việc chồng chéo lên nhau khi thực
hiện.
Hình 4.19. Phân bổ bộ nhớ RAM
0000H
0003H
000BH
0013H
001BH
0023H
002BH
.
.
.
1FFFH
Vùng 1
Vùng 2
Vùng 3
Nhân
của
hệ
điều
hành
0000H
001FH
.
.
.
1FFFH
Vùng 1: Dành cho các
thanh ghi đa năng
Vùng 2: Dành cho các
tiến trình đang hoạt
động
Vùng 3: Dành cho việc
l−u trạng thái của các
thanh ghi của mỗĩ tiến
trình khi nó bị dừng
bởi hệ điều hành
-86-
Kết luận và kiến nghị
Sau thời gian nghiên cứu và tìm hiểu về nguyên tắc thiết kế các hệ điều
hành nhỏ trên các bộ vi điều khiển, tôi đã đạt đ−ợc một số kết quả sau:
- Nắm đ−ợc ph−ơng pháp thiết kế mới các hệ vi điều khiển.
- Nắm đ−ợc ph−ơng pháp thiết kế các hệ điều hành cho các hệ vi điều
khiển
- Có kỹ năng sử dụng các trình biên dịch, phần mềm nạp cho các bộ vi
điều khiển.
- Thiết kế thành công module thí nghiệm hệ điều hành cho vi điều khiển
dung cho mục đích nghiên cứu, giảng dạy, thí nghiệm.
Với mục đích nghiên cứu tìm hiểu để thiết kế module phục vụ công tác
giảng dạy nên sản phẩm thiết kế của tôi mới chỉ dừng ở một vài ứng dụng nhỏ.
Tuy nhiên với những kết quả đã đạt đ−ợc trong thời gian nghiên cứu vừa qua,
tôi nhận thấy mình hoàn toàn có khả năng làm chủ các hệ vi điều khiển về cả
phần cứng và phần mềm. Hy vọng luận văn này sẽ giúp ích phần nào cho
những ng−ời bắt đầu tìm hiểu về lĩnh vực này.
Tôi xin chân thành cảm ơn:
TS Nguyễn Linh Giang, ng−ời đã trực tiếp h−ớng dẫn và giúp đỡ tôi
trong thời gian làm luận văn. Trung tâm Đào tạo và Bồi d−ỡng Sau Đại học -
Tr−ờng Đại học Bách khoa Hà Nội; các thầy cô giáo trong Khoa Điện tử,
tr−ờng ĐHCN HN, đã giúp đỡ tôi về mặt thời gian, thiết bị cũng nh− sự động
viên rất lớn của bạn bè ng−ời thân về mặt tinh thần trong thời gian thực hiện
đề tài.
-87-
Tài liệu tham khảo
Tiếng Việt
1. Phạm Văn ất, Lập trình C cơ sở và nâng cao, NXB khoa học kỹ thuật, Hà
Nội.
2. Nguyễn Gia Định (2000), Nguyên lý hệ điều hành, NXB khoa học kỹ thuật,
Hà Nội.
3. Trần Hạnh Nhi (1998), Hệ điều hành nâng cao, NXB khoa học kỹ thuật, Hà
Nội.
4. Tống Văn On (1998), Họ vi điều khiển 8051, NXB Minh Khai, TP Hồ Chí
Minh.
Tiếng Anh
5. M.Beach (2000), C51primer, Prentice Hall, London.
6. William Stalling (1995). Operating Systems, Prentice Hall,London.
Websides:
7.
8.
9.
Các file đính kèm theo tài liệu này:
- Luận văn-Nghiên cứu, thiết kế hệ điều hành trên bộ vi điều khiển 8 bít.pdf