Tải bản đầy đủ (.docx) (16 trang)

Hệ điều hành thời gian thực

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (251.81 KB, 16 trang )

Chương 2 : Hệ điều hành thời gian thực (Realtime Operating
System- RTOS)
I.
1.

Đại cương về hệ điều hành tời gian thực
Hệ điều hành

Hệ thống điều hành bản chất cũng là một loại phần mềm nhưng nó khác với
các loại phần mềm thông thường. Sự khác biệt điển hình là hệ thống điều hành
được nạp và thực thi đầu tiên khi hệ thống bắt đầu khởi động và được thực hiện
trực tiếp bởi bộ xử lý của hệ thống. Hệ thống điều hành được viết để phục vụ điều
khiển bộ xử lý cũng như các tài nguyên khác trong hệ thống bởi vì nó sẽ đảm
nhiệm chức năng quản lý và lập lịch các quá trình sử dụng CPU và cùng chia sẻ tài
nguyên .

Hình 2.1: Kiến trúc hệ điều hành
a.

Hệ điều hành thời gian thực so với hệ điều hành trên PC


Hệ điều hành thời gian thực (RTOS) cho các hệ thống nhúng rất khác so với
hệ điều hành trên máy tính desktop như Windows hay UNIX :
Thứ nhất, trên máy tính desktop hệ điều hành sẽ chiếm quyền điều khiển
ngay sau khi máy được bât và sau đó mới cho chúng ta bắt đầu ứng dụng của
mình. Chúng ta biên dịch và liên kết các ứng dụng của mình tách biệt với hệ điều
hành. Ngược lại, trong một hệ thống nhúng, ứng dụng thường xuyên liên kết với
RTOS. Tại lúc khởi động, ứng dụng nhân lấy quyền điều khiển đầu tiên và sau đó
nó mới bắt đầu RTOS. Bởi vây ứng dụng và RTOS phải có mối quan hệ chặt chẽ
hơn.


Thứ hai, rất nhiều RTOS không bảo vệ chính bản thân chúng một cách cẩn
thân như hệ điều hành trên desktop.
Thứ ba, để tiết kiệm bộ nhớ các RTOS mặc định chỉ bao gồm các dịch vụ
cần thiết cho ứng dụng nhúng của chúng ta. Hầu hết các RTOS cho phép chúng ta
cấu hình bao quát trước khi chúng ta liên kết chúng với ứng dụng.
Thứ tư, hầu hết các điều hành trên máy desktop quan tâm đến hiệu năng
trung
bình trong khi các hệ điều hành thời gian thực lại quan tâm đến các giới
hạn,
thời gian đáp ứng.
Ở trong phần này, chúng ta tìm hiểu khái niệm tác vụ - Task
trong
môi trường RTOS và vấn đề chia sẻ dữ liệu, semaphores, mailbox,
queue... Ngoài ra, chúng ta còn xem xét vấn đề truyền thông liên quá
trình,
dịch vụ bộ định thời, quản lý bộ nhớ và tương tác giữa các thủ tục ngắt.
Các hệ điều hành thời gian thực nhấn mạnh đến khả năng dự
và các ràng buộc về thời gian đáp ứng.
b.

Các đặc điểm hệ điều hành thời gian thực :

đoán


Do các yêu cầu khắt khe về thời gian, về việc sử dụng tài nguyên, và sự quan
trọng của việc lâp lịch, các RTOS đóng vai trò rất quan trọng trong phát triển hệ
nhúng thời gian thực. Chúng giống như những thư viện, chúng ta có thể dùng,
thêm bớt các dịch vụ cho phù hợp với ứng dụng nhúng thời gian thực để có thể
phát triển ứng dụng nhúng thời gian thực một cách nhanh hơn, tin tưởng hơn. Vì

vây sự tồn tại của các RTOS là rất cần thiết và quan trọng.
Trước khi xem xét các dịch vụ của hệ điều hành thời gian thực xác định, ta
cần biết như thế nào để có thể đánh giá đây là hệ điều hành thời gian thực tốt, phù
hợp với các ứng dụng nhúng thời gian thực của ta. Theo FQA cho comp.realtime:
Một RTOS tốt chỉ khi có một nhân tốt. Một RTOS tốt sẽ có một tài liệu tốt và được
phân phát cùng các công cụ tốt để phát triển và vân hành ứng dụng của chúng ta.
Vì vây, các tính toán về khoảng thời gian ngắt và thời gian chuyển mạch ngữ cảnh
là rất quan trọng, cùng với các thông số khác làm nên một RTOS tốt. Cho ví dụ,
một RTOS hỗ trợ nhiều dịch vụ có nhiều thuận lợi hơn một RTOS đơn giản.
Thêm vào đó, có những đặc tả chính xác là rất quan trọng để nhân ra RTOS
tốt.Theo comp.realtime thì các nhà sản xuất RTOS nên chỉ rõ các yếu tố:


Khoảng thời gian trễ ngắt - Interrupt Latency: là khoảng thời gian từ lúc ngắt
tới lúc chạy tác vụ. Khoảng thời gian này phải tương thích với các đòi hỏi
của ứng dụng và phải dự đoán được. Các giá trị này phụ thuộc trên số lượng
của các ngắt đồng thời chờ đợi.



Cho mỗi lời gọi hệ thống, thời gian tối đa được biết trước. Nó sẽ có thể đoán
và không phụ thuộc vào số lượng các đối tượng trong hệ thống.



Thời gian cực đại của RTOS và điều khiển các mặt nạ ngắt.



Các mức ngắt hệ thống.




Trình thiết bị điều khiển các ngắt (IRQ: Interrupt ReQuest), thời gian cực đại
của hệ thống mà trình thiết bị điều khiển ngắt thực hiện.

Hệ điều hành thời gian thực tương tự như một hệ điều hành đa mục đích và cung
cấp các chức năng như:
+ Giao tiếp với phần cứng ở lớp dưới
+ Lâp lịch và xử lý ưu tiên
+ Quản lý bộ nhớ
+ Các dịch vụ vào ra
+ Hỗ trợ sự lựa chọn bộ vi xử lý
+ Tính khả chuyển tới các bộ vi xử lý khác
+ Tính mềm dẻo để phù hợp với các yêu cầu ứng dụng khác nhau
+ Hỗ trợ bộ đa vi xử lý
+ Mở rộng các dịch vụ như hỗ trợ mạng


Một RTOS thường có tính mềm dẻo và có tính cấu trúc. Nó cho phép tích
hợp thêm các dịch vụ gia tăng theo vòng tròn đồng tâm. Vòng trong cùng hay nhân
cung cấp những đặc tính quan trọng nhất của hệ điều hành thời gian thực. Các đặc
điểm khác có thể được thêm vào như một vòng ngoài khi cần thiết. Nhân nhỏ của
một RTOS thích hợp cho một ứng dụng bộ xử lý nhỏ, trong khi những vòng ngoài
có thể giúp đỡ xây dựng hệ thống thời gian thực lớn. Các RTOS thường cung cấp
các mức xử lý ưu tiên. Các công việc ưu tiên cao hơn sẽ được thực hiện trước.
2. Phân loại hệ điều hành thời gian thực
a.

Hệ điều hành thời gian thực nhỏ với mục đích thương mại


Các hệ điều hành này thường nhỏ và nhanh. Như: QNX, PDOS, pSOS,
VxWorks, Nulceus, ERCOS, EMERALDS, Windows CE, chúng có các đặc điểm
sau:
 Có thời gian chuyển ngữ cảnh và thời gian đáp ứng nhanh.
 Kích thước rất nhỏ.
 Không có bộ nhớ ảo và có thể cố định mã, dữ liệu trong bộ nhớ.
 Hệ thống đa tác vụ và chuẩn giao tiếp liên quá trình.Các mailbox, các sự
kiện,
 các
tín hiệu và các đèn báo được định nghĩa tốt.
Những hệ điều hành này thường có các đặc tả tốt và có các công cụ tốt để
phát triển các ứng dụng nhúng thời gian thực. Nó hỗ trợ các ràng buộc thời gian
thực với các dịch vụ như:
 Các giới hạn thời gian thực hiện.
 Đồng hồ thời gian thực.
 Lập lịch thứ tự ưu tiên.
 Cảnh báo đặc biệt và thời gian quá hạn (timeout).
 Hỗ trợ các hàng đơi thời gian thực.
 Cung cấp việc xử lý độ trễ, treo hay kích hoạt việc thực hiện.
b.

Hệ điều hành thời gian thực mở rộng tới Unix và các hệ điều hành
khác:

Các hệ điều hành này như: RT-UNIX, RT-LINUX, RT-MACH, RT-POSIX.
Chúng châm hơn và có khả năng dự đoán ít hơn so với các hệ điều hành thời gian
thực thương mại ở trên nhưng chúng lại có nhiều chức năng và môitrường phát
triển tốt hơn dựa trên tâp các giao tiếp chuẩn và thân thiện.






c. Các nhân cho mục đích nghiên cứu
Các hệ điều hành này có các đặc điểm sau:
Hỗ trợ các thuât toán lâp lịch thời gian thực và việc phân tích thời gian.
Hỗ trợ các dịch vụ cơ bản để đồng bộ thời gian thực.
Nhấn mạnh khả năng dự đoán hơn là hiệu năng trung bình.


Hỗ trợ cho khả năng chịu lỗi.
Ví dụ như: Spring, MARS, HARTOS, MARUTI, ARTS, CHAOS, DARK.


II.

Tổ chức và kiến trúc hệ điều hành thời gian thực.

Hệ thống điều hành đảm nhiệm việc điều khiển các chức năng cơ bản của hệ
thống bao gồm chủ yếu là quản lý bộ nhớ, ngoại vi và vào ra giao tiếp với hệ thống
phần cứng. Một điểm khác biệt cơ bản như chúng ta đã biết về hệ điều hành với
các phần mềm khác là nó thực hiện chức năng điều khiển sự kiện thực thi trong hệ
thống. Có nghĩa là nó thực hiện các tác vụ theo mệnh lệnh yêu cầu từ các chương
trình ứng dụng, thiết bị vào ra và các sự kiện ngắt.

Hình 2.2: Mô hình hệ thống điều hành






Bốn nhân tố chính tác động trực tiếp tới quá trình thiết kế hệ điều hành là :
khả năng thực hiện,
năng lượng tiêu thụ
giá thành
khả năng tương thích.

Hiện nay chúng ta cũng có thể bắt gặp rất nhiều hệ điều hành khác nhau
đặc biệt cho các hệ nhúng cũng vì sự tác động của 4 nhân tố nêu trên. Hầu hết
chúng đều có kiểu dạng và giao diện khá giống nhau nhưng cơ chế quản lý và thực
thi các tác vụ bên trong rất khác nhau. Mỗi hệ điều hành được thiết kế phục vụ trực
tiếp các chức năng đặc thù phần cứng của hệ nhúng và không dễ dàng so sánh
được giữa chúng với nhau.
1. Kiến trúc hệ điều hành
Hai thành phần chính trong thiết kế hệ điều hành là: phần hạt nhân (kernel)
và các chương trình hệ thống.
Hạt nhân chính là phần lõi của hệ điều hành. Nó được sử dụng để phục vụ


cho các bộ quản lý quá trình, bộ lập lịch bộ quản lý tài nguyên và bộ quản lý vào
ra. Phần hạt nhân đảm nhiệm chức năng lập lịch, đồng bộ và bảo vệ hệ thống bởi
việc sử dụng sai, xử lý ngắt.. .Chức năng điều khiển chính của nó là phục vụ điều
khiển phần cứng bao gồm ngắt, các thanh ghi điều khiển, các từ trạng thái và các
bộ định thời gian. Nó nạp các phần mềm điều khiển thiết bị để cung cấp các tiện
ích chung và phối hợp với các hoạt động vào ra với hệ thống. Phần hạt nhân có vai
trò điều khiển rất quan trọng để đảm bảo tất cả các phần của hệ thống có thể làm
việc ổn định và thống nhất.
Hai kiến trúc thiết kế phần hạt nhân kinh điển nhất là kiến trúc vi hạt nhân
và đơn hạt nhân (monolithic).

Vi hạt nhân :
Các vi hạt nhân cung cấp các chức năng điều hành cơ bản cốt lõi (thô) theo
cơ chế các module tương đối độc lập đảm nhiệm các tác vụ cụ thể và chuyển rời rất
nhiều các dịch vụ điển hình điều hành hệ thống thực thi trong không gian người sử
dụng. Nhờ cơ chế này mà các dịch vụ có thể được khởi tạo hoặc cấu hình lại mà
không nhất thiết phải khởi tạo lại toàn bộ hệ thống. Kiến trúc vi hạt nhân cung cấp
độ an toàn cao bởi vì dịch vụ hệ thống chạy ở tầng người sử dụng với hạn chế về
truy nhập vào tài nguyên của hệ thống và có thể được giám sát. Kiến trúc vi hạt
nhân có thể được xây dựng một cách mềm dẻo để phù hợp với cấu hình phần cứng
khác nhau một cách linh hoạt hơn so với kiểu kiến trúc hạt nhân monilithic. Tuy
nhiên do tính độc lập tương đối giữa các modul trong vi hạt nhân nên cần thiết phải
có một cơ chế trao đổi thông tin hay truyền thông giữa các modul đó vì vậy có thể
là lý do làm chậm tốc độ và giảm tính hiệu quả hoạt động của hệ thống. Đặc điểm
nổi bật và cốt lõi của kiến trúc vi hạt nhân là kích thước nhỏ và dễ dàng sửa đổi
cũng như xây dựng linh hoạt hơn. Các dịch vụ thực thi ở tầng trên của hạt nhân vì
vậy đạt được độ an toàn cao. Kiến trúc vi hạt nhân được phát triển mạnh mẽ trong
các hệ thống đa xử lý.
 Đơn hạt nhân:
Kiểu kiến trúc monolithic cung cấp tất cả chức năng/dịch vụ chính yếu
thông qua một qua trình xử lý đơn lẻ. Chính vì vây kích thước của chúng thường
lớn hơn kiểu kiến trúc vi hạt nhân. Loại hình kiến trúc này thường được áp dụng
chủ yếu cho các phần cứng cụ thể mà hạt nhân monolithic có sự tương tác trực tiếp
với phần cứng nhờ vây mà khả năng tối ưu cũng dễ dàng hơn so với áp dụng kiểu
kiến trúc vi hạt nhân. Chính vì vây cũng là lý do tại sao kiến trúc monolithic không
thể thay đổi mềm dẻo linh hoạt như kiểu vi hạt nhân. Ví dụ điển hình về loại hình
kiến trúc hạt nhân monolithic bao gồm Linux, MacOS, và DOS.


Vì hệ điều hành cũng đòi hỏi về tài nguyên và kiêm cả chức năng quản lý
chúng vì vây người thiết kế cần phải nắm được thông tin về chúng một cách đầy

đủ.
2.

Hạt nhân hệ điều hành thời gian thực


Hệ thống điều hành với phần lõi là hạt nhân phải đảm nhiệm các tác vụ
chính như sau:
 Xử lý ngắt
 Lưu trữ ngữ cảnh chương trình tại thời điểm xuất hiện ngắt
 Nhân dạng và lựa chọn đúng bộ xử lý và phục vụ dịch vụ ngắt
 Điều khiển quá trình
 Tạo và kết thúc quá trình/tác vụ
 Lâp lịch và điều phối hoạt động hệ thống
 Định thời
 Điều khiển ngoại vi
 Xử lý ngắt
 Khởi tạo giao tiếp vào ra

Hình 2.3: hệ thống điều hàn với lõi là hạt nhân
Tùy theo cơ chế thực hiện và xây dựng hoạt động của hạt nhân người ta
phân loại một số loại hình
Hệ thống thời gian thực nhỏ:
Với loại này các phần mềm được phát triển mà không cần có hệ điều hành, người
lập trình phải tự quản lý và xử lý các vấn đề về điều khiển hệ thống bao gồm:
 Xử lý ngắt
 Điều khiển quá trình/ tác vụ
 Quản lý bộ nhớ



Công nghệ đa nhiệm
 Mỗi quá trình có một không gian bộ nhớ riêng
 Các quá trình phải được chia nhỏ thành các Thread cùng chia sẻ không
gian bộ nhớ.




Các dịch vụ cung cấp bởi hạt nhân
 Tạo và kết thúc quá trình/ tác vụ


 Truyền thống giữa các quá trình
 Các dịch vụ về định thời gian

 Một số các dịch vụ cung cấp hỗ trợ việc thực thi liên quan đến điều

khiển hệ hống

Hạt nhân điển hình cơ bản
 Loại hạt nhân đơn giản nhất là một vòng lặp vô hạn thăm dò các sự kiện
xuất hiện trong hệ thống và phản ứng lại theo sự thay đổi nếu có.
 Với một bộ xử lý cấu hình nhỏ nhất, không phải lúc nào nó cũng có thể
lưu cất ngữ cảnh vì không thể thay đổi con trỏ ngăn xếp hoặc vùng ngăn
xếp rất hạn chế.
 Thay vì sử dụng các thanh ghi thiết bị, vòng lặp thăm dò có thể giám sát
các biến mà chịu sự thay đổi cập nhật bởi các bộ xử lý ngắt.
 Hạt nhân có thể được xây dựng sao cho tất cả các tín hiệu logic được
điều khiển bởi vòng lặp và nhịp được điều khiển bởi các ngắt.
 Các tác vụ lớn cần nhiều thời gian thực hiện có thể được chia nhỏ thành

các tác vụ nhỏ và được thực hiện tại các thời điểm khác nhau nhờ vào cơ
chế chuyển và sử dụng bộ đếm.
 Các hạt nhân thực thi theo cơ chế ngắt rất giống với loại hạt nhân thực

hiện theo cơ chế vòng lặp thăm dò. Nó xử lý tất cả các tác vụ thông qua
các dịch vụ ngắt.
 Các hạt nhân lớn và phức tạp hơn sẽ bao gồm một số các dịch vụ phụ
phục vụ cho việc truyền thông giữa các quá trình. Và nếu được bổ sung
đầy đủ nó sẽ trở thành một hệ điều hành đầy đủ.
Các kiểu loại hạt nhân cơ bản
 Hạt nhân thực hiện vòng lặp thăm dò
 Hạt nhân thực hiện theo cơ chế ngắt
 Hạt nhân quá trình vận hành quá trình
Việc lựa chọn loại hạt nhân nào hoàn toàn tùy thuộc vào các bộ xử lý và
kích thước phần mềm, tuy nhiên riêng loại hạt nhân vận hành theo quá trình
không phù hợp với các bộ xử lý nhỏ.
Hạt nhân quá trình
Các hạt nhân quá trình rõ ràng là phức tạp hơn các hạt nhân thực hiện theo
cơ chế thăm dò và điều khiển ngắt. Các đường truyền tín hiệu logic bên trong các
quá trình và các dịch vụ ngắt được tích hợp và thực hiện thông qua việc truyền dữ
liệu.


Hạt nhân sẽ phải đảm nhiệm chức năng lập lịch cho các quá trình theo đúng
mô hình trạng thái.
 RUN: quá trình được thực hiện
 WAIT: các quá trình chờ một sự kiện hoặc tín hiệu vào ra kích hoạt quá trình
 READY: các quá trình sẵn sàng được thực hiện
Các phần tử thuộc tính của một quá trình: Các phần tử này cần thiết để phục vụ
cho việc lập lịch. Ví dụ đối với cơ chế lập lịch theo mức độ ưu tiên sẽ yêu cầu

thông tin sau với mỗi quá trình:
 Tên (địa chỉ bộ nhớ của phần tử quá trình)
 Trạng thái: RUN, WAIT, READY
 Mức độ ưu tiên
 Ngữ cảnh (dùng con trỏ để quản lý lưu cất thông tin trong ngăn xếp).
3.

Các dịch vụ mở rộng của RTOS thương mại
a.

Message Queues, Mailboxes và Piles

Hàng đợi - Queue
Các tác vụ phải có khả năng giao tiếp với nhau để kết hợp các hoạt động và
để chia sẻ dữ liệu. Hầu hết RTOS kết hợp của một số dịch vụ như: hàng các đợi
thông điệp, các mailboxe, các pipe cho mục đích này. Tính năng xác định của các
dịch vụ này phụ thuộc vào RTOS, chúng ta phải đọc hướng dẫn mà RTOS đó đưa
ra.
Hầu hết RTOS yêu cầu chúng ta phải khởi tạo hàng đợi trước khi chúng ta
sử dụng chúng bằng việc gọi hàm cung cấp cho mục đích này. Một số hệ thống cho
phép chúng ta cấp phát bộ nhớ mà RTOS sẽ quản lý như một hàng đợi.
Hầu hết các RTOS cho phép ta sử dụng nhiều hàng đợi nếu chúng ta muốn.
Chúng ta thêm một số thông số để định danh hàng đợi và từ đó chúng ta có thể
đọc, ghi vào hàng đợi đó.
Nếu chúng ta cố ghi vào hàng đợi khi nó đã đầy, RTOS sẽ trả lại một thông
báo lỗi để chúng ta biết hoạt động đó bị hỏng hoặc là hoạt động đó phải bị khoá
cho đến khi có một tác vụ đọc dữ liệu khỏi hàng đợi.
Rất nhiều RTOS sử dụng một hàm để đọc từ một hàng đợi nếu có dữ liệu




trong hàng đợi và sẽ trả ra một lỗi nếu hàng đợi rỗng. Và hàm này sẽ ở trạng thái
khoá (block) nếu hàng đợi rỗng.
Số byte dữ liệu mà RTOS ghi vào hàng đợi trong một lời gọi có thể không
chính xác với số byte dữ liệu chúng ta muốn ghi. Rất nhiều RTOS không mềm dẻo
về vấn đề này nhưng có một số RTOS cho phép chúng ta ghi lên một hàng đợi
trong một lần gọi số lượng byte mang đến bằng một con trỏ hàm.
 Mailbox
Nói chung, mailbox là giống hàng đợi. Mặc định RTOS có các hàm để tạo,
đọc và ghi vào mailbox và có lẽ các hàm này sẽ kiểm tra xem mailbox có chứa
được hay không bất kỳ một thông điệp nào. Khi mailbox không cần thiết nữa thì
nó sẽ được huỷ để giải phóng bộ nhớ. Trong các RTOS thì mailbox có những đặc
điểm riêng:
 Một số RTOS cho phép chính xác số lượng thông điệp trong mỗi mailbox,
con số này chúng ta có thể chọn khi tạo mailbox, một số khác thì chỉ cho
phép một thông điệp trong một mailbox tại một thời điểm. Một thông điệp
được ghi tới mailbox, mailbox sẽ đầy khi đó các thông điệp khác chỉ có thể
ghi tới mailbox khi thông điệp đầu được đọc.
 Trong một số RTOS, số lượng của thông điệp trong mỗi mailbox là không bị
giới hạn. Chỉ có một giới hạn là tổng số thông điệp trong tất cả các mailbox
trong hệ thống.


Trong một số RTOS, chúng ta có thể ưu tiên các thông điệp trong mailbox.
Các thông điệp ưu tiên cao hơn sẽ được đọc trước các thông điệp có ưu tiên
thấp hơn, không phụ thuộc vào thứ tự chúng được ghi vào mailbox.

Pipe
Các pipe cũngrấtgiống hàngđợi. RTOS có thể tạochúng, ghi lên chúng,
đọc từ chúng. Nhưng trong mỗi RTOS chúng cũng có những đặc điểm riêng:

 Một số RTOS cho phép chúng ta ghi thông điệp với độ dài tuỳ ý lên trên
pipe (không giống như mailbox và queue độ dài thông điệp là cố định).
 Pipe trong một số RTOS là toàn bộ hướng byte: Nếu task A ghi 11 byte tới
pipe và sau đó task B ghi 19 byte tới pipe, sau đó nếu task C đọc 14 byte từ
pipe, nó sẽ nhận được 11 byte của task A đã ghi cộng với 3 byte đầu tiên mà
task B đã ghi.
 Một số RTOS sử dụng hàm thư viện chuẩn C là fread và fwrite để đọc và
ghi tới pipe.


Sử dụng queue, mailbox, pipe
Mặc dù queue, mailbox, pipe có thể làm vấn đề chia sẻ dữ liệu giữa các tác
vụ trở lên dễ dàng hơn nhưng nó cũng rất dễ gây ra lỗi trong hệ thống của chúng
ta. Đây là một số kinh nghiệm khi sử dụng chúng:
 Hầu hết RTOS không giới hạn tác vụ nào có thể đọc, ghi vào queue,
mailbox, pipe vì vậy chúng ta phải đảm bảo rằng các tác vụ được sử dụng là







chính xác tại mỗi thời điểm.
RTOS không đảm bảo rằng dữ liệu được ghi vào trong queue, mailbox, pipe
sẽ đúng với tác vụ đọc nó. Ví dụ một tác vụ ghi vào một số nguyên và tác vụ
khác đọc và coi nó một con trỏ.
Chạy ra ngoài không gian queue, mailbox hoặc pipe sẽ gây ra một sự phá
huỷ trong phần mềm nhúng.
Chuyển con trỏ từ một tác vụ này tới tác vụ khác thông qua một queue,

mailbox hoặc pipe là cách để tạo ra chia sẻ dữ liệu. Chúng ta tránh dùng
hàm malloc và free.
b.

Chức năng bộ định thời (Timer Functions)

Hầu hết các RTOS đều duy trì nhịp đâp của bộ định thời. Bộ định thời này
ngắt một cách định kỳ và được sử dụng cho các dịch vụ thời gian của RTOS.
Khoảng thời gian giữa các ngắt được gọi là một đơn vị thời gian của hệ thống
(System Tick). Hầu hết các RTOS thường sử dụng dịch vụ thời gian để:
Một tác vụ có thể khoá chính bản thân nó sau một số đơn vị thời gian xác định.
 Một tác vụ sẽ bị giới hạn bao nhiêu đơn vị thời gian của hệ thống khi nó đợi
một đèn báo, hàng đợi...
 Chương trình của chúng ta có thể điều khiển RTOS gọi một hàm xác định
sau một số đơn vị thời gian của hệ thống.
Các sự kiện - Event
Một dịch vụ khác của RTOS đưa ra là quản lý các sự kiện bên trong hệ
thống. Mỗi sự kiện cơ bản là một cờ boolean mà các tác vụ có thể thiết lâp, thiết
lâp lại và có thể có các tác vụ khác nhau cùng đợi nó. Một số đặc điểm của sự kiện
trong các RTOS là:
 Nhiều hơn một tác vụ có thể cùng bị khoá đợi cho một sự kiện, RTOS sẽ
giải phóng tất cả chúng và thực hiện chúng theo thứ tự ưu tiên khi sự kiện
xảy ra.
 RTOS mặc định hình thành một nhóm các sự kiện và các tác vụ đợi cho bất
kỳ tâp con nào của nhóm sự kiện xảy ra.
 Các hệ điều hành thời gian thực khác nhau đưa ra các cách khác nhau để
thiết lâp lại một sự kiện sau khi nó đã xảy ra và các tác vụ đợi sự kiện đó sẽ
được giải phóng. Một số RTOS thiết lâp lại các sự kiện một cách tự động,
một số khác đòi hỏi các tác vụ phần mềm của chúng ta phải tự làm.
Chúng ta sử dụng các queue, mailbox, pipe, semaphore, và các sự kiện cho việc

giao tiếp giữa 2 tác vụ hoặc giữa một ngắt và một tác vụ. Nhưng chúng có một số
đặc điểm riêng:
 Semaphore là phương thức nhanh nhất và đơn giản nhất. Tuy nhiên, không
nhiều thông tin có thể thông qua một semaphore. Chỉ một bit thông điệp
được chuyển để thông báo semaphore được giải phóng.
 Sự kiện là ít phức tạp hơn semaphore nhưng lại tiêu tốn nhiều thời gian bộ
c.




xử lý hơn semaphore. Sự dụng các sự kiện thuân lợi hơn semaphore ở chỗ:
một tác vụ đợi một hay nhiều sự kiện trong cùng thời gian trong khi nó chỉ
đợi một semaphore.
Hàng đợi cho phép chúng ta gửi một số lượng lớn thông tin từ tác vụ này
tới tác vụ khác. Cho dù tác vụ chỉ đợi trên một hàng đợi tại một thời điểm
nhưng sự thât là chúng cho phép chúng ta có thể gửi dữ liệu thông qua một
hàng đợi làm nó linh hoạt hơn một sự kiện. Sự bất lợi là khi đọc và ghi
thông điệp sẽ chiếm nhiều thời gian bộ xử lý và rất dễ mắc phải lỗi trong
chương trình của chúng ta. Mailboxe và pipe có cùng đặc điểm với queue.

Các hàm ngắt trong môi trường RTOS
Các hàm ngắt trong hầu hết các môi trường RTOS phải tuân theo hai quy
tắc, điều này không áp dụng cho mã của tác vụ:
d.

Quy tắc 1: Một hàm ngắt không được gọi bất kỳ hàm RTOS nào mà những
hàm đó có thể khoá lời gọi. Bởi vây thủ tục ngắt không sử dụng đèn báo, không
đọc từ các hàng đợi hoặc mailbox khi các hàng đợi và mailbox rỗng, không đợi
các sự kiện... Nếu hàm ngắt gọi một hàm RTOS và bị khoá, thì tác vụ đang chạy

khi ngắt xảy ra sẽ mãi bị khoá, thâm chí tác vụ này có quyền ưu tiên cao nhất.
Ngoài ra, hầu hết các hàm ngắt phải chạy để hoàn thành việc thiết lâp lại phần
cứng để sẵn sàng cho ngắt tiếp theo.
Quy tắc 2: Một hàm ngắt có thể không gọi bất kỳ hàm RTOS nào những
hàm có thể gây ra cho RTOS chuyển tới chạy các tác vụ trừ khi RTOS biết ,Ó là
một hàm ngắt và không là một tác vụ trong lúc đang thực hiện hàm ngắt. Nếu thủ
tục ngắt phá vỡ quy tắc này thì RTOS có thể chuyển việc điều khiển từ hàm ngắt
tới chạy một tác vụ khác, và hàm ngắt có thể không hoàn thành sau một thời gian
dài, vì vây khoá tất cả các ngắt có mức ưu tiên thấp hơn và có thể là tất cả các ngắt
khác.
4.

Giới thiệu một số hệ điều hành thời gian thực

RTX51-Real Time Operating System
RTX51 là một hệ điều hành thời gian thực đa tác vụ cho họ vi điều khiển
8051. RTX51 là một hệ thống đơn giản được thiết kế cho các phần mềm có ,Ộ
phức tạp và có giới hạn chính xác về thời gian đáp ứng. RTX51 có các công cụ rất
mạnh để quản lý các tác vụ. Có hai phiên bản của RTX51:
a.

RTX51 Full cho phép thực hiện cả chuyển mạch xoay vòng và chuyển tác
vụ với 4 mức ưu tiên, có thể hoạt động cùng với các hàm ngắt một cách song song.
RTX51 chuyển các tín hiệu, chuyển các thông điệp sử dụng một hệ thống mailbox
và các semaphore. Hàm os_wait của RTX51 có thể đợi cho các sự kiện: ngắt,
timeout, thông điệp từ tác vụ hoặc ngắt, semaphore.


RTX51 Tiny là một tâp con của RTX51 Full. RTX51 Tiny dễ dàng chạy trên
một chip không có bộ nhớ dữ liệu ngoài. Tuy nhiên chương trình sử dụng RTX51

Tiny có thể truy nhâp sử dụng bộ nhớ ngoài. RTX51 Tiny cho phép chuyển mạch
xoay vòng giữa các tác vụ, hỗ trợ chuyển các thông điệp và có thể hoạt động cùng
với các hàm ngắt một cách song song. Hàm os_wait của RTX51 có thể đợi cho các
sự kiện: timeout, tín hiệu từ tác vụ hoặc ngắt.
So sánh RTX Full và RTX Tiny
Mô tả
RTX51 Full

RTX51 Tiny

Số tác vụ

256, cực đại 19 tác vụ hoạt 16
động
RAM yêu cầu 40..60 byte DATA 20. 200 7 byte DATA 3*(Số tác
byte IDATA cực tiểu 650 vụ) IDATA
byte XDATA
Mã yêu cầu
6KB...8KB
900 byte
Timer 0
Phần cứng đòi Timer 0 hoặc Timer 1
hỏi
Đồng hồ hệ
1000.40000 chu kỳ
1000.65535 chu kỳ
thống
<20 chu kỳ
Thời gian trễ <50 chu kỳ
ngắt

Thời chuyển tác 70... 100 chu kỳ (tác vụ
100.700 chu kỳ phụ
vụ
nhanh)
thuộc vào việc nạp stack
180.700 chu kỳ (chuẩn) phụ
thuộc vào việc nạp stack
Không mailbox
Hệ
thống 8 mailboxes
mailbox
Pool bộ nhớ
Lên tới 16 pool bộ nhớ
Không có giá trị
Semaphores
8*1 bit
Không có giá trị
b. QNX Neutrino
QNX Neutrino là chuẩn mực cho các ứng dụng nhúng thời gian thực. Nó có
thể co giãn tới một kích thước rất nhỏ và cung cấp nhiều tác vụ hoạt động đồng
thời, các tiến trình, điều khiển lâp lịch thứ tự ưu tiên và chuyển ngữ cảnh nhanh.
tất cả các thành phần cơ bản của một ứng dụng nhúng thời gian thực. Hơn nữa, nhà
cung cấp OS tương thích với chuẩn thời gian thực POSIX-standard API.


QNX Neutrino là rất mềm dẻo. Người phát triển có thể dễ dàng tuỳ biến OS
cho phù hợp với ứng dụng của mình. Từ một cấu hình cơ bản nhất của một nhân
nhỏ (microkernel) cùng với một vài module nhỏ tới một hệ thống được trang bị
phát triển mạng diện rộng để phục vụ hàng trăm người dùng.
QNX Neutrino đạt được mức độ chuyên môn hoá về tính hiệu quả, tính

module hoá và tính đơn giản với hai yếu tố cơ bản sau:
 Kiến trúc microkernel


Kiến trúc microkernel
Tại tầng thấp nhất, microkernel chứa đựng một vài đối tượng cơ bản và các hàm
để thao tác với chúng. OS là được xây dựng từ các đối tượng cơ bản này.
Một số nhà phát triển cho rằng microkernel nên được thực thi hoàn toàn ở trong
mã assembly cho lý do kích thước và hiệu năng. Nhưng, việc thực thi của QNX
dựa chủ yếu vào mã C. Các mục tiêu kích thước và hiệu năng đạt được thông qua
việc tinh lọc các thuât toán và cấu trúc dữ liệu hơn là việc tối ưu thông qua mức
viết mã bằng assembly.
QNX Neutrino microkernel có nhân hỗ trợ các dịch vụ sau:
Các tiến trình
Truyền thông điệp
Các tín hiệu
Các đồng hồ
Các bộ định thời
Điều khiển các ngắt
Các đèn báo
Các khoá loại trừ lẫn nhau (mutexes)
Vòng đời của tiến trình
Số lượng các tiến trình trong một xử lý có thể rất đa dạng, cùng với các tiến
trình là được tạo và được huỷ một cách tự động. Việc tạo tiến trình
(pthread_create()) liên quan tới việc cấp phát và khởi tạo nguồn dữ liệu cần thiết
bên trong không gian địa chỉ của xử lý (ví dụ: thread stack) và việc bắt đầu thực
hiện của tiến trình tại một số hàm trong không gian địa chỉ.
Chấm dứt tiến trình (pthread_exit(), pthread_cancel()) liên quan tới việc dừng tiến
trình và phục hồi lại nguồn dữ liệu của tiến trình. Khi một tiến trình thực hiện,
trạng thái của nó nói chung có thể được mô tả như là ở một trong hai trạng thái

"ready" hoặc "blocked."
CONDVAR: Tiến trình bị khoá trên một biến điều kiện (ví dụ: nó được gọi
bởi hàm pthread_condvar_wait()).
- DEAD: Tiến trình đã chấm dứt và đang đợi được ghép cùng một tiến trình
khác.
- INTERRUPT: Tiến trình bị khoá và đợi cho một ngắt (ví dụ: nó được gọi bởi











Giao tiếp liên quá trình dựa trên thông
điệp


hàm InterruptWait()).
- JOIN: Tiến trình bị khoá đợi để ghép với một tiến trình khác (ví dụ: nó được
gọi bởi hàm pthread_join()).
- MUTEX: Tiến trình bị khoá trên một khoá loại trừ lẫn nhau (ví dụ: nó được
gọi bởi hàm pthread_mutex_lock()).
- NANOSLEEP: Tiến trình đang ngủ cho một khoảng thời gian ngắn (ví dụ: nó
được gọi bởi hàm nanosleep()).
- NET_REPLY: Tiến trình đang đợi cho sự đáp lại tới việc phân phát qua mạng
(ví dụ: nó được gọi bởi hàm MsgReply*()).

- NET_SEND: Tiến trình đang đợi cho một xung hoặc tín hiệu tới việc phân
phát qua mạng (ví dụ: nó được gọi bởi hàm MsgSendPulse(),
MsgDeliverEvent(), hoặc SignalKill()).
- READY: Tiến trình đang đợi cho được thực hiện trong khi bộ xử lý thực hiện
một tiến trình khác có mức ưu tiên cao hơn hoặc bằng tiến trình đó.
- RECEIVE: Tiến trình bị khoá đợi nhân được một thông điệp (ví dụ: nó được
gọi bởi hàm MsgReceive()).
- REPLY: Tiến trình bị khoá đợi một thông điệp đáp lại (ví dụ: nó được gọi bởi
hàm MsgSend() và server đã nhân được thông điệp đó).
- RUNNING: Tiến trình đang được thực hiện bởi bộ xử lý.
- SEM: Tiến trình đang đợi cho một đèn báo giải phóng (ví dụ: nó được gọi bởi
hàm SyncSemWait()).
- SEND: Tiến trình là bịkhoáchờ thông điệp gủi (ví dụ: nó được gọi bởihàm
MsgSend() nhưng server chưa nhận được thông điệp).
- SIGSUSPEND: Tiến trình bị khoá đợi cho một tín hiệu (ví dụ: nó được gọi bởi
hàm sigsuspend()).
- SIGWAITINFO: Tiến trình bị khoá đợi cho một tín hiệu (ví dụ: nó được gọi
bởi hàm sigwaitinfo()).
- STACK: Tiến trình đang đợi cho một không gian địa chỉ ảo được cấp phát cho
stack của tiến trình đó.
- STOPPED: Tiến trình bị khoá đợi cho tín hiệu SIGCONT.
- WAITCTX: Tiến trình đang đợi cho không phải một số nguyên (ví dụ: dấu
phẩy động) để trở thành có giá trị cho việc sử dụng.
- WAITPAGE: Tiến trình đang đợi cho một không gian bộ nhớ ảo được cấp
phát.
- WAITTHREAD: Tiến trình đang đợi cho một tiến trình con kết thúc được tạo
bởi chính nó (ví dụ: nó được gọi bởi hàm ThreadCreate()).
Giao tiếp liên quá trình dựa trên việc truyền thống điệp
QNX là hệ điều hành thương mại đầu tiên sử dụng truyền thông điệp liên
quá trình. Trong QNX Neutrino, một thông điệp là một gói các byte được truyền đi

từ tiến trình này đến tiến trình khác.
QNX cung cấp chức năng đồng bộ để truyền thông điệp từ một tiến trình tới tiến
trình khác. Tiến trình phải thay đổi trạng thái của nó khi truyền, nhận và đáp lại



thông điệp. Biết được trạng thái của chúng và thứ tự ưu tiên của chúng, microkerel
có thể lập lịch tất cả các thông điệp.
Các thuật toán lập lịch: QNX Neutrino cung cấp các thuật toán lập lịch sau:
 Vào trước ra trước (FIFO)
 Xoay vòng (round-robin)
 Lập lịch rời rạc.



×