Hệ điều hành thời gian thực RTOS
Trang 1CHƯƠNG 1: HỆ ĐIỀU HÀNH THỜI GIAN THỰC (RTOS)
1.1 GIỚI THIỆU CHUNG:
1.1.1 Định nghĩa Hệ điều hành thời gian thực RTOS
1.1.1.1 Hệ thống thời gian thực ( Real time System):
Thời gian ( Time) :
Sự chính xác của hệ thống không chỉ phụ thuộc vào kết quả tính toán logic mà còn phụ thuộc vào thời gian cho ra kết quả
Thực ( Real):
Đáp ứng của hệ thống với những sự kiện bên ngoài
Thời gian thực ( Real-Time):
Phải đảm bảo các yếu tố :
Trang 21.1.1.3 Định nghĩa hệ điều hành thời gian thực RTOS:
Là hệ thống có:
Lịch trình thực thi theo thời gian
Quản lý tài nguyên hệ thống
Cung cấp những nền tảng cơ bản để phát triển các ứng dụng trên nó
Đối tượng (Object) :
Là những cấu trúc đặc biệt (Kernel) giúp người lập trình tạo ra các ứng dụng
Trang 3 Dịch vụ ( Service) :
Là những điều khiển mà Kernel ( lõi) thực thi trong đối tượng ( object): chia thời gian ( Timing), Ngắt( interrupt), Đáp ứng ( handling) và quản lý tài nguyên hệ thống ( resource management)
1.1.2.1.1 Chuyển đổi trạng thái ( Context Switching)
Hình 1.3 : Chuyển đổi trạng thái ( ngữ cảnh)
Trạng thái ( ngữ cảnh) của tác vụ ( Task)
Mỗi task có một trạng thái riêng của nó, nó chính là trạng thái của những thanh ghi ( registers)
Mỗi thời điểm 1 task mới được tạo ra , kernel sẽ tạo ra và lưu giữ một block điều khiển liên quan đến task đó ( TCBs ) TCBs
là những cấu trúc dữ liệu hệ thống mà kernel dùng để lưu trữ những thông tin đặc trung của task TCBs chứa mọi thứ mà một kernel cần để biết về một task cụ thể nào đó Khi task đnag chạy, trạng thái của nó là động Trạng thái động này được lưu trữ trong TCB Khi task không còn chạy nữa, trạng thái sẽ bị đóng bang ( frozen) trong TCB, và được sử dụng cho lần thực thi tiếp theo của task
Trang 4 Công tắc chuyển đổi trạng thái ( Context Switch):
Sẽ xãy ra khi bộ lịch trình ( scheduler) chuyển từ một trạng thái này sang một trạng thái khác
Việc chuyển đổi trạng thái bao gồm:
Thời gian chuyển đổi:
Là thời gian tiêu tốn để cho bộ lịch trình chuyển từ task này sang task khác
Nó không có liên quan nào đến các lệnh thực hiện trong task
Nếu một ứng dụng được thiết kế mà xảy ra chuyển đổi trạng thái thường xuyên thì có thể dẫn đến những thực thikhông cần thiết Vì vậy, nên thiết kế ứng dụng theo cách mà tạo ra ít chuyển đổi trạng thái nhất
Khi nào chuyển đổi xãy ra:
Mỗi khi ứng dụng tạo một lời gọi hệ thống ( System Call) , bộ lịchtrình sẽ xác định rằng có cần chuyển đổi trạng tháu hay không Khi bộ lịch trình xác định việc chuyển đổi là cần thiết thì sẽ gọi
bộ phân phối ( dispatcher) để thực hiện việc chuyển đổi
Ví dụ:
Khi bộ thực thi của Kernel xác định cần dừng việc thực thi task 1
để chuyển qua trạng task 2 thì nó sẽ thực thi theo các bước sau: Kernel sẽ lưu thông tin trạng thái của Task 1 Load thông tin trạng thái của Task
2, task2 trở thành luổng ( thread) thực thi hiện tại Trạng thái chuyển đổi của Task 1 sẽ được đóng bang trong khi Task 2 đang được thực thi, nhưngnếu như bộ chuyển đổi xác định cần chạy lại task 1 thì task 1 sẽ quay lại vịtrí ngay trước khi nó bị chuyển đổi
Trang 5Hình 1.4: Ví dụ về Contex Switch
1.1.2.1.2 Bộ điều phối (Dispatcher):
Dòng thưc thi ( Flow of Execution):
Tại bất kì thời điểm nào RTOS đang chạy, dòng thực thi sẽ chuyển đến 3 vùng: đến các Task ứng dụng ( application Task), đến một chương trình phục vụ ngắt ( ISR), hoặc đến Kernel
Khi nào bộ phân phối được thực hiên:
Khi một Task hoặc ISR tạo một lời gọi hệ thống, dòng điều khiển sẽ chuyển đến Kernel để thực thi một trong số những thủ tục được cung cấp bởi Kernel
Khi rời khỏi kernel, Dispatcher sẽ có trách nhiệm là chuyển lệnh điều khiển đến một trong số những Task ứng dụng
Cách thực hiện như sau:
Không cần thiết để chuyển toàn bộ lệnh điều khiển đến cùng một task gọi System Call Điều này sẽ được xác định bằng giải thuật phân chia thời gian biểu ( scheduling algorithms ) của bộ lịch trình ( scheduler)
Chuyển đổi thực thi từ một Task
Trang 6Hình 1.5: Điều phối từ một Task
Tùy thuộc vào cách truy cập vào Kernel như thế nào mà dispatching sẽ xãy ra khác nhau Khi một Task thực hiện một lời gọi
hệ thống, dispatcher sẽ được sử dụng để thoát khỏi Kernel mỗi khi Lời gọi hệ thống được hoàn thành Trong trường hợp này, dispatcherđược dùng như một lời gọi của lời gọi ( call- by –call basic) để nó cóthể hỗ trợ cho việc chuyển đổi trạng thái của Task Bất kì Task nào cũng có thể gọi system call Một hay nhiều Task có thể ở trạng thái sắn sàng cho thực thi
Chuyển đổi thực thi từ 1 chương trình phục vụ ngắt(ISR):
Hình 1.6: Điều phối từ một ISR
Trang 7 Khi một ISR tạo một System Call, Dispatcher sẽ bị bỏ vô hiệu hóa cho đến khi ISR thưc thi xong Quá trinh này sẽ đúng miễn là có đủ tài nguyên để chuyển đổi giữa các Task Chuyển đổi trạng thái này sẽ không được diễn ra bởi vì ISR phải được thực thi xong mà không được ngắt bởi các Tasks Sau khi ISR thực thi xong,Kernel sẽ thoát đến dispatcher để có thể điều phối đến đúng task thực thi tiếp theo.
1.1.2.1.3 Giải thuật cho lịch trình:
Lịch trình thay thế theo độ ưu tiên:
Hình 7: Giải thuật lịch trình theo độ ưu tiên
Hầu hết các Real – time Kernel sử dụng giải thuật lịch trình thay thế theo độ ưu tiên ( preemptive priority- based scheduling) làm mặc định
Các task sẽ được thực thi tại bất kì một thời điểm là task có
độ ưu tiên cao nhất so với các task khác đang ở trạng thái sẵn sàng
Real –Time Kernel hỗ trợ 256 cấp độ ưu tiên, với 0 là độ ưutiên cao nhất và 255 là độ ưu tiên thấp nhất Một số Kernel thì ngược lại với 255 là độ ưu tiên cao nhất và 0 là độ ưu tiên thâp nhất
Với bộ chuyển đổi theo đọ ưu tiên, mỗi task phải có một độ
ưu tiên, và task có độ ưu tiên cao nhất chạy đầu tiên Nếu một Task có
độ ưu tiên cao hơn task đang chạy trở nên sẵn sàng để chạy thì kernel
sẽ ngay lập tức lưu lại trạng thái Task hiện tại và chuyển sang Task có
độ ưu tiên cao hơn
Mặc dù việc phân chia độ ưu tiên của Task được thực hiện khi task đó được tạo nhưng độ ưu tiên của Task là có thể thay đổi một cách linh động sử dụng Lời gọi do kernel cung cấp ( Kernel – providedcalls) Khả năng này dùng để thay đổi một cách linh động cho phép một ứng dụng nhúng có độ linh hoạt để ứng xử với sự kiện bên ngoài
Trang 8khi chúng xuất hiện, tạo ra một hệ thống thời gian thực và đáp ứng tốt Lưu ý là việc sử dụng không đúng khả năng thay đổi độ ưu tiên này cóthể dẫn đến đảo độ ưu tiên ( priority inversion), vùng chết ( deadlock),
và có thể dẫn đến treo hệ thống ( system failure)
Ví dụ: ( Hình 7)
Task 1 được thay thế bởi task 2 có độ ưu tiên cao hơn, task 2 được thay thế bởi task 3 có độ ưu tiên cao hơn, khi Task 3 hoàn thành, task 2 sẽ tiếp tục thực thi trạng thái ngay trước khi bị dành quyền thực thi Tương tự, khi task 2 hoàn thanh thì Task 1 sẽ được tiếp tục thực thi (resumes)
Lịch trình theo Round- Robin( Gọi vòng)
Hình 1.8 : Lịch trình theo Round- Robin
Mỗi Task sẽ cùng chia sẻ thời gian thực thi của CPU Round- Robin thuần túy không thỏa mãn yêu cầu của hệ thống thờigian thực bởi vì một hệ thống thời gian thực các task phải làm việctheo mức độ quan trong khác nhau
Ví dụ : ( Hình 8)
Thay vì thay thế theo độ ưu tiên, các task round –robin được phân chia thời giant thực thi theo các khoảng thời gian ( time slice)
Vơi time slicing , mỗi task sẽ được thực thi trong mộtkhoảng thời gian nhất định, và theo vong trong Một bộ đếm thời gian sẽ giám sát thời gian của mỗi Task, tăng lên theo mỗi xung clock Khi thời gian thực thi một task đã hết,
bộ đếm sẽ bị xóa, và task này sẽ được đặt ở cuổi cùng của chu kì ( end of circle)
Trang 9 Nếu như một task round-robin bị thay thế bởi mọt task có độ ưu tiên cao hơn, thì bộ đếm thời gian sẽ lưu lại
và phục hồi khi task bị thay thế dành quyền thực thi lại
1.1.2.2 Các đối tượng ( Objects) trong RTOS:
Tasks:
Là các luồng ( thread) thực thi cùng tồn tại và độc lập nhau
có thể “ cạnh tranh” nhau để dành quyền thực thi
Real-time embedded applications:
Là sự kết nối giữa các đối tượng của Kernel để giải quyết vấn đề thời gian thực như sự đồng thời, sự đồng bộ,và trao đổi dữ liệu
1.2 VẤN ĐỀ QUẢN LÝ CÁC TASKS:
1.2.1 Định nghĩa Tasks:
Hình 1.9: Sơ đồ cấu trúc của một Task cơ bản
Trang 10 Task là một luồng thực thi độc lập mà có thể cạnh tranh chiếm quyền thực thi Một ứng dụng được chia ra làm nhiều Tasks đồng thời ( ConcurrentTask) để tối ưu khả năng đáp ứng vào ra trong luật thời gian.
Một Task được định nghĩa thuần túy là một tập các tham số và cấu trúc dữ liệu
Các thành phần của một Task:
Khi được tạo ra, Task sẽ có tên, ID duy nhất, độ ưu tiên, một block điều khiển Task ( TCB), Stack, và Các thủ tục thực thi Task
1.2.2 Task hệ thống ( System Task):
Bao gồm các Task sau:
Task khởi tạo ( Initialization or Startup Task)
Khởi tạo hệ thống và tạo task khởi động hệ thống
Task “Rỗi” ( Idle Task)
Idle Task chạy theo chu kì rỗi của hệ thống ( idle cycles), được đặt ở độ ưu tiên thấp nhất
Thực thi một vòng lặp vô tận Idle task chắc chắn rằng bộ đếm chương trình luôn luôn có giá trị cho trong trường hợp không có task nào thực thi
Kernel cho phép các thao tác được cấu hình bời người dùng( developer) để chạy những yêu cầu đặc biệt : sleep mode …
Task “đăng nhập” ( Logging Task)
Là tin nhắn truy cập vào hệ thống
Task “Lỗi” ( Exception- Handling Task)
Thực thi các trường hợp lỗi hệ thống hoặc ứng dụng
Task “ sữa lỗi” ( Debug Agent Task)
Cho phép sữa lỗi thông qua công cụ debug ( host debugger) Chú ý rằng các task hệ thống khác có thể được tạo ra trong quá trình khởi tạo, phụ thuộc vào các thành phần có trong kernel
1.2.3 Các trạng thái của một Task:
Trang 11Hình 1.10 Các trạng thái của một Task.
Trạng thái của một Task:
Tại bất kì một thời điểm, mỗi task tồn tại một trong số những trạng thái nhỏ bao gồm: Sẵn sàng ( Ready), Đang thực thi ( Running), hoặc Khóa ( Blocked) Khi một hệ thống nhúng thời gian thực chạy, mỗi task thay đổi từ trạng thái này đến trạng thái khác theo quy luật logic của một mấy trang thái hữu hạn đơn giản ( Finite state machine (FSM))
Về cơ bản, 3 trạng thái chính được sử dụng trong hầu hết các hệ thống Kernel sử dụng phương pháplịch trình thây thế ( preemptive – scheduling)
1.2.3.1 Trạng thái sẵn sàng ( Ready State):
Task đã sẵn sàng thực thi nhưng chưa thể thực thi vì task có độ ưu tiên cao hơn đang chiếm quyền thực thi
Khi một Task được tạo lần đầu tiên, Kernel sẽ tự động đặt task này vào trạng thái sẵn sàng
Ở trạng thái này, Task sẽ dành quyền thực thi với các Task ở trạng thái sẵn sàng khác để chiếm thời gian thực thi của bộ vi xử lý
Task ở trạng thái sẵn sàng không thề chuyển vào trạng thái Khóa( blocked) một cách trực tiếp Một Task đầu tiên cần phải chạy để
có thể gọi “blocking call”, blocking call là lời gọi đến một hàm mà không thể chạy đến việc hoàn thành ngay lập tức
Đối với những Kernel chỉ hỗ trợ mỗi mức ưu tiên cho một Taskduy nhất, giải thuật lich trình sẽ được chuyển thẳng tới Task có độ ưu tiên cao nhất sẵn sàng cho lần chạy tiếp theo Với việc hiện thực theo
Trang 12cách này , Kernel giới hạn số lượng Task trong một ứng dụng tương ứng với số mức ưu tiên được hỗ trợ.
Tuy nhiên, hầu hết các kernel hỗ trợ nhiều hơn một Task cho mỗi mức ưu tiên trong một ứng dụng cụ thể nào đó Trong trường hợp này, giải thuật lịch trình sẽ phức tạp hownvaf bao gồm cả việc lưu trữ một danh sách cá task ổ trạng thái sẵn sàng Một số Kernel lưu giữ danhsách task ở trạng thái sẵn sàng một cách rời rạc cho từng độ ưu tiên; một số khác thì có một danh sách duy nhất
Ví dụ: ( Hình 11)
Giả sử hệ thống sử dụng giải thuật lịch trình thay thế theo
độ ưu tiên ( priority- based preemptive scheduling algorithm) với 255 mức ưu tiên và quy định mức ưu tiên 0( lowest) là mức ưu tiên cao nhất
Trong ví dụ này, Task 1, 2, 3, 4 và 5 đang ở trạng thái sẵn sàng thực thi, và Kernel xếp hang chúng bằng trong dang sách các task sẵn sàng( task –ready list) Task 1 là task có độ ưu tiên cao nhất (70); task 2, 3, 4 là những Task có độ ưu tiên tiếp theo (80), và Task 5 có độ
ưu tiên thấp nhất( 90) Các bước sau giải thích việc Kernel dùng danh sách này như thế nào:
Vì Task 1 có độ ưu tiên cao nhất nên nó là Task đầutiên sẵn sàng để chạy Kernel sẽ chuyển Task 1 từ danh sách Task sẵn sàng sang trạng thái đang thực thi
Suốt trong quá trình thực thi, Task 1 tạo ra một Blocking call Kết quả là Kernel chuyển Task 1 vào trạng thái Blocked Tiếp theo, Task 2 có độ ưu tiên cao thứ 2 nên
sẽ được chuyển vào trạng thái đang thực thi
Tiếp theo, Task 2 gọi Blocking call Kernel chuyển Task 2 vào trạng thái Blocked.Quá trình tương tự diễn ra cho Task 3
Khi Task 3 thực thi, tài nguyên hệ thống được yêu cầu bởi Task 2 Kernel sẽ chuyển Task 2 vào trạng thái sẵnsàng và chèn vào cuối danh sách các trạng thái sẵn sàng ở
độ ưu tiên là là 80 Task 3 vâc tiếp tục là Task hiện thời đang chạy
Task 3 tại thời điểm này sẽ được chuyển đến trạng thái sẵn sàng và chèn sau Task 2 trong danh sách ( cùng độ
ưu tiên là 80), đứng trước Task 5
Trang 13Hình 1.11 : ví dụ về trạng thái sẵn sàng của Task
1.2.3.2 Trạng thái đang thực thi ( Running state):
Task có độ ưu tiên cao nhất và đang chạy
Ở hệ thống đơn vi xử lý ( Single – processor system), chỉ duy nhất một Task có thể chạy tại một thời điểm Trong trường hợp này, khi Task được chuyển vào trạng thái đang thực thi, bộ xử lý lấy dữ liệu từ các thanh ghi ứng với với trạng thái của Task Bộ xử lý
có thể thực thi thực thi những lệnh trong Task và quản lý Stack liên quan
Như đã đề cập đến trong phần 1.2.3.1, một Task có thể chuyển đến trạng thái sẵn sàng trong khi đang chạy Khi một Task chuyển từ trạng tháiđang chạy đến trạng thái Sẵn sàng, nó bị chiếm quyền thực thi bởi Task có
độ ưu tiên cao hơn Trong trường hợp này, Task bị chiếm quyền thực thi
sẽ được đặt vào vị trí chính xác về mức ưu tiên trong danh sách các Task đang trạng thái sẵn sàng thực thi, và Task có độ ưu tiên cao hơn được chuyển từ trạng thái sẵn sàng sang trạng thái đang thực thi
Không giống như một Task wor trạng thái sẵn sàng, Task ở trạng thái đang thực thi sẽ chuyển đến trạng thái Blcoked theo cách sau:
Bằng cách tạo ra một lời gọi yêu cầu một tài nguyên nhưng không có sẵn để đáp ứng
Bằng cách tạo ra một lwoif gọi yêu cầu chờ một sự kiện xuất hiện
Bằng cách tạo ra một yêu cầu để delay chính nó trong một khoảng thời gian nào đó
1.2.3.3 Trạng thái Khóa ( blocked State)
Trang 14 Task yêu cẩu tài nguyên hệ thống nhưng chưa được đáp ứng, yêu cầu sẽ phải đợi cho đến khi sự kiện xuất hiện, hoặc delay một khoảng thời gian.
Tính năng của trạng thái blocked là rất quan trọng trong hệ thống thời gian thực vì nếu không có trạng thái này, Task có độ ưu tiên thấp hơn
sẽ không thể thực thi được Nếu Task có độ ưu tiên cao hơn không được thiết kế cho trạng thái Blocked, CPU bị treo có thể xãy ra
Một Task có thề chuyền đến trạng thái Blocked chỉ khi tạo một blocking call, yêu cầu một số điều kiện khóa Một Task ở trạng thái Blocked cho đến khi một số điều kiện blocking được thỏa mãn Ví dụ như một Semaphore xác định được Task nào đang đợi để giải phóng trạng thái blocked, hoặc là một “tin nhắn” ( message) trong đó chứa Task đang đợi đến một Queue, hoặc thời gian delay cho Task đó đã hết…
Khi một Task được mở khóa ( unclocked), Task có thể chuyển từ trạng thái blocked sang trạng thái sẵn sàng chạy ( ready state)
Nếu Task được mở khóa có độ ưu tiên cao nhất , Task này sẽ chuyển trực tiếp đến trạng thái đang thực thi và sẽ chiếm quyền thực thi của Task hiện tại
Hiện tượng “ CPU starvation”:
Hiện tượng này xãy ra khi Task có độ ưu tiên cao nhất chiếm toàn bộ thời gian thực thi và Task có độ ưu tiên thấp hơn không thể chạy được
1.2.3.4 Các trạng thái khác:
Một số Kernel định nghĩa những trạng thái khác như : trì hoãn ( suspended), Treo ( pended) và delay Trong trường hợp này, pended và delay thực chất là trạng thái trung gian của trạng thái blocked Một Task ở trạng thái Pended đang chờ một tài nguyên nào đó cần được giải phóng, một delay Task thì đang chờ thời gian delay kết thúc Trạng thái
suspended tồn tại với mục đích debugging hệ thống
Kernel phải lưu trạng thái hiện tại của tất cả các Tasks trong hệ thống Khi những lời gọi được tạo ra bởi các tác đang thực thi, bộ lịch trình sẽ xác đính Task nào cần thay đổi và thực hiện những sự thay đổi này
Trong một số trường hợp, Kernel thay đổi trạng thái của một số Task nhưng không có việc chuyển trạng thái ( context switching) xuất hiện
vì trạng thái của Task có độ ưu tien cao nhất không bị ảnh hưởng Trong những trường hợp khác, những sự thay đổi trạng thái này dẫn đến một context switching bởi vì Task có độ ưu tiên cao nhất sẽ bị blocked và không còn có độ ưu tiên cao nhất nữa Khi quá trình xử lý xãy ra, Task