Giới thiệu Trước tiên chúng ta xem qua một số khái niệm: Hệ điều hành thời gian thực (RTOS) là phần mềm quản lí thời gian của một vi xử lý hoặc vi điều khiển. Đặc tính của hệ thống thời gian thực nằm ở chỗ nhiều kết quả tính tóan liên tục đều có kết quả nếu tính logic cũng như tính chính xác về thời gian đựoc thỏa mãn. Ứng dụng đa nhiêm thời gian thực là một hệ thống ở đó nhiều tác vụ chính quan trọng về thời gian phải được xử lý đồng thời. Một nhân đa nhiệm thời gian thực (cũng đựoc gọi là hệ điều hành thời gian thực, RTOS) là phần mềm đảm bảo các “sự kiện” (thời gian của sự kiện là quan trọng) được xử lý ở cấp độ tốt nhất có thể. Sử dụng một RTOS thường sẽ đơn giản hóa quá trình thiết kế một hệ thống bằng việc chia nhỏ các ứng dụng vào các phần độc lập gọi là “task”. Foreground/Background Các hệ thống không thể ứng dụng RTOS thường có sơ đồ hoạt động như hình dưới đây. Hệ thống này gọi là Foreground/Background. Một ứng dụng có một vòng lặp vô tận, gọi là các module, thực hiện nhiệm vụ mong muốn. Các module thực hiện theo tuần tự (background) có sử dụng ISR (Interrupt Service Routine – trình phục vụ ngắt) điều khiển các “sự kiện” dị bộ (foreground). Các hoạt động phải được điều khiển bằng ISR để đảm bảo chúng được thực hiện theo đúng thời gian. Chính vì lí do này, ISR có xu hướng là mất nhiều thời gian hơn mức cần thiết. Thông tin cho một module background do ISR cung cấp không được xử lý ngay cho đến khi trình hoạt động của background xác định đến lượt module đó được thực hiện. Sự chậm trễ này phụ thuộc trong bao lâu background quay lại (từ vòng lặp). Nhân thời gian thực (Real-time Kernel) Đa nhiệm (Multitasking) Đa nhiệm là quá trình lập lịch và “chuyển giao” trong CPU giữa các tác vụ. Một CPU đơn chuyển sự ‘quan tâm” của nó giữa các tác vụ liên tiếp nhau. Đa nhiệm cung cấp khả năng lập cấu trúc cho ứng dụng của bạn thành một tập các sự kiện nhỏ, các tác vụ rõ ràng cùng chia sẻ vi xử lý. Một trong những mục tiêu quan trọng của đa nhiệm là cho phép người lập trình ứng dụng quản lý độ phức tạp tồn tại & phát sinh trong ứng dụng thời gian thực. Một tác vụ là môt chương trình đơn mà chương trình này “nghĩ” chỉ có mình nó trong toàn bộ CPU này. Quá trình thiết kế cho ứng dụng thời gian thực liên quan đến vấn đề chia nhỏ công việc được thực hiện vào các tác vụ, mỗi tác vụ này đáp ứng một phần nào đấy vấn đề xảy đến với ứng dụng thời gian thực. Nhân (Kernel) Nhân là một phần trong hê đa nhiệm, có tác dụng quản lý tác vụ và truyền thông giữa các tác vụ này. Khi nhân quyết định chạy một tác vụ khác (khác với tác vụ hiện tại), chỉ đơn giản là lưu lại nội dung tác vụ hiện thời (các thanh ghi của CPU) vào một stack của tác vụ hiện thời; mỗi stack gắn với một khu vực stack trong bộ nhớ. Một khi hoạt động đựoc thực hiện, nội dung của stack mới được lưu từ khu vực stack của nó, sau đó thực hiện mã lệnh của stack mới. Quá trình này gọi là chuyển đổi nội dung hoặc chuyển đổi tác vụ. Đỉnh của stack hiện tại cùng với thông tin khác được lưu trong khu vực dữ liệu gọi là Task Control Block (TCB). Một TCB gắn với mỗi stack khi stack được tạo ra và được RTOS quản lý. Ngắt (Interrupt) Một vấn đề quan trọng trong hệ thống thời gian thực là yêu cầu về thời gian đáp ứng một ngắt và mã nguồn thực tế của người lập trình điều khiển ngắt đó. Tất cả RTOS đều xóa hết các ngắt khi thực hiện một đoạn mã quan trọng. Khi RTOS càng xóa ngắt lâu, thì khoảng trễ ngắt
càng lớn Thường thì RTOS xóa ngắt dưới 50us, nhưng rõ ràng là càng ngắn càng tốt. Scheduler - bộ xếp lịch Bộ xếp lịch, còn được gọi là dispatcher (bộ phân chia), là một phần của Nhân, có chức năng xác định tác vụ nào sẽ được thực hiện tiếp theo, và khi nào thì thưc hiện. Hầu hết Nhân thời gian thực đều được đặt mức ưu tiên, môi tác vụ đều được đặt mức ưu tiên nào đó. Thiết lập mức ưu tiên cho mỗi tác vụ là một việc rất cụ thể và cần thiết. Trong một nhân đã thiết lập mức ưu tiên, việc thực hiện của CPU luôn từ mức ưu tiên cao xuống thấp. Có 2 loại lập lịch: non-preemptive và preemptive. Bộ xếp lịch Non-preemptive yêu cầu mỗi tác vụ phải thực hiện một cái gì đấy để thoát hoàn toàn quyền điều khiển CPU. Để duy trì tính đồng thời, quá trình này phải được thực hiện đều đặn. Xếp lịch non-preemptive cũng được gọi là “phối hợp đa tác vụ”, các tác vụ cùng kết hợp hoạt động để tận dụng khả năng điều khiển của CPU. Xếp lịch non-preemptive (không ưu tiên) Khi một tác vụ trả lại quyền sử dụng CPU, nhân sẽ thực hiện tác vụ tiếp sau quan trọng nhất mà nó đã sẵn sàng hoạt động. Nhiều sự kiện diễn ra không đồng bộ vẫn được ISR quản lý. Có tác vụ được ISR phân mức ưu tiên cao hơn, tuy nhiên tác vụ có mức ưu tiên cao hơn này cũng chỉ hoạt động khi một tác vụ trong ngắt khác hoàn thành. Hình dưới đây thể hiện vấn đề này. Để ý rằng độ trễ của non-preemptive nhỏ hơn nhiều so với Foreground/Background; độ trễ được xác định bởi thời gian thực hiện một tác vụ lâu nhất. Xếp lịch preemptive (ưu tiên) Trong một nhân preemptive, khi một sự kiện tác động làm tác vụ có mức ưu tiên cao hoạt động thì tác vụ hiện thời sẽ tạm dừng ngay tức khắc và chuyển quyền sử dụng CPU cho tác vụ có mức ưu tiên cao kia. Hầu hết hệ thống thời gian thực đều sử dụng preemptive bởi nó có tính đáp ứng tốt hơn. (Hình dưới đây mô tả cụ thể ý nghĩa này - do có một số trục trặc, ban biên soạn sẽ chỉnh sửa hình và gửi đến các ban trong thời gian sớm nhất). Reentrancy – tái sử dụng Chức năng Reentrancy là một chức năng có thể được sử dụng bởi nhiều tác vụ mà không lo ngại vấn đề xung đột dữ liệu. Ngược lại chức năng non-reentrancy là một chức năng mà nhiều tác vụ không thể cùng chia sẻ, trừ khi sự tương tác lẫn nhau với chức năng này được đảm bảo phải sử dụng một semaphone – mã hiệu (sẽ được đề cập sau) hoặc cấm ngắt trong quá trình thưc hiện phần mã lệnh quan trọng. Chức năng reentrant có thể bị ngắt bất cứ lúc nào và sẽ được khôi phục lại sau đó mà không lo ngại mất dữ liệu. Chức năng reentrant hoặc dùng biến cục bộ (các thanh ghi CPU hoặc các biến trên stack) hoặc bảo vệ dữ liệu khi sử dụng biến toàn cục. Các bộ biên dịch được thiết kế đặc biệt cho phần mềm nhúng sẽ cung cấp thư viện cho reentrant. Bộ xếp lịch Non-preemptive không yêu cầu chức năng tái sử dụng trừ khi một hàm cần được chia sẽ giữa một tác vụ và một ISR. Bộ xếp lịch Preemptive yêu cầu bạn phải có chức năng tái sử dụng nếu nhiều tác vụ chia sẻ một hàm nào đó. Dịch vụ của nhân Nhân thời gian thực cung cấp nhiều dịch vụ - tiện ích cho ứng dụng của bạn. Một trong những tiện ích phổ biến là chức năng quản lý semaphore (mã hiệu). Một mã hiệu là một giao thức cơ học sử dụng để điều khiển truy nhập tới nguồn dữ liệu chia sẻ (cho phép tương tác lẫn nhau), điều khiển tín hiệu diễn ra của một sự kiện hoặc cho phép hai tác vụ đồng thời hoạt động. Một mã hiệu về cơ bản là một khóa mà mã nguồn của bạn yêu cầu thứ tự thực hiện lệnh. Nếu mã hiệu đang hoạt động thì tác vụ được yêu cầu thực hiện sẽ phải đợi cho đến khi
mã hiệu được tác vụ đang hoạt động kia nhả ra. Tác vụ trong trạng thái chờ sẽ sử dụng không đáng kể tài nguyên CPU. Nhân cũng cung cấp tiện ích liên quan đến thời gian hỗ trợ bất kỳ tác vụ nào có thể tự trễ trong một số chu kỳ xung nhịp. Một chu kỳ xung nhịp thường trong khoảng 10 đến 200 mS tùy thuộc vào yêu cầu của từng ứng dụng. Đôi lúc chúng ta cần một tác vụ hoặc một ISR truyền thông tin (ví dụ gửi tin) tới tác vụ khác. Tính năng này gọi là truyền thông liên tác vụ và các tiện ích hỗ trợ việc gửi, nhận tin này được hầu hết các nhân hỗ trợ. Hai tiện ích của nhân phổ biến nhất cho chức năng gửi tin là hộp tin và “xếp hàng chờ” tin. Một hộp tin cũng được gọi là trao đổi tin là một biến con trỏ. Thông qua một tiện ích do nhân cung cấp, một tác vụ hoặc một ISR có thể đặt một tin (một con trỏ) vào hộp tin tức. Cả tác vụ gửi và nhận tin cùng thống nhất con trỏ nào thực sự trỏ tới, cả hai tác vụ này cũng thống nhất nội dung tin tức. Chức năng “xếp hàng chờ” tin được dùng để gửi nhiều tin tới một tác vụ. Về cơ bản “xếp hàng chờ” tin là một dãy các hộp tin. Các phiên bản RTOSs thương mại Hiện tại có khoảng hơn 100 nhà cung cấp RTOS. Sản phẩm RTOS này sử dụng cho dòng vi xử lý 8, 16, 32 bit. Một vài phiên bản RTOS là các gói hệ điều hành hoàn thiện có nhân thời gian thực bên trong, bộ quản lý vào/ra, hệ thống cửa sổ, một file hệ thống, mạng, thư viện giao tiếp ngôn ngữ, bộ debug và bộ biên dịch cross-platform (biên dịch qua nhiều cấu trúc nền khác nhau - vấn đề này sẽ được đề cập đến trong các bài viết sau). Giá của một RTOS dao động từ $100 cho đến hơn $10000. Khi có quá nhiều nhà cung cấp, vấn đề nan giải ở đây là quá trình lựa chọn. Hệ thống nhúng cỡ nhỏ Nhiều hệ thống nhúng cỡ nhỏ như hệ điều khiển máy, thiết bị thông minh, robot, máy tính công nghiệp, thiết bị ngoại vi và viễn thông đều có thể sử dụng tính năng ưu việt của RTOS. Thường các hệ thống này được thiết kế trên vi xử lý 8 bit. Với không gian địa chỉ lên tới 64Kbyte, hầu hết các dòng vi xử lý 8 bit không thể đáp ứng nhu cầu bộ nhớ của RTOS. Phiên bản nhân thương mại thường chỉ yêu cầu 1 Kbyte đến 3 Kbyte ROM. Một vài nhân thậm chí cho phép bạn chỉ rõ kích thước mỗi stack của từng tác vụ. Đặc tính này giúp giảm đáng kể lượng RAM cần cho ứng dụng của bạn. Có một nhầm lẫn về RTOS là nó thêm một lượng “không thể chấp nhận” khả năng quá tải trên CPU. Thực tế một RTOS sẽ chỉ yêu cầu từ 1% đến 4% tài nguyên CPU cho việc chuyển đổi giữa các tiện ích. Một số ưu điểm nổi bật của RTOS: - Giá thành thấp - Có độ trễ ngắt nhỏ - Thời gian thực hiện tất cả tiện ích của nhân xác định được - Có thể quản lý ít nhất 20 tác vụ - Sử dụng tối thiểu dịch vụ tiện ích - Cho phép tác vụ linh hoạt sinh ra và xóa đi - Cung cấp tiện ích quản lý mã hiệu - Cho phép trễ và quá thời gian trong tiện ích nhân Trong bài tiếp theo chúng ta sẽ khảo sát một lượt các phiên bản cũng như nhà cung cấp RTOS chính, để các bạn có khái niệm tổng quan về các hệ RTOS phổ biến trên thế giới.