Nhân hỗ trợ đoạt quyền ưu tiên được sử dụng khi đáp ứng hệ thống là quan trọng. Tác vụ có quyền ưu tiên cao nhất ở trạng thái READY luôn luôn được sử dụng CPU. Khi một tác vụ tạo ra một tác vụ khác có quyền ưu tiên cao hơn ở trạng thái READY, thì tác vụ hiện tại bị ngưng và tác vụ có quyền cao hơn được trao quyền điều khiển CPU ngay lập tức. Nếu một ngắt tạo ra một tác vụ có quyền cao hơn ở trạng thái READY, khi ngắt kết thúc, tác vụ bị ngắt bị ngưng và tác vụ có quyền ưu tiên cao hơn sẽ được chạy. Hình vẽ 2-6 miêu tả điều này.
Với nhân có đoạt quyền ưu tiên, việc thực hiện các tác vụ có quyền ưu tiên cao nhất là xác định, có thể xác định khi nào nó đoạt quyền điều khiển CPU. Do đó, đáp ứng thời gian mức tác vụ được tối thiểu hoá do sử dụng nhân có đoạt quyền ưu tiên. Tóm lại, nhân có đoạt quyền ưu tiên luôn thực hiện tác vụ có quyền ưu tiên cao nhất ở trạng thái READY. Ngắt đoạt quyền của tác vụ. Khi hoàn thành ISR, nhân chuyển quyền chiếm CPU cho tác vụ ở trạng thái READY mà có quyền ưu tiên cao hơn để chạy.
Hình 2-7 Hoạt động của nhân có hỗ trợ đoạt quyền ưu tiên 2.8 Quản lý bộ nhớ
Có rất nhiều thiết bị nhớ đang được sử dụng cho các hệ thống máy tính hiện tại. Ta phải hiểu biết về sự khác nhau giữa chúng và hiểu cách sử dụng hiệu quả các loại bộ nhớ đó. Trong phần thảo luận của ta, ta sẽ tiếp cận các loại bộ nhớ này từ quan điểm của phần mềm.
Hầu hết ta đã nghe đến RAM hoặc ROM. Nhưng thực tế, nó chia thành nhiều loại. RAM, dữ liệu được lưu trong các vị trí nhớ có thể đọc, ghi theo ý muốn. ROM, dữ liệu được lưu trong vị trí nhớ chỉ có thể đọc, nhưng không bao giờ được ghi. Trong một vài trường hợp, nó có thể ghi đè dữ liệu trong một bộ nhớ giống như ROM. Những thiết bị như vậy được gọi bộ nhớ lai ghép vì nó tồn tại những đặc tính của RAM và ROM. Hình vẽ 2-7 minh hoạ việc phân chia thiết bị nhớ mà thường thấy trong các hệ thống nhúng.
RAM
Có hai loại thiết bị nhớ quan trọng trong họ RAM là: SRAM và DRAM. Sự khác nhau chủ yếu giữa chúng là thời gian sống của dữ liệu được lưu trữ. SRAM (static RAM) sẽ bị mất dữ liệu nếu nguồn điện cấp cho nó bị mất. DRAM (dynamic RAM), thời gian sống của dữ liệu cực kỳ ngắn, thường ít hơn ¼ giây, cho dù nguồn điện cấp cho nó không bị mất.
ROM
Họ ROM được phân loại bằng phương pháp sử dụng để ghi dữ liệu vào bộ nhớ và số lần có thể ghi lại dữ liệu. Sự phân loại này phản ánh sự phát triển của các thiết bị ROM từ loại có thể lập trình được một lần tới loại có thể lập trình lại nhiều lần. Một đặc điểm chung đối với các thiết bị loại này là khả năng lưu trữ dữ liệu và chương trình mãi mãi của chúng cho dù nguồn điện có thể mất.
Bảng 2-2 Đặc tính của bộ nhớ Loại
bộ nhớ Có thể ghi? thước xóaKích Số lượt xóa tương đốiGiá tương đốiTốc độ
SRAM Có byte Không giới hạn Đắt Nhanh
DRAM Có byte Không giới
hạn Trung bình Trung bình
Masked
ROM Không Không hỗ trợ Không hỗ trợ Rẻ Nhanh
PROM 1 lần, bằng bộlập trình Không hỗ trợ Không hỗ trợ Trung bình Nhanh EPROM có, bằng bộ lập trình Toàn bộ chip Bị giới hạn Trung bình Nhanh
EEPROM Có byte Bị giới hạn Đắt Đọc nhanh, ghi chậm
Flash Có Theo vùng Bị giới hạn Trung bình Đọc nhanh,
ghi chậm
2.9 Keyboard
Hầu hết các sản phẩm của hệ thống nhúng như lò vi sóng, máy fax, máy photo copy, máy in laser, PLC, … đều có giao diện keyboard để nhận những tác động, điều khiển từ người sử dụng. Keyboad có thể được sử dụng để nhập dữ liệu số như lựa chọn chế độ hoạt động của một thiết bị điều khiển. Trong phần này, ta sẽ tìm hiểu bộ xử lý có thể quét bàn phím như thế nào.
2.9.1 Cơ sở về bàn phím
Bàn phím thường sử dụng một công tác tiếp xúc tạm thời, và kết thúc phím được phát hiện bằng một bộ vi xử lý sử dụng một mạch điện đơn giản như trong hình 2-8. Điện trở nhảy bậc có mức logic 1 khi công tắc mở và mức logic 0 khi công tắc đóng. Đáng tiếc là các công tắc không thể tạo ra được các mức cứng 1 và 0 khi chúng được đóng hoặc mở. Mặc dù phần tiếp xúc có thể đóng chuẩn xác và nhanh chóng, bằng với tốc độ của bộ vi xử lý, hành động này vẫn được coi là tương đối chậm. Khi công tắc đóng, phần tiếp xúc bật lên giống như một quả bóng. Hiệu ứng bật rung này tạo ra vô số xung như trên Hình 2-8. Quá trình bật rung kéo dài khoảng từ 5 đến 30 ms. Nếu cần nhiều phím bấm, mỗi công tắc có thể kết nối đến cổng vào của chính nó trên bộ vi xử lý. Tuy nhiên khi số công tắc tăng lên, phương thức này sẽ nhanh chóng dùng hết sạch số cổng vào.
Cách hiệu quả nhất để sắp xếp các công tắc trên một bàn phím (khi cần có hơn năm phím) là theo định dạng ma trận hai chiều như trên Hình 2-9. Cách sắp xếp tối ưu nhất (trong đó các đường I/O được nối với nhau) là khi số hàng và số cột bằng nhau, đó là ma trận vuông. Công tắc tiếp xúc tạm thời (nút bấm) được đặt tại điểm giao nhau của mỗi hàng và mỗi cột. Số các phím cần thiết trong ma trận dĩ nhiên phụ thuộc vào mỗi ứng dụng. Mỗi hàng được thể hiện bằng một bit của một cổng ra, còn mỗi cột tương ứng với một điện trở và một bít cổng vào.
Hình 2-9 Công tắc bàn phím
Hình 2-10 Ma trận bàn phím
Bộ vi xử lý quét bàn phím bằng cách xem xét ma trận bàn phím lặp đi lặp lại theo một chu kỳ nhất định để tìm ra phím được bấm. Sau khi bộ vi xử lý xác định đã có phím được bấm, phần mềm quét bàn phím lọc ra các xung bật và tìm xem đó là các phím nào. Mỗi phím được gán một số nhận dạng duy nhất gọi là mã quét. Mã quét được dùng trong chương trình ứng dụng để xác định hành động tiếp theo. Nói một cách khác, mã quét nói cho chương trình ứng dụng biết phím nào đã được bấm. Hiện tượng bấm hơn một phím trong một lần (chẳng may hay cố ý) được gọi là
quay tròn. Bất cứ thuật toán nào có thể nhận dạng chính xác một phím mới được bấm – thậm chí đã có n-1 phím được bấm trước đó – thì được gọi là có khả năng
quay tròn n-phím. Bộ mã mô tả ở đây chỉ dự định dùng cho các hệ thống nhúng nhỏ, trong đó đầu vào mong đợi các phím được bấm từng phím một. Các hệ thống như vậy thường không yêu cầu một bàn phím đầy đủ chức năng như các bàn phím của các hệ thống máy tính.
2.10 Module LCD ký tự
Phần này cung cấp một module phần mềm cho phép giao tiếp với các module LCD (màn hình tinh thể lỏng) dạng ký tự. Gói phần mềm này cho phép:
• Điều khiển module LCD tới 80 ký tự
• Hiển thị ký tự ASCII
• Hiển thị chuỗi ASCII.
• Định nghĩa tới tám ký hiệu dạng ma trận 5x7 chấm
• Hiển thị biểu độ dạng vạch
2.10.1 Màn hình tinh thể lỏng
Màn hình tinh thể lỏng (LCD) là một công nghệ hiển thị thụ động, không tự phát ra ánh sáng mà điều khiển ánh sáng bao quanh, do đó tiêu thụ rất ít năng lượng. Đặc tính này đã làm cho LCD trở thành một công nghệ được ưa thích hiện nay. LCD thực chất là một phần phản chiếu, nó cần phần sáng bao quanh để phản xạ lại mắt người dùng.
Điều khiển LCD là công việc đòi hỏi sự tinh tế hơn điều khiển đèn LED. Các LCD thường được điều khiển bằng các phần cứng dành riêng. Hình 2-10 mô tả ba loại LCD thông dụng hiện nay.
Hình 2-11 Các kiểu LCD
• Hiển thị tuỳ ý với các điều khiển phân mảnh riêng (tương tự như hiển thị LED). LCD được bố trí như đèn LED (xem trên Hình 2-10). Kiểu hiển thị này tương tự đèn LED do mỗi phân mảnh được điều khiển riêng lẻ.
• Hiển thị kiểu chữ số hoặc ký tự. Kiểu hiển thị này hiện được đóng gói trong các module. Việc hiển thị ký tự được thực hiện bằng cách kết hợp một đến 4 dòng của 16 đến 40 khối ký tự. Mỗi khối ký tự chứa một ma trận 5x8 điểm chấm (dot), được dùng để hiển thị bất kỳ ký tự ASCII nào và một số ký hiệu khác
• Hiển thị đồ hoạ đầy đủ. Như với hiển thị ký tự, hiển thị đồ hoạ đầy đủ cũng được đóng gói trong các module. Các module đồ hoạ cung cấp độ linh hoạt lớn khi định dạng dữ liệu trên màn hình. Chúng cho phép hiển thị đoạn chữ, hình ảnh, tranh, và kết hợp các loại trên. Do kích cỡ ký tự được định nghĩa từ phần mềm nên các module đồ hoạ cho phép hiển thị bất kỳ phông chữ và ngôn ngữ nào. Các giới hạn chị phụ thuộc vào độ phân giải. Các module đồ hoạ được tổ chức theo các hàng và cột điểm ảnh (pixel). Mỗi điểm ảnh được đánh một địa chỉ riêng, cho phép mỗi pixel có một trạng thái riêng ON hoặc OFF. Hiển thị độ hoạ thường có sẵn dưới nhiều cấu hình biến đổi từ 64x32 cho đến 640x480 điểm ảnh (cột x hàng). Nhìn từ quan điểm phần mềm, giao
tiếp với hiển thị đồ hoạ phức tạp hơn với hai loại hiển thị còn lại. Loại hiển thị này sẽ không được bàn luận sâu hơn trong luận văn này.
2.10.2 Module LCD ký tự
Việc hiển thị ký tự được thực hiện bằng cách kết hợp một đến 4 dòng, mỗi dòng có từ 16 đến 40 khối ký tự. Mỗi khối ký tự chứa một ma trận 5x8 điểm chấm (dot), được dùng để hiển thị bất kỳ ký tự ASCII nào và một số ký hiệu khác. Chương này mô tả module giao diện phần mềm cho các module hiển thị ký tự. Các module ký tự có rất nhiều ứng dụng trong các hệ thống nhúng như: Điều hoà nhiệt độ, Tăng âm tiếng, Máy FAX, Máy in laser, Thiết bị y tế, Các hệ thống bảo mật, Máy điện thoại, …
2.11 Quản lý định thời
Các bộ định thời rất hữu ích trong các trường hợp bạn muốn đặt thời gian chạy xác định trước cho một hoạt động. Tiến trình thường như sau:
• Khởi tạo hoạt động (bật hoặc tắt một thiết bị đầu ra)
• Bắt đầu định thời
• Khi bộ định thời hết hạn, dừng hoạt động. (tắt hoặc bật thiết bị đầu ra đó) Cũng có thể dùng bộ định thời để phát hiện các thời điểm hết hạn. Ví dụ, bật một mô tơ và bắt đầu định thời. Giả sử ở đây chúng ta mong đợi tốc độ của mô tơ tăng lên. Nếu như tốc độ của mô tơ không vượt qua một mức ngưỡng xác định trong một khoảng thời gian định trước, chúng ta có thể tắt mô tơ và thông tin cho người điều hành. Trong trường hợp này, chúng ta sẽ khởi tạo hoạt động rồi giám sát tiến trình xem liệu ràng các điều kiện có thoả mãn trước khi định thời hết hạn:
• Khởi tạo hoạt động
• Bắt đầu định thời
• Giám sát các điều kiện mong muốn. Nếu thoả mãn các điều kiện, ngừng định thời
• Nếu định thời hết hạn, dừng hoạt động và thông tin cho nhà điều hành
2.12 Các cổng vào/ra rời rạc
Các cổng vào và cổng ra rời rạc (I/O) có mặt trong hầu hết các hệ thống giám sát và/hoặc điều khiển. Thuật ngữ “rời rạc” phản ánh sự thật thật rằng các đầu vào chỉ chấp nhận một trong hai mức trạng thái. Ví dụ:
- 1 hoặc 0
- TRUE hoặc FALSE - ON hoặc OFF
- ENABLED hoặc DISABLED - PRESENT hoặc ABSENT - …
Hình 2-12 Các đầu vào rời rạc
Như chỉ ra trong Hình 2-11, các đầu vào rời rạc thường được dùng để giám sát trạng thái của các chuyển mạch điều khiển bằng tay, các chuyển mạch áp suất (áp suất có vượt quá hay không), các chuyển mạch nhiệt độ (nhiệt độ có vượt quá hay không), chuyển mạch giới hạn (thiết bị có đạt mức giới hạn của nó hay không), rơ-le tiếp xúc (mở hay đóng), các bộ phát hiện trạng thái ở gần (ở đó hay không ở đó), vv. Các đầu vào rời rạc thường được dùng để xác định trạng thái của một đầu vào. Tuy nhiên, trong một số ứng dụng, bạn cần phải biết liệu rằng đầu vào rời rạc có phải vừa thay đổi trạng thái hay không, và có thể là nó đã thay đổi bao nhiêu lần.
Các đầu ra rời rạc thường dùng để điều khiển đèn, rơ-le, quạt, còi báo động, bếp sưởi, van,.. (Xem Hình 2-12). Một đầu ra rời rạc thường ở trạng thái này hoặc trạng thái kia. Một ánh đèn nhấp nháy khác với một đèn luôn ở trạng thái BẬT, nó hiệu quả hơn trong việc lưu ý người dùng về một trạng thái lỗi.
Chương này mô tả một module giám sát các đầu vào rời rạc và điều kiển các đầu ra rời rạc. Module cho phép tới 250 đầu vào và 250 đầu ra. Với mỗi đầu vào rời rạc module cung cấp các khả năng:
- Xác định đầu vào là 1 hay 0
- Xác định sự chuyển đổi từ 1 sang 0 hay từ 0 sang 1 ở đầu vào
- Xác định đã có bao nhiêu chuyển đổi từ 1 sang 0 hay từ 0 sang 1 ở đầu vào - Mô phỏng một công tắc đóng mở với một công tắc tiếp xúc tạm thời
- Bỏ qua phần cứng phục vụ cho các mục đích gỡ lỗi Với mỗi đầu ra rời rạc, module cung cấp các khả năng: - Bật tắt đầu ra
- Nhấp nháy đầu ra theo tốc độ người dùng định trước (mỗi tốc độ cho mỗi đầu ra)
- Bỏ qua mã ứng dụng để điều khiển đầu ra trong quá trình gỡ lỗi
2.12.1 Các đầu vào rời rạc
Đọc các đầu vào rời rạc là một công việc khá đơn giản. Chỉ cần cung cấp các đầu vào rời rạc cần đọc tại các đường vào song song của bộ vi xử lý. Bộ vi xử lý chỉ cần đọc các cổng vào, đặt mặt nạ giấu đi các cổng không cần thiết, và đưa ra kết quả dựa và trạng thái của đầu vào.
Mặt nạ là một giá trị 8-bit nhằm lựa chọn các bít cần đọc. Ví dụ, để đọc trạng thái của bít 4 (các bít được đánh số từ 0 đến 7 theo thứ tự từ phải sang trái), mặt nạ sẽ là 0x10. Với một hàm như trên, mã chương trình sẽ chỉ hơi chậm và kích thước mã sẽ tăng lên một chút nhưng lợi ích thu được lại rất lớn. Nó cho phép thay đổi phần cứng bao nhiêu lần cũng được mà mã chương trình giữ nguyên không đổi. Bằng cách đóng gói phần truy nhập phần cứng, chúng ta cũng có thể xử lý các trường hợp trong đó một số đầu vào bị đảo trạng thái bởi phần cứng và vẫn trả đúng trạng thái đến cho mã ứng dụng. Nói cách khác, nếu một đầu vào được coi là có mức logic 0 khi nó ở trạng thái cao (HIGH) thì hàm DIGet() sẽ đảo giá trị của đầu vào đọc được và trả về 0 tới mã ứng dụng.
Sử dụng bộ ghép chọn dữ liệu vào 74251 (xem Hình 2-13) trong phần cứng cho phép tăng số lượng đầu vào rời rạc dễ dàng chỉ bằng cách thêm vào các con 74251 khác.
Hình 2-15 Kênh đầu vào rời rạc
Module I/O rời rạc trong chương này cho phép người dùng cấu hình bất kỳ đầu vào rời rạc nào. Mỗi đầu vào rời rạc được coi là một kênh logic. Module cho phép đến 250 kênh. Hình 2-14 mô tả biểu đồ luồng của một kênh đầu vào rời rạc. Trong hình vẽ các ký hiệu điện được dùng để mô tả các chức năng, nhưng tất nhiên trên thực tế mọi chức năng này đều được thực hiện trong phần mềm.
2.12.2 Các đầu ra rời rạc
Cập nhật các đầu ra rời rạc cũng tương đối dễ dàng, tuy nhiên đòi hỏi một chút khéo