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

RTOS for embedded system TV

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 (440.84 KB, 10 trang )

Khi nào c ần s ử d ụng RTOS ?
Các ứng dụng không cần dùng RTOS
Ứng d ụng đơn ( ứng d ụng chỉ có 1 ch ức n ăng)
Ứng d ụng có vòng l ặp đơn gi ản
Ứng d ụng <32kB
Nếu ứng dụng của bạn mà kích th ước ch ương trình l ớn d ần và độ ph ức t ạp t ăng lên thì
RTOS sẽ rất hữu dụng trong tr ường hợp này, lúc đó RTOS sẽ chia các ứng d ụng ph ức t ạp
thành các ph ần nh ỏ h ơn và d ễ qu ản lý h ơn.





Tại sao lại phải dùng RTOS ?





Chia s ẻ tài nguyên m ột cách đơn gi ản: cung c ấp c ơ ch ế để phân chia các yêu c ầu
về bộ nhớ và ngoại vi của MCU
D ễ debug và phát tri ển: M ọi ng ười trong nhóm có th ể làm vi ệc m ột cách độc l ập, các
l ập trình viên thì có th ể tránh đượ c các t ương tác v ới ng ắt, timer, v ới ph ần c ứng (cái này
mình không khuy ến khích l ắm vì hi ểu đượ c ph ần c ứng v ẫn s ẽ t ốt h ơn nhi ều)
T ăng tính linh động và d ễ dàng b ảo trì: thông qua API c ủa RTOS,…

Các khái ni ệm c ơ b ản

Kernel



Kernel s ẽ có nhi ệm v ụ qu ản lý nhi ều task cùng ch ạy 1 lúc, m ỗi task th ường ch ạy m ất vài
ms. Tại lúc kết thúc task thường:
Lưu trạng thái task
Thanh ghi CPU sẽ load trạng thái c ủa task tiếp theo
Task ti ếp theo c ần kho ảng vài ms để th ực hi ện
Vì CPU thực hiện tác vụ rất nhanh nên d ưới góc nhìn ng ười dùng thì h ầu nh ư các task là
được thực hiện 1 cách liên tục.





Task state
Một task trong RTOS thường có các trạng thái nh ư sau

RUNNING: đang thực thi
READY: s ẵn sàng để th ực hi ện
WAITING: chờ sự kiện
INACTIVE: không được kích hoạt


Scheduler
Đây là 1 thành phần của kernel quyết định task nào được thực thi. Có một số luật cho
scheduling như:







Cooperative: giống với lập trình thông thường, mỗi task chỉ có thể thực thi khi task
đang chạy dừng lại, nhược điểm của nó là task này có thể dùng hết tất cả tài nguyên
của CPU
Round-robin: mỗi task được thực hiện trong thời gian định trước (time slice) và
không có ưu tiên.

Priority base: Task được phân quyền cao nhất sẽ được thực hiện trước, nếu các
task có cùng quyền như nhau thì sẽ giống với round-robin, các task có mức ưu tiên thấp
hơn sẽ được thực hiện cho đến cuối time slice
• 1 Task A chờ event
• 2 Task B chờ event
• 3 Task B event sẵn sàng
• 4 Task A event sẵn sàng
• Priority-based pre-emptive: Các task có mức ưu tiên cao nhất luôn nhường các
task có mức ưu tiên thấp hơn thực thi trước.


1.
2.
3.
4.

Task A chờ event
Task B chờ event
Task B event s ẵn sàng
Task A event s ẵn sàng

Task
Một task là một chương trình, chương trình này chạy liên t ục trong vòng l ặp vô t ận và
không bao gi ờ d ừng l ại. V ới m ỗi task thì có ni ềm tin duy nh ất là ch ỉ mình nó đang ch ạy và

có th ể s ử d ụng h ết ngu ồn tài nguyên s ẵn có c ủa b ộ x ử lý (m ặc dù là th ực t ế thì nó v ẫn ph ải
chia sẻ nguồn tài nguyên này v ới các task khác).
Một chương trình thường sẽ có nhiều task khác nhau. Ví d ụ nh ư máy bán đồ u ống t ự động
sẽ có các thành task sau




Task quản lý việc lựa chọn của ng ười dùng
Task để ki ểm tra đúng s ố ti ền ng ười dùng đã tr ả
Task để đi ều khi ển động c ơ/ c ơ c ấu cung c ấp n ước u ống.

Kernel s ẽ qu ản lý vi ệc chuy ển đổ i gi ữa các task, nó s ẽ l ưu l ại ng ữ c ảnh c ủa task s ắp b ị h ủy
và khôi ph ục l ại ng ữ c ảnh c ủa task ti ếp theo b ằng cách:



Ki ểm tra th ời gian th ực thi đã đượ c đị nh ngh ĩa tr ước (time slice đượ c t ạo ra b ởi ng ắt
systick)
Khi có các sự kiện unblocking một task có quy ền cao h ơn x ảy ra (signal, queue,
semaphore,…)




Khi task g ọi hàm Yield() để ép Kernel chuy ển sang các task khác mà không ph ải
chờ cho hết time slice

Khi khởi động thì kernel sẽ tạo ra một task mặc định g ọi là Idle Task.
Để t ạo một task thì c ần ph ải khai báo hàm định nghĩa task, sau đó t ạo task và c ấp phát b ộ

nhớ.

K ết n ối Inter-task & Chia s ẻ tài nguyên
Các task c ần ph ải k ết n ối và trao đổi d ữ li ệu v ới nhau để có th ể chia s ẻ tài nguyên, có m ột
số khái niệm cần lưu ý
Với Inter-task Communication:




Signal Events – Đồng bộ các task
Message queue – Trao đổ i tin nh ắn gi ữa các task trong ho ạt độ ng gi ống nh ư FIFO
Mail queue – Trao đổ i d ữ li ệu gi ữa các task s ử d ụng h ằng đợi c ủa kh ối b ộ nh ớ

Với Resource Sharing



Semaphores – Truy xuất tài nguyên liên t ục t ừ các task khác nhau
Mutex – Đồng bộ hóa truy cập tài nguyên s ử d ụng Mutual Exclusion

Signal event
Signal event đượ c dùng để đồ ng b ộ các task, ví d ụ nh ư b ắt task ph ải th ực thi t ại m ột s ự
ki ện nào đó đượ c đị nh s ẵn


Ví dụ: Một cái máy giặt có 2 task là Task A điều khiển động cơ, Task B đọc mức nước từ
cảm biến nước đầu vào
Task A cần phải chờ nước đầy trước khi khởi động động cơ. Việc này có thể thực
hiện được bằng cách sử dụng signal event


Task A phải chờ signal event từ Task B trước khi khởi động động cơ

Khi phát hiện nước đã đạt tới mức yêu cầu thì Task B sẽ gửi tín hiệu tới Task A
Với trường hợp này thì task sẽ đợi tín hiệu trước khi thực thi, nó sẽ nằm trong trạng thái là
WAITING cho đến khi signal được set. Ngoài ra ta có thể set 1 hoặc nhiều signal trong bất
kỳ các task nào khác.


Mỗi task có thể được gán tối đa là 32 signal event
Ưu điểm của nó là thực hiện nhanh, sử dụng ít RAM hơn so với semaphore và message
queue nhưng có nhược điểm lại chỉ được dùng khi một task nhận được signal.

Message queue
Message queue là cơ chế cho phép các task có thể kết nối với nhau, nó là một FIFO buffer
được định nghĩa bởi độ dài (số phần tử mà buffer có thể lưu trữ) và kích thước dữ liệu
(kích thước của các thành phần trong buffer). Một ứng dụng tiêu biểu là buffer cho Serial
I/O, buffer cho lệnh được gửi tới task


Task có thể ghi vào hằng đợi (queue)
Task sẽ bị khóa (block) khi gửi dữ liệu tới một message queue đầy đủ
Task sẽ hết bị khóa (unblock) khi bộ nhớ trong message queue trống
Trường hợp nhiều task mà bị block thì task với mức ưu tiên cao nhất sẽ được
unblock trước
Task có thể đọc từ hằng đợi (queue)










Task sẽ bị block nếu message queue trống
Task sẽ được unblock nếu có dữ liệu trong message queue.
Tương tự ghi thì task được unblock dựa trên mức độ ưu tiên

Ví dụ:

Mail queue
Giống như message queue nhưng dũ liệu sẽ được truyền dưới dạng khối(memory block)
thay vì dạng đơn. Mỗi memory block thì cần phải cấp phát trước khi đưa dữ liệu vào và giải
phóng sau khi đưa dữ liệu ra.


Gửi dữ liệu với mail queue
Cấp phát bộ nhớ từ mail queue cho dữ liệu được đặt trong mail queue
Lưu dữ liệu cần gửi vào bộ nhớ đã được cấp phát
Đưa dữ liệu vào mail queue
Nhận dữ liệu trong mail queue bởi task khác










Lấy dữ liệu từ mail queue, sẽ có một hàm để trả lại cấu trúc/ đối tượng
Lấy con trỏ chứa dữ liệu
Giải phóng bộ nhớ sau khi sử dụng dữ liệu

Ví dụ:

Semaphore


Được sử dụng để đồng bộ task với các sự kiện khác trong hệ thống. Có 2 loại
Binary semaphore
Trường hợp đặc biệt của counting semaphore
Có duy nhất 1 token
Chỉ có 1 hoạt động đồng bộ
Counting semaphore








Có nhiều token
Có nhiều hoạt động đồng bộ

Couting semaphore được dùng để:
Counting event






Một event handler sẽ ‘give’ semaphore khi có event xảy ra (tăng giá trị đếm
semaphore)
Một task handler sẽ ‘take’ semaphore khi nó thực thi sự kiện (giảm giá trị đếm
semaphore)
Count value là khác nhau giữa số sự kiện xảy ra và số sự kiện được thực thi
Trong trường hợp counting event thì semaphore được khởi tạo giá trị đếm bằng 0

Resource management


Count value sẽ chỉ ra số resource sẵn có







Để điều khiển và kiểm soát được resource của task dựa trên count value của
semaphore(giá trị giảm), nếu count value giảm xuống bằng 0 nghĩa là không có resource
nào free.
Khi một task finish với resource thì nó sẽ give semaphore trở lại để tăng count value
của semaphore.
Trong trường hợp resouce management thì count value sẽ bằng với giá trị max của
count value khi semaphore được tạo.


Mutex
Sử dụng cho việc loại trừ (mutial exclution), hoạt động như là một token để bảo vệ tài
nguyên được chia sẻ. Một task nếu muốn truy cập vào tài nguyên chia sẻ
Cần yêu cầu (đợi) mutex trước khi truy cập vào tài nguyên chia sẻ
Đưa ra token khi kết thúc với tài nguyên.
Tại mỗi một thời điểm thì chỉ có 1 task có được mutex. Những task khác muốn cùng mutex
thì phải block cho đến khi task cũ thả mutex ra.




Về cơ bản thì Mutex giống như binary semaphore nhưng được sử dụng cho việc loại trừ
chứ không phải đồng bộ. Ngoài ra thì nó bao gồm cơ chế thừa kế mức độ ưu tiên(Priority
inheritance mechanism) để giảm thiểu vấn đề đảo ngược ưu tiên, cơ chế này có thể hiểu
đơn giản qua ví dụ sau:





Task A (low priority) yêu cầu mutex
Task B (high priority) muốn yêu cầu cùng mutex trên.
Mức độ ưu tiên của Task A sẽ được đưa tạm về Task B để cho phép Task A được
thực thi
Task A sẽ thả mutex ra, mức độ ưu tiên sẽ được khôi phục lại và cho phép Task B
tiếp tục thực thi.




Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×