Để 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 hố 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
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 đĩ. Q 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 đĩ.
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 ();
} } Ví dụ 3: #include <rtx51tny.h> 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
đĩ 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)