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

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

pdf86 trang | Chia sẻ: lylyngoc | Lượt xem: 2609 | Lượt tải: 1download
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:

  • pdfLuậ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