Giới thiệu về hệ điều hành
Khái niệm hệ điều hành
Hệ thống máy tính bao gồm phần cứng như CPU, bộ nhớ chính và thiết bị nhập xuất, cùng với các chương trình ứng dụng như phần mềm dịch, hệ thống cơ sở dữ liệu, trò chơi và ứng dụng thương mại, tạo thành một cấu trúc phức tạp Để các ứng dụng hoạt động hiệu quả, chúng cần truy cập tài nguyên như RAM, bộ nhớ và thiết bị ngoại vi; do đó, máy tính được trang bị hệ điều hành, lớp phần mềm quản lý và phân phối tài nguyên.
Hệ điều hành (Operating System - OS) là phần mềm trung gian giữa người dùng và phần cứng máy tính, có nhiệm vụ quản lý và phân phối tài nguyên phần cứng, cũng như điều phối việc sử dụng phần cứng cho các ứng dụng khác nhau.
Phân loại hệ điều hành
Hệ điều hành gồm có:
Hệ điều hành xử lý theo lô đơn giản
Hệ điều hành xử lý theo lô đa chương
Hình 1 Sơ đồ hệ điều hành
Hệ thống chia sẻ thời gian
Hệ thống xử lý thời gian thực
2.1 Hệ điều hành xử lý theo lô đơn giản
Hệ thống xử lý theo lô thực hiện các công việc dựa trên các chỉ thị đã được sắp xếp trước, cho phép quá trình này diễn ra mà không cần sự can thiệp của lập trình viên, từ đó rút ngắn thời gian thực hiện.
Hệ thống xử lý theo lô có tốc độ CPU lên tới hàng GHz, nhanh hơn nhiều so với thiết bị ngoại vi, dẫn đến tình trạng tài nguyên CPU thường xuyên nhàn rỗi Để khắc phục vấn đề này, có hai phương pháp có thể áp dụng.
Hệ thống xử lý off_line sử dụng bộ lưu trữ trung gian để giảm tải cho CPU, cho phép CPU chỉ cần lấy dữ liệu từ bộ lưu trữ để xử lý và trả yêu cầu Các thiết bị ngoại vi sẽ thực hiện và xử lý các yêu cầu đó, trong khi CPU có thể tập trung vào các công việc khác Sau khi hoàn tất, CPU chỉ cần quay lại bộ lưu trữ để lấy dữ liệu đã được xử lý bởi các thiết bị ngoại vi.
Spool (viết tắt của simultaneous peripheral operation on-line) là quá trình đồng bộ hóa các thao tác ngoại vi trực tuyến thông qua một bộ Spooler Cơ chế này cho phép giao tiếp liên tục giữa CPU và các thiết bị ngoại vi mà không làm gián đoạn việc sử dụng CPU.
2.2 Hệ điều hành xử lý theo lô đa chương
Khi nhiều công việc đồng thời truy xuất lên thiết bị, việc lập lịch cho chúng trở nên rất quan trọng Yếu tố then chốt trong lập lịch là khả năng đa chương, cho phép tối ưu hóa hiệu suất sử dụng tài nguyên Đa chương giúp khai thác tối đa tần suất sử dụng thiết bị, nâng cao hiệu quả công việc.
3 dụng CPU, điều đó có nghĩa là CPU luôn được sử dụng qua lại bởi nhiều tiến trình
Hệ điều hành hoạt động bằng cách lưu trữ các công việc trong bộ nhớ, cho phép CPU thực hiện lần lượt từng phần công việc Khi có yêu cầu truy xuất thiết bị, CPU sẽ tiếp tục công việc tiếp theo mà không bị gián đoạn.
Hệ điều hành thông minh trong việc hỗ trợ người dùng ra quyết định, đồng thời xử lý hiệu quả các vấn đề liên quan đến lập lịch công việc, quản lý bộ nhớ và CPU.
2.3 Hệ thống chia sẻ thời gian
Hệ thống chia sẻ thời gian, hay còn gọi là hệ thống đa nhiệm, là một dạng của hệ đa chương Hệ thống này cho phép nhiều công việc được thực hiện đồng thời thông qua cơ chế chuyển đổi nhanh chóng của CPU, tương tự như hệ đa chương nhưng với thời gian chuyển đổi ngắn hơn.
Hệ thống chia sẻ được thiết kế để tối ưu hóa việc sử dụng tài nguyên của máy tính Hệ điều hành quản lý nhiều công việc, cho phép CPU thực hiện các nhiệm vụ không theo thứ tự mà xen kẽ giữa các chương trình Mỗi chương trình đang chạy được gọi là một tiến trình, và trong quá trình thực hiện, tiến trình này cần thao tác nhập xuất, trong khi CPU có thể xử lý một tiến trình khác Nhờ vào khả năng xử lý nhanh chóng của CPU, hệ điều hành chia sẻ cho phép nhiều người dùng sử dụng máy tính đồng thời, tạo cảm giác như các tiến trình đang hoạt động song song.
Hệ thống phân tán giống như hệ thống chia sẻ thời gian, nhưng khác ở chỗ mỗi bộ xử lý có vùng nhớ riêng và không chia sẻ bộ nhớ hay đồng hồ Các bộ xử lý này giao tiếp với nhau thông qua các mạng tốc độ cao.
Trong hệ thống phân tán, các bộ xử lý có kích thước và chức năng đa dạng, bao gồm máy vi tính, trạm làm việc, máy mini và hệ thống máy lớn Những bộ xử lý này thường được gọi bằng nhiều tên khác nhau như site, node hay computer, tùy thuộc vào trạng thái hoạt động của chúng.
Các nguyên nhân phải xây dựng hệ thống phân tán:
Hệ thống phân tán cho phép chia sẻ tài nguyên hiệu quả, xử lý thông tin trong cơ sở dữ liệu phân tán và hỗ trợ việc chia sẻ cũng như in ấn tập tin từ xa.
Tăng tốc độ tính toán: hệ thống phân tán chia nhỏ các thao tác tính toán để tính toán cùng một lúc
An toàn: một hệ thống hỏng thì không ảnh hưởng đến hộ thống còn lại
Thông tin liên lạc với nhau được dễ dàng: hệ thống giúp người dùng dễ dàng chuyển đổi dữ liệu từ vị trí này sang vị trị khác
Hệ thống song song tương tự như hệ thống phân tán, nhưng các bộ vi xử lý trong hệ thống song song chia sẻ bộ nhớ, dữ liệu, đồng hồ và thiết bị ngoại vi, nghĩa là chúng hoạt động cùng nhau trong cùng một không gian vật lý.
Với sự gia tăng số lượng bộ xử lý, tốc độ thực hiện công việc được cải thiện, nhưng không tỉ lệ thuận với số lượng bộ xử lý Điều này có nghĩa là việc có nhiều bộ xử lý không đảm bảo rằng công việc sẽ được hoàn thành nhanh hơn gấp n lần.
2.6 Hệ thống xử lý thời gian thực
Hệ thống điều hành thời gian thực được áp dụng khi có yêu cầu khắt khe về thời gian cho các thao tác của bộ xử lý hoặc dòng dữ liệu Để được coi là một hệ thống tốt, nó cần phải đảm bảo kết quả chính xác trong khoảng thời gian yêu cầu.
Có 2 hệ thống xử lý thời gian thực: [6]
Hệ thống xử lý thời gian thực cứng (hard real-time system): khi đó công việc phải được hoàn tất đúng lúc Các tiến trình không được
Chức năng của hệ điều hành
Một tiến trình là một chương trình đang được thực thi, được cấp phát tài nguyên như CPU, bộ nhớ, và thiết bị vào ra để thực hiện công việc Trong hệ thống, có cả tiến trình của hệ điều hành và của người dùng, cho phép nhiều tiến trình chạy đồng thời.
Hệ điều hành đóng vai trò quan trọng trong việc quản lý tiến trình của hệ thống và người dùng, bao gồm việc tạo, hủy, tạm dừng hoặc tiếp tục các tiến trình Ngoài ra, nó còn cung cấp cơ chế đồng bộ, giao tiếp và kiểm soát tình trạng deadlock giữa các tiến trình.
3.2 Quản lý bộ nhớ chính
Trong hệ thống máy tính, mọi thao tác và xử lý đều phải thông qua bộ nhớ, nơi mỗi phần tử có một địa chỉ giúp CPU truy xuất dữ liệu nhanh chóng Để thực thi, chương trình cần được ánh xạ thành địa chỉ tuyệt đối và đưa vào bộ nhớ chính Khi chương trình thực thi, hệ thống sẽ truy xuất các chỉ thị và dữ liệu từ bộ nhớ chính Dữ liệu sẽ vẫn tồn tại trong bộ nhớ cho đến khi một tiến trình khác ghi chồng lên, ngay cả khi tiến trình trước đó đã kết thúc.
Hệ điều hành đóng vai trò quan trọng trong việc quản lý bộ nhớ, bao gồm việc lưu trữ các vị trí đã được tiến trình sử dụng Khi bộ nhớ khả dụng, hệ điều hành quyết định tiến trình nào sẽ được nạp vào bộ nhớ chính và có khả năng cấp phát hoặc thu hồi bộ nhớ khi cần thiết.
3.3 Quản lý bộ nhớ phụ
Ngoài bộ nhớ chính, hệ thống máy tính còn cần bộ nhớ phụ để lưu trữ dữ liệu và chương trình lớn, đặc biệt khi dữ liệu có thể mất khi không có nguồn điện Hệ điều hành đóng vai trò quan trọng trong việc định vị và quản lý bộ nhớ phụ.
3.4 Quản lý hệ thống tập tin
Mỗi thiết bị lưu trữ thông tin của máy tính đều có bộ kiểm soát và các tính chất riêng như tốc độ truyền dữ liệu, khả năng lưu trữ và cách truy xuất Hệ điều hành cung cấp cái nhìn logic đồng nhất về hệ thống lưu trữ, giúp người dùng dễ dàng sử dụng máy tính Nó tạo ánh xạ từ tập tin đến vùng thông tin trên đĩa và truy xuất các tập tin thông qua thiết bị lưu trữ Tập tin có thể là chương trình hoặc dữ liệu, với nội dung có thể là số, ký số hoặc ký tự.
Hệ điều hành có vai trò quan trọng trong việc tạo và xóa các tập tin hoặc thư mục, đồng thời hỗ trợ các thao tác liên quan Ngoài ra, hệ điều hành cũng thực hiện việc ánh xạ và sao lưu các tập tin trên hệ thống lưu trữ phụ, đảm bảo an toàn cho dữ liệu.
3.5 Quản lý hệ thống vào ra
Hệ thống vào ra bao gồm các thành phần quản lý bộ nhớ, giao tiếp điều khiển thiết bị và bộ điều khiển cho các thiết bị cụ thể Mỗi thiết bị có cấu trúc riêng mà chỉ bộ điều khiển tương ứng mới hiểu được Để tăng tính thân thiện và dễ sử dụng cho người dùng, hệ điều hành cung cấp một lớp trừu tượng, giúp che giấu những cấu trúc đặc thù của phần cứng.
Hệ điều hành sử dụng cơ chế bảo vệ để quản lý quyền truy cập vào tài nguyên như tập tin, CPU và bộ nhớ, đảm bảo rằng chỉ những tiến trình có quyền mới có thể truy xuất chúng Cơ chế này cũng nâng cao độ an toàn bằng cách kiểm tra lỗi trong giao tiếp giữa các hệ thống nhỏ bên trong.
3.7 Hệ thống thông dịch lệnh
Hệ thống thông dịch lệnh là cầu nối giữa người dùng và hệ điều hành, cho phép giao tiếp hiệu quả Mỗi hệ điều hành sử dụng các phương thức giao tiếp khác nhau, chẳng hạn như cơ chế dòng lệnh hoặc biểu tượng Những lệnh này không chỉ giúp tạo ra và quản lý các tiến trình mà còn kiểm soát hoạt động của hệ thống.
8 nhập xuất, quản lý bộ nhớ chính, quản lý bộ lưu trữ phụ, truy xuất hệ thống tập tin và cơ chế bảo vệ.
Tính chất của hệ điều hành
Hệ điều hành đáng tin cậy cung cấp các công cụ kiểm tra tính chính xác của dữ liệu trong lưu trữ và xử lý, đảm bảo thông tin được cung cấp cho người dùng là hoàn toàn chính xác Khi phát hiện lỗi, hệ điều hành sẽ ngừng xử lý và chuyển quyền quyết định cho người dùng.
Hệ điều hành đóng vai trò quan trọng trong việc bảo vệ chương trình và dữ liệu khỏi sự thay đổi hoặc xóa nhầm, đặc biệt trong các hệ thống đa nhiệm Để đảm bảo an toàn, các tài nguyên cần có những yêu cầu riêng biệt, giúp tổ chức và quản lý hiệu quả hơn.
Để đảm bảo hiệu quả trong hệ thống, các tài nguyên cần được khai thác triệt để, cho phép xử lý các yêu cầu phức tạp ngay cả trong điều kiện tài nguyên hạn chế Một yếu tố quan trọng là duy trì sự đồng bộ trong toàn bộ hệ thống, tránh để các thiết bị chậm làm trì hoãn hoạt động chung.
Hệ điều hành cần có tính kế thừa để duy trì và phát triển người dùng, đồng thời phải có khả năng thích ứng với những thay đổi Điều này không chỉ giúp hệ điều hành tồn tại mà còn là yếu tố quan trọng trong việc thu hút và giữ chân người dùng.
Hệ thống cần phải dễ sử dụng, với hiệu quả khác nhau tùy thuộc vào kinh nghiệm và kiến thức của người dùng Việc cung cấp trợ giúp chi tiết sẽ hỗ trợ người dùng tự đào tạo trong quá trình khai thác, nâng cao hiệu quả sử dụng.
Hệ điều hành thời gian thực
Khái niệm hệ điều hành thời gian thực
Hệ điều hành thời gian thực (RTOS) được thiết kế để xử lý dữ liệu cho các ứng dụng thời gian thực với độ trễ gần như không có Điều này cho phép mọi yêu cầu về thời gian, bao gồm cả độ trễ của hệ điều hành, được xử lý nhanh chóng, thường chỉ trong phần mười giây hoặc ngắn hơn.
Hệ thống thời gian thực có ràng buộc thời gian cố định và rõ ràng, và sẽ gặp lỗi nếu không tuân thủ các ràng buộc này Các hệ thống này hoạt động theo hai phương thức chính: hướng sự kiện và chia sẻ thời gian Tùy thuộc vào mức độ ưu tiên, các tác vụ sẽ được chuyển đổi trong hệ thống hướng sự kiện, trong khi hệ thống chia sẻ thời gian sử dụng ngắt đồng hồ để thực hiện việc này Hầu hết các hệ điều hành thời gian thực áp dụng thuật toán lập lịch trước để quản lý tác vụ.
Cấu trúc hệ điều hành thời gian thực
Hệ điều hành thời gian thực bao gồm hai thành phần chính: nhân (kernel) và các chương trình hệ thống Cấu trúc của hệ điều hành này được thể hiện rõ trong Hình 3.
Nhân là phần cốt lõi của hệ điều hành, có nhiệm vụ hỗ trợ các bộ quản lý quá trình, tài nguyên, lập lịch và nhập xuất Nó thực hiện chức năng lập lịch, đồng bộ hóa và bảo vệ hệ thống khỏi lỗi, đồng thời xử lý các ngắt Chức năng chính của nhân là điều khiển phần cứng, bao gồm các thanh ghi điều khiển và bộ định thời gian, cũng như nạp phần mềm điều khiển thiết bị để cung cấp tiện ích chung Nhân phối hợp các hoạt động vào ra, đảm bảo mọi phần của hệ thống hoạt động ổn định và thống nhất.
Hình 3 Cấu trúc hệ điều hành thời gian thực.
Các đặc điểm của RTOS
Các hệ điều hành thời gian thực phổ biến hiện nay bao gồm Windows, Mac OS và Unix Chúng được sử dụng trong nhiều lĩnh vực như bộ định tuyến, chuyển mạch mạng, động cơ xe, điện thoại di động, thiết bị y tế, thiết bị đo lường và nhiều ứng dụng khác.
Hệ nhúng thời gian thực yêu cầu nghiêm ngặt về thời gian, quản lý nguồn tài nguyên và lập lịch, do đó cần sử dụng hệ điều hành thời gian thực (RTOS) để phát triển RTOS hoạt động như các thư viện, cho phép thêm bớt dịch vụ phù hợp với ứng dụng, giúp phát triển ứng dụng thời gian thực nhanh chóng và tin cậy hơn Điểm nổi bật của RTOS là tính độc lập với ứng dụng; khi một chương trình gặp lỗi hoặc hoạt động không hợp lệ, RTOS sẽ ngay lập tức cô lập chương trình đó, kích hoạt cơ chế phục hồi và bảo vệ các chương trình khác cũng như chính hệ điều hành khỏi các hậu quả sai lệch.
Tình trạng tràn bộ nhớ do bất kỳ chương trình nào sẽ kích hoạt cơ chế bảo vệ tương tự RTOS có hai dạng: cứng và mềm Nếu tính năng xử lý không diễn ra hoặc không đủ nhanh, RTOS cứng sẽ chấm dứt hoạt động đó để đảm bảo độ tin cậy và tính sẵn sàng của phần còn lại của hệ thống.
Hệ điều hành thời gian thực (RTOS) có cấu trúc mềm dẻo, cho phép tích hợp linh hoạt các tác vụ theo mô hình vòng tròn đồng tâm Vòng tròn trung tâm đại diện cho các đặc tính quan trọng nhất của RTOS, trong khi các vòng ngoài có thể được thêm vào để thể hiện các đặc điểm bổ sung khi cần thiết Vòng trong phù hợp cho ứng dụng với bộ xử lý nhỏ, trong khi các vòng ngoài hỗ trợ xây dựng hệ thống thời gian thực lớn hơn RTOS cũng quản lý mức xử lý, ưu tiên thực hiện các công việc có mức độ ưu tiên cao hơn.
Ngoài các chức năng của hệ điều hành như trên, hệ điều hành thời gian thực còn hỗ trợ thêm các chức năng khác như:
Lập lịch phân chia thời gian sử dụng tài nguyên, đặt mức ưu tiên các tác vụ
Truyền thông và đồng bộ giữa các tác vụ hoặc giữa tác vụ và ngắt
Phân phối bộ nhớ động
Quản lý các thiết bị vào ra
Hình 4 Sơ đồ chức năng của hệ điều hành thời gian thực
Phân loại hệ điều hành thời gian thực
4.1 Hệ điều hành thời gian thực cho mục đích thương mại
Các hệ điều hành này có thể kể tên như: Windows CE, PDOS, VxWorks, Nulceus, ERCOS, QNX… Những hệ điều hành này có đặc điểm:
Không có bộ nhớ ảo, có khả năng cố định mã, dữ liệu trong bộ nhớ
Đáp ứng được tốc độ chuyển ngữ cảnh nhanh
Hệ thống đa tác vụ và chuẩn giao tiếp diễn ra liền mạch
Các sự kiện, mailbox, tín hiệu và đèn báo được định nghĩa rõ ràng, giúp cho việc phát triển ứng dụng nhúng thời gian thực Những hệ điều hành này cung cấp các đặc tả chi tiết và công cụ hỗ trợ, cho phép thực hiện các ràng buộc thời gian thực một cách hiệu quả.
Giới hạn thời gian làm việc
Đồng hồ thời gian thực
Cung cấp xử lý độ trễ, kích hoạt hoặc treo việc thực hiện
Lập lịch những thứ tự sẽ ưu tiên
Hỗ trợ hàng đợi thời gian thực
Cảnh báo thời gian quá hạn
4.2 Hệ điều hành thời gian thực với mục đích nghiên cứu
Các hệ điều hành thuộc dạng có thể kể đến: MARUTI, CHAOS, ARTS, MARS, SPRING, DARK… Đặc điểm của các hệ điều hành này là:
Hỗ trợ khả năng chịu lỗi
Hỗ trợ đồng bộ thời gian thực
Hỗ trợ thuật toán lập lịch thời gian thực, thuật toán phân tích thời gian
Điểm mạnh là khả năng dự đoán
4.3 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
Mặc dù các hệ điều hành này chậm hơn và có khả năng dự đoán kém hơn so với các hệ điều hành thương mại, nhưng chúng lại sở hữu nhiều chức năng và môi trường phát triển tốt hơn nhờ vào các giao tiếp chuẩn và thân thiện.
Một số hệ điều hành thời gian thực phổ biến
5.1 RTX51- Real Time Operating System
Hệ điều hành thời gian thực RTX51 là một giải pháp đa tác vụ lý tưởng cho vi điều khiển 8051, được thiết kế đơn giản nhưng hiệu quả cho các phần mềm phức tạp yêu cầu độ chính xác về thời gian RTX51 nổi bật với các công cụ mạnh mẽ để quản lý các tác vụ, giúp tối ưu hóa hiệu suất hệ thống Hệ điều hành này hiện có 2 phiên bản để đáp ứng nhu cầu khác nhau của người dùng.
RTX51 Full hỗ trợ chuyển tác vụ và chuyển mạch xoay vòng với 4 mức ưu tiên, cho phép hoạt động song song với các hàm ngắt Hệ thống mailbox và semaphore được sử dụng để chuyển các thông điệp và tín hiệu Hàm os_wait của RTX51 có khả năng chờ đợi cho nhiều sự kiện khác nhau như time out, ngắt, semaphore và thông điệp từ tác vụ hoặc ngắt.
RTX51 Tiny có khả năng hoạt động trên chip không cần bộ nhớ dữ liệu ngoài, nhưng các chương trình sử dụng nó vẫn có thể truy cập bộ nhớ ngoài Là một phần của RTX51 Full, RTX51 Tiny hỗ trợ chuyển mạch xoay vòng giữa các tác vụ, hoạt động song song với các hàm ngắt và cho phép chuyển các thông điệp Hàm os_wait trong RTX51 có thể chờ đợi các sự kiện như tín hiệu từ tác vụ hoặc ngắt, cũng như thời gian chờ.
5.2 ARTX-Advanced Real Time Operating System
Hệ điều hành thời gian thực ARTX Kernel hỗ trợ phát triển ứng dụng đa nhiệm, cho phép thực hiện nhiều tác vụ đồng thời Nó dễ dàng tích hợp và làm việc với các vi điều khiển thuộc họ ARM.
ARTX Kernel áp dụng lập lịch linh hoạt cho các nguồn dữ liệu hệ thống như CPU và bộ nhớ, nhằm tối ưu hóa giao tiếp giữa các tác vụ Hệ điều hành này được phát triển bằng các hàm chuẩn cùng với bộ biên dịch C và Keil TM CARM Ngoài ra, ngôn ngữ C cung cấp sự đa dạng trong cấu hình, cho phép khai báo các tác vụ một cách dễ dàng mà không cần sử dụng các stack phức tạp.
Mô tả ARTX Kernel RTX51
Số tác vụ Tối đa 256 Tối đa 32
Số tín hiệu 16 sự kiện/tác vụ Tối đa 32
Số mailbox Không giới hạn Không hỗ trợ
Số semaphore Không giới hạn Không hỗ trợ
Số bộ định thời Không giới hạn Không hỗ trợ
Yêu cầu về RAM Tối thiểu 500 Byte 8 + 4 * Số byte của các tác vụ Yêu cầu phần cứng Một bộ định thời trên chip Một bộ định thời trên chip
Yêu cầu về mã ≤ 4 KByte ≥ 1.5 KByte
Các mức ưu tiên tác vụ 1-255 Không hỗ trợ
Thời gian chuyển ngữ ≤ 25àsec 40-100 àsec
Bảng 1 So sánh ARTX và RTX
QNX Neutrino được thiết kế để tương thích với API chuẩn POSIX cho thời gian thực, cho phép thay đổi kích thước rất nhỏ Hệ điều hành này hỗ trợ lập lịch các tiến trình theo thứ tự ưu tiên và có khả năng chạy đồng thời nhiều tác vụ.
QNX Neutrino là một hệ điều hành linh hoạt, cho phép người dùng dễ dàng tùy chỉnh để phù hợp với các ứng dụng cụ thể của họ, bắt đầu từ một cấu hình cơ bản.
15 nhân nhỏ kết hợp 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 của QNX đảm bảo cách ly bộ nhớ các process, không cho chúng sơ ý phá hoại lẫn nhau
Giao tiếp liên quá trình dựa trên thông điệp
Hệ điều hành thời gian thực àC/OS có độ tương thích cao, chức năng ưu tiên, tính mềm dẻo và khả năng chạy đồng thời nhiều tác vụ àC/OS sở hữu nhiều tính năng nổi bật.
Đồng bộ và chia sẻ dữ liệu giữa các tác vụ
Các thiết bị xuất nhập
Mạng àC/OS hỗ trợ nhiều bộ vi xử lý và có thiết kế gọn nhẹ, phù hợp cho nhiều hệ thống nhịp nhàng Phiên bản cao hơn của àC/OS còn bổ sung tính năng gọn tên cho mỗi đối tượng, cho phép người dùng đặt tên cho các tác vụ, đốn bỏo, mailbox, hàng chờ, nhóm sự kiện hoặc vùng bộ nhớ Khi bộ phát hiện lỗi phát hiện sự cố, nó sẽ hiển thị tên đối tượng, giúp người dùng dễ dàng đọc và hiểu thông tin liên quan.
Hệ điều hành thời gian thực FreeRTOS
FreeRTOS là gì?
Thương mại hoá Chuẩn IEC 61508
FreeRTOS, được nghiên cứu và phát triển bởi Richard Barry, ra mắt lần đầu vào năm 2003 với tên gọi FRTOS07 Hệ điều hành này hiện đang dẫn đầu thị trường về thời gian thực, dành cho các bộ vi điều khiển và bộ vi xử lý nhỏ Nhờ vào độ tin cậy cao, khả năng truy cập và dễ sử dụng, FreeRTOS đã trở thành lựa chọn phổ biến trong cộng đồng lập trình hệ thống nhúng Hệ điều hành này có hai phiên bản khác nhau.
OpenRTOS: là phiên bản FreeRTOS được thương mại hóa, cấp phép bởi bên thứ 3
SafeRTOS là phiên bản chia sẻ mô hình tương tự như FreeRTOS, nhưng được phát triển để đáp ứng các tiêu chuẩn an toàn quốc tế.
FreeRTOS là hệ điều hành thời gian thực miễn phí, hỗ trợ cả trong các ứng dụng thương mại theo giấy phép nguồn mở MIT Nó bao gồm nhân và thư viện được phát triển để phục vụ đa dạng lĩnh vực công nghiệp Với giấy phép MIT, người dùng không cần phải khai báo quyền sở hữu trí tuệ khi sử dụng FreeRTOS.
FreeRTOS là một nhân thời gian thực cho phép xây dựng các ứng dụng nhúng dựa trên thời gian thực cứng Nó tổ chức các ứng dụng thành các luồng thực thi độc lập, mặc dù trên bộ xử lý một lõi chỉ có thể thực thi một luồng tại một thời điểm Nhân của FreeRTOS quyết định luồng nào sẽ được thực thi.
Hình 6 Hai phiên bản của FreeRTOS
Các luồng trong ứng dụng sẽ được thực thi dựa trên mức độ ưu tiên do người dùng gán Để đơn giản hóa, nhà thiết kế có thể đặt mức ưu tiên cao hơn cho các luồng yêu cầu thời gian thực cứng và mức ưu tiên thấp hơn cho các luồng yêu cầu thời gian thực mềm Cách này đảm bảo rằng các luồng thời gian thực cứng luôn được thực hiện trước các luồng thời gian thực mềm.
FreeRTOS được quản lý chất lượng chặt chẽ, đảm bảo tuân thủ các tiêu chuẩn về mã hóa phần mềm và giao diện, cũng như quy trình thực hiện.
FreeRTOS không bao giờ thực hiện một hoạt động không xác định, chẳng hạn như bỏ qua danh sách được liên kết, trong một phần tới hạn hoặc ngắt
FreeRTOS triển khai bộ định thời phần mềm hiệu quả, tối ưu hóa việc sử dụng CPU bằng cách chỉ hoạt động khi cần bảo trì Điều này giúp giảm thiểu tài nguyên và không yêu cầu các biến phải được đếm về 0.
Tương tự như vậy, danh sách các tác vụ bị chặn cũng không yêu cầu thời gian bảo trì định kỳ
Cho phép báo hiệu tác vụ một cách nhanh chóng thông qua thông báo tác vụ (task notification), phương pháp này không tiêu tốn RAM và có thể áp dụng cho hầu hết các tác vụ nội bộ cũng như trong các tình huống ngắt báo hiệu tác vụ.
Hàng đợi FreeRTOS sử dụng mô hình quản lý để kết hợp tính đơn giản với tính linh hoạt (trong kích thước mã nhỏ)
Hàng đợi FreeRTOS là nguyên hàm cơ sở cho các nguyên tắc giao tiếp và đồng bộ hóa, giúp giảm kích thước mã tổng thể và hỗ trợ kiểm tra, đảm bảo độ bền Sau gần hai mươi năm phát triển, FreeRTOS ngày càng trở nên phổ biến nhờ những ưu điểm vượt trội.
Được phát triển dựa trên ngôn ngữ lập trình C nên phù hợp với nhiều công cụ phát triển khác nhau
Có nhiều tính năng đa dạng và vẫn đang tiếp tục được phát triển
ROM và RAM có dung lượng rất nhỏ Thông thường, hình ảnh nhị phân RTOS kernel sẽ nằm trong khoảng 6K đến 12K byte
Lõi của RTOS kernel được lưu trữ trong ba file C, và hầu hết các file trong tệp zip có thể dễ dàng tải xuống, phù hợp với nhiều ứng dụng khác nhau.
Miễn phí ngay cả khi người dùng sử dụng cho mục đích thương mại
Có số lượng người dùng đông đảo và ngày càng phát triển
Mỗi port đều có những ví dụ về cách cài đặt cấu hình phù hợp, những ví dụ này chỉ cần tải về và biên dịch lại
Cung cấp nhiều tài liệu hướng dẫn
FreeRTOS là một giải pháp xử lý thời gian thực nhỏ gọn và dễ sử dụng, thích hợp cho các ứng dụng thay thế eCOS, Linux nhúng hoặc Real Time Linux.
Dưới đây là danh sách cụ thể những vi điều khiển hoặc trình dịch đã có thể port FreeRTOS cho đến thởi điểm hiện tại
Phần cứng Bộ xử lý được hỗ trợ port Công cụ hỗ trợ
Altera Cyclone V SoC (ARM Cortex-
Altera SoC EDS (ARM DS-
5 với GCC), Nios II IDE với GCC
ARMv8-M ARM Cortex-M33 simulator GCC (ARMclang xây dựng
SAM3 (ARM Cortex-M3), SAM4 (ARM Cortex-M4 ), SAMD20 (ARM Cortex-M0+), SAMA5 (ARM Cortex-A5), SAM7 (ARM7), SAM9 (ARM9), AT91, AVR và AVR32 UC3
IAR, GCC, Keil, Rowley CrossWorks
Cadence Tensilica Xtensa XCC với Xtensa Xplora
Cortus APS3 Cortus IDE với GCC
Cypress PSoC 5 ARM Cortex-M3 GCC, ARM Keil và RVDS
– tất cả có trong PSoC Creator IDE
Coldfire V2, Coldfire V1, other Coldfire families, HCS12, PPC405 & PPC440 (mô hình bộ nhớ nhỏ và giới hạn),
Fujitsu FM3 ARM Cortex-M3, 32bit
(ví dụ MB91460) và 16bit (ví dụ MB96340 16FX)
Tất cả Luminary Micro ARM Cortex-M3 và ARM Cortex-M4 dựa trên vi điều khiển Stellaris
Keil, IAR, Code Red, CodeSourcery GCC, Rowley CrossWorks
Microchip PIC32MX, PIC32MZ,
PIC32MZ EF, PIC24, PIC24EP, dsPIC, MEC14xx, CEC13xx, CEC17xx, MEC17xx, MEC51xx
IAR, Keil, SoftConsole (GCC with Eclipse) NEC V850 (32bit), 78K0R (16bit) IAR
LPC55S6x(ARM Cortex-M33), LPC1500 (ARM Cortex-M3), LPC1700 (ARM Cortex-M3), LPC1800 (ARM Cortex-M3), LPC1100 (ARM Cortex-M0), LPC2000 (ARM7), LPC4000 (ARM Cortex-M4F/ ARM Cortex-M0)
GCC, Rowley CrossWorks, IAR, Keil, LPCXpresso IDE, Eclipse, MCUXpresso IDE
Cortex-A9), RZ/T, RX700 / RX71M, RX600 / RX64M / RX62N / RX63N / RX65N, RX200, RX100, SuperH, RL78, H8/S
GCC, e2 studio, IAR Embedded Workbench, HEW
SiFive RISC-V RV32 Freedom Studio (GCC),
Silicon Labs EFM32 Gecko (Cortex-M3 và
Simplicity Studio (GCC), IAR, SDCC
Spansion FM3 ARM Cortex-M3, 32bit
(ví dụ MB91460) và 16bit (ví dụ MB96340 16FX)
ARM Cortex-M7, ARM Cortex-M3 và ARM Cortex- M4F), STR7 (ARM7), STR9 (ARM9)
IAR, Atollic TrueStudio, GCC, Keil, Rowley CrossWorks
TI RM48, TMS570, ARM Cortex-
M4F MSP432, MSP430, MSP430X, SimpleLink, Stellaris (ARM Cortex-M3, ARM Cortex-M4F)
Rowley CrossWorks, IAR, GCC, Code Composer Studio
MPSoC (64-bit ARM Cortex- A53 and 32-bit ARM Cortex- R5), Microblaze, PPC405 chạy trên Virtex4 FPGA, PPC440 chạy trên Virtex5 FPGA
Intel/x86 IA32 và Quark SoC X1000 đều sử dụng mô hình bộ nhớ tuyến tính 32-bit, cho phép tương thích với x86 chỉ hoạt động ở chế độ Real Ngoài ra, còn có phiên bản Win32 port hỗ trợ cho các ứng dụng và hệ thống 32-bit.
GCC, Visual Studio 2010 Express, MingW, Open Watcom, Borland, Paradigm
Các port này được cung cấp trên mạng, và không được hỗ trợ trực tiếp
Bảng 2 Những trình dịch được hỗ trợ port.
Những khái niệm cơ bản trong hệ điều hành thời gian thực
Trong phần 2 này, chúng ta sẽ đến với một số khái niệm cơ bản nhất của hệ điều hành thực nói chung cũng như FreeRTOS nói riêng
2.1 Tác vụ và các trạng thái tác vụ
Trong FreeRTOS, các khối cơ bản của phần mềm là các tác vụ (task), cho phép cấu trúc ứng dụng thời gian thực như một tập hợp các tác vụ độc lập Mỗi tác vụ hoạt động trong bối cảnh riêng mà không phụ thuộc vào các tác vụ khác hoặc bộ lập lịch RTOS Chỉ một tác vụ có thể thực thi tại một thời điểm, và bộ lập lịch RTOS quyết định tác vụ nào được thực hiện Điều này cho phép bộ lập lịch liên tục khởi động và dừng từng tác vụ khi ứng dụng chạy Để bắt đầu các tác vụ, chúng ta thực hiện một hoặc nhiều lời gọi hàm trong FreeRTOS, với mỗi tác vụ có 4 trạng thái chính.
Hình 7 Trạng thái của các tác vụ
Chạy (Running) là trạng thái mà bộ xử lý thực hiện một tác vụ cụ thể Mỗi bộ xử lý chỉ có khả năng xử lý một tác vụ tại một thời điểm nhất định.
Khi một tác vụ ở trạng thái Sẵn sàng, điều này có nghĩa là nó đã sẵn sàng để thực thi, nhưng không thể thực hiện do có một tác vụ khác đang ở trạng thái Chạy với mức độ ưu tiên cao hơn hoặc bằng nhau.
Khi một tác vụ ở trạng thái Bị chặn, nó không thể chuyển sang trạng thái Running mặc dù bộ xử lý đang ở trạng thái nghỉ Tình trạng này xảy ra khi tác vụ đang chờ một sự kiện bên ngoài để kích hoạt nó về trạng thái Ready Ví dụ, khi một tác vụ gọi vTaskDelay(), nó sẽ bị chặn cho đến khi hết thời gian delay Ngoài ra, tác vụ cũng có thể bị chặn để chờ queue, semaphore, event group, notification hoặc semaphore event Các tác vụ ở trạng thái Bị chặn thường có thời gian chờ, sau đó chúng sẽ được bỏ chặn khi hết thời gian.
Các tác vụ ở trạng thái Blocked không tiêu tốn thời gian xử lý và không được chuyển sang trạng thái Running, ngay cả khi sự kiện mà tác vụ đang chờ không xảy ra.
Tình trạng Suspended (Treo) tương tự như trạng thái Blocked, cho phép các tác vụ chuyển sang trạng thái Running Tuy nhiên, khác với các tác vụ Blocked, các tác vụ Suspended không có thời gian chờ (timeout) và chỉ có thể được chuyển vào hoặc thoát khỏi trạng thái này thông qua các lệnh API vTaskSuspend() và xTaskResume().
Mỗi tác vụ trong FreeRTOS được gán mức ưu tiên từ 0 đến 1, với configMAX_PRIORITY được xác định trong FreeRTOSConfig.h Nếu port sử dụng cơ chế chọn tác vụ tối ưu hóa với lệnh “count leading zeros” và configUSE_PORT_OPTIMISED_TASK_SELECTION được đặt thành 1, thì mức cấu hình không vượt quá 32 Trong các trường hợp khác, configMAX_PRIORITY có thể nhận bất kỳ giá trị nào, nhưng để tiết kiệm RAM, nên giữ ở mức tối thiểu.
Số ưu tiên thấp tượng trưng cho các tác vụ có ưu tiên thấp Tác vụ nhàn rỗi có mức độ ưu tiên bằng không (tskIDLE_PRIORITY)
Bộ lập lịch FreeRTOS đảm bảo rằng tất cả các tác vụ ở trạng thái Ready hoặc Run đều được sử dụng CPU, bao gồm cả những tác vụ có mức độ ưu tiên thấp hơn trong cùng trạng thái sẵn sàng.
Khi configUSE_TIME_SLICING không được xác định hoặc được đặt thành 1, các tác vụ trạng thái Ready có cùng mức độ ưu tiên sẽ chia sẻ thời gian xử lý có sẵn bằng cách phân chia thời gian đó.
Co-routine được thiết kế cho các thiết bị nhỏ với hạn chế về RAM và thường không áp dụng cho bộ vi điều khiển 32 bit Tuy nhiên, việc sử dụng co-routine trong lĩnh vực này hiện nay rất hiếm Mặc dù không có kế hoạch loại bỏ co-routine khỏi mã, nhưng việc phát triển chúng cũng gặp khó khăn.
Các co-routine tương tự như các tác vụ nhưng có những khác biệt cơ bản sau:
Sử dụng stack cho phép tất cả các co-routine trong một ứng dụng chia sẻ chung một bộ nhớ, từ đó giảm đáng kể lượng RAM tiêu thụ so với các ứng dụng tương tự được xây dựng bằng tác vụ.
Co-routine sử dụng lập lịch hợp tác để ưu tiên các co-routine khác, đồng thời có thể tích hợp trong ứng dụng với các tác vụ được ưu tiên.
Triển khai marco: Việc thực hiện co-routine được cung cấp thông qua một tập hợp các macro
Ít khi sử dụng: Việc giảm mức sử dụng RAM đi kèm với chi phí về việc làm thế nào để có thể cấu trúc được co-routine
Một co-routine có thể ở một trong ba trạng thái: Chạy, Sẵn sàng và Bị chặn Trạng thái Chạy diễn ra khi co-routine đang thực thi và sử dụng bộ xử lý Trong khi đó, co-routine ở trạng thái Sẵn sàng là những co-routine có khả năng thực thi nhưng hiện tại không đang hoạt động Một co-routine có thể ở trạng thái Sẵn sàng vì nhiều lý do khác nhau.
Một co-routine khác có mức độ ưu tiên bằng hoặc cao hơn đã ở trạng thái Chạy
Một tác vụ có thể ở trạng thái Chạy khi ứng dụng sử dụng cả tác vụ và co-routine Co-routine sẽ bị chặn nếu đang chờ một sự kiện tạm thời hoặc sự kiện bên ngoài, như khi gọi crDELAY() Khi đó, co-routine sẽ không khả dụng cho bộ lập lịch cho đến khi hết thời gian trì hoãn.
Hình 8 Trạng thái của các co-routine
Hiện tại không có co-routine tương đương với trạng thái Treo (Suspeded) như của tác vụ
Each co-routine is assigned a priority level ranging from 0 to 1, defined by configMAX_CO_ROUTINE_PRIORITY This parameter is specified in FreeRTOSConfig.h and can be configured based on the application's requirements.
Số ưu tiên thấp tượng trưng cho các co-routine có ưu tiên thấp
Giới thiệu về một số tính năng cơ bản
Hàng đợi là cách thức chính để các tác vụ tương tác với nhau hoặc các ngắt
Hàng đợi là cấu trúc dữ liệu cho phép các tác vụ tương tác với nhau, trong đó chứa một số lượng giới hạn các mục dữ liệu có kích thước cố định Chiều dài của hàng đợi, tức số lượng mục dữ liệu tối đa mà nó có thể chứa, được xác định khi hàng đợi được tạo ra, cùng với kích thước của từng mục dữ liệu.
Mô hình hàng đợi kết hợp tính đơn giản và linh hoạt, cho phép tin nhắn được gửi qua hàng đợi bằng cách sao chép dữ liệu thay vì chỉ lưu trữ tham chiếu Phương pháp này tối ưu vì các tin nhắn nhỏ, như số nguyên và cấu trúc nhỏ, có thể được gửi trực tiếp vào hàng đợi mà không cần phân bổ bộ đệm, giúp tiết kiệm tài nguyên Ngoài ra, tin nhắn cũng có thể được đọc từ hàng đợi trực tiếp vào các biến C.
Phương pháp này cho phép gửi tác vụ ngay lập tức ghi đè lên biến hoặc bộ đệm đã được gửi đến hàng đợi, ngay cả khi tin nhắn vẫn còn trong hàng đợi Dữ liệu trong biến đã được sao chép vào hàng đợi, do đó, biến đó vẫn có sẵn để sử dụng lại.
Hàng đợi hoạt động theo nguyên tắc First In First Out (FIFO), nơi dữ liệu được thêm vào cuối hàng và xóa từ đầu hàng Cơ chế này được minh họa rõ ràng qua Hình 11.
Hình 11 Cơ chế hoạt động của queue
Mutexes là một loại đặc biệt của binary semaphores, tích hợp cơ chế thừa kế mức độ ưu tiên Chúng thường được sử dụng để thực hiện đồng bộ hóa giữa các tác vụ hoặc giữa các luồng trong lập trình đa nhiệm.
31 các tác vụ và một ngắt), thì các mutexes thường dùng để loại trừ lẫn nhau (mutial exclution)
Khi được sử dụng để loại trừ lẫn nhau, mutex hoạt động giống như một
"Token" được sử dụng để bảo vệ tài nguyên, yêu cầu các tác vụ phải có "token" trước khi truy cập Sau khi hoàn thành việc truy cập, tác vụ cần trả lại "token" để cho phép các tác vụ khác có thể sử dụng tài nguyên đó.
Mutexes sử dụng các hàm API để truy cập semaphore, cho phép người dùng chỉ định thời gian chặn Thời gian chặn xác định số lượng tối đa mà một mutex có thể chờ đợi để được cấp phát.
Khi một tác vụ cố gắng lấy một mutex không có sẵn, nó sẽ vào trạng thái Blocked Khác với binary semaphores, mutexes áp dụng quyền thừa kế mức độ ưu tiên, nghĩa là nếu tác vụ có ưu tiên cao cố gắng truy cập mutex đang bị giữ bởi tác vụ ưu tiên thấp hơn, mức độ ưu tiên của tác vụ đó sẽ tạm thời được nâng lên Cơ chế này giúp giảm thiểu thời gian mà tác vụ ưu tiên cao bị chặn, từ đó hạn chế tình trạng đảo ngược ưu tiên Tuy nhiên, quyền thừa kế không hoàn toàn khắc phục được vấn đề đảo ngược ưu tiên, mà chỉ làm giảm tác động của nó trong một số trường hợp Do đó, các ứng dụng thời gian thực cứng cần được thiết kế để ngăn chặn tình trạng đảo ngược ưu tiên ngay từ đầu.
Hình 12 Cơ chế hoạt động của Mutex
3.3 Semaphore nhị phân (Binary semaphores)
Semaphores nhị phân và mutexes đều có những điểm tương đồng, nhưng chúng cũng có những khác biệt quan trọng Một trong những khác biệt chính là mutexes tích hợp cơ chế thừa kế mức độ ưu tiên, trong khi semaphores nhị phân thì không Sự khác biệt này giúp semaphores nhị phân hoạt động một cách độc lập hơn trong quản lý tài nguyên.
32 thành lựa chọn tốt hơn để thực hiện đồng bộ hóa (giữa các tác vụ hoặc giữa các tác vụ và một ngắt)
Semaphore sử dụng API để xác định thời gian chặn, cho biết số lượng tối đa “ticks” mà một tác vụ có thể ở trạng thái Blocked khi cố gắng lấy semaphore không có sẵn Khi có nhiều tác vụ chờ trên cùng một semaphore, tác vụ có ưu tiên cao nhất sẽ được bỏ chặn đầu tiên khi semaphore trở nên khả dụng.
Hình 13 Cơ chế hoạt động của Binary semaphores
Semaphore nhị phân là một loại hàng đợi chỉ có thể chứa một dữ liệu, do đó nó chỉ có thể ở trạng thái trống hoặc đầy Các tác vụ và ngắt sử dụng semaphore không quan tâm đến số lượng dữ liệu trong hàng đợi mà chỉ cần biết hàng đợi đang ở trạng thái nào Cơ chế này có thể được sử dụng để đồng bộ hóa tác vụ với ngắt một cách hiệu quả.
Giống như semaphores nhị phân, semaphores đếm có thể được xem như một hàng đợi, nơi các tác vụ hoặc ngắt chỉ quan tâm đến việc hàng đợi có còn chỗ trống hay không.
Hình 14 Cơ chế hoạt động của Counting semaphores Đếm semaphores thường được sử dụng để:
Khi đếm các sự kiện, một trình xử lý sự kiện sẽ cung cấp một semaphore mỗi khi sự kiện xảy ra, làm tăng giá trị đếm semaphore Ngược lại, trình xử lý tác vụ sẽ lấy một semaphore mỗi khi xử lý một sự kiện, dẫn đến việc giảm giá trị đếm semaphore Do đó, giá trị đếm phản ánh sự khác biệt giữa số lượng sự kiện đã xảy ra và số lượng sự kiện đã được thực thi, với giá trị đếm bằng 0 khi semaphore được khởi tạo.
Quản lý tài nguyên (Resource management): Giá trị đếm cho biết số lượng tài nguyên có sẵn Để có được quyền kiểm soát tài nguyên,
Một tác vụ cần có một semaphore để truy cập tài nguyên, và khi giá trị đếm của semaphore giảm xuống 0, nghĩa là không còn tài nguyên nào có sẵn Khi tác vụ hoàn thành việc sử dụng tài nguyên, nó sẽ trả lại cho semaphore, làm tăng giá trị đếm trở lại Cuối cùng, giá trị đếm sẽ đạt mức tối đa ban đầu khi semaphore được khởi tạo.
3.5 Bộ định thời phần mềm (Software Timer)
Bộ định thời phần mềm cho phép lên lịch thực hiện các chức năng vào thời điểm đã định trong tương lai hoặc theo chu kỳ cố định Chức năng này được gọi là "timer’s callback".