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