Sự kiện và chuyển trạng thái giữa các tiến trình

Một phần của 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 pot (Trang 70 - 86)

4.4.1.1. Sự kiện(event).

Khái niệm về sự kiện trong bài tố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

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. }

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; (adsbygoogle = window.adsbygoogle || []).push({});

} ; 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.

} }

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

- 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 ngồ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 (adsbygoogle = window.adsbygoogle || []).push({});

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

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ã hố 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à hồn tồ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

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.

- Con trỏ ngăn xếp.

Hình 4.10. Các tài nguyên cần lu 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

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 (adsbygoogle = window.adsbygoogle || []).push({});

-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

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 tố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 tố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 tố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

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 (ngồ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

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. (adsbygoogle = window.adsbygoogle || []).push({});

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

- 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ý

Một phần của 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 pot (Trang 70 - 86)