Chào anh em, đã bao giờ mọi người cầm trên tay chiếc ESP32, lập trình bằng Arduino rồi nhận ra rằng sản phẩm của mình đang khá là hụt hơi chưa.
Hãy tưởng tượng bạn đang làm một thiết bị IoT theo dõi và điều khiển thiết bị : Bạn cần hệ thống vừa phải đọc cảm biến chính xác từng mili giây, vừa phải đẩy dữ liệu lên Web/App, lại vừa phải sẵn sàng nhận lệnh điều khiển ngược lại từ người dùng, và bạn nhận ra một điều, thiết bị của mình cứ lag lag lúc thì phản hồi chậm, lúc thì mất dữ liệu.
Chỉ với vài tính năng cơ bản mà hệ thống đã bắt đầu quá tải, vậy với những sản phẩm cao cấp đòi hỏi hàng chục tác vụ chạy cùng lúc với độ chính xác tuyệt đối thì chúng ta phải làm sao?
Thực ra không phải do phần cứng yếu, mà do mình đang bắt nó làm việc theo một hệ thống tuần tự ( làm xong việc A thì mới tới việc B) rõ ràng với cách hoạt động như thế, khả năng đáp ứng thời gian thực của thiết bị là không thể.
Vậy có cách nào để giải quyết được bài toán đa nhiệm, thực thi nhiều tác vụ trong cùng một thời điểm, khai thác tối đa sức mạnh của dòng chip ESP32 không nhỉ ?
Và câu trả lời tốt nhất cho nhu cầu trên chính là RTOS ( real time OS), cụ thể hơn là FreeRTOS được tích hợp sâu vào Framework ESP-IDF.

Vậy FreeRTOS, RTOS là gì
RTOS là viết tắt của Real-time Operating System (Hệ điều hành thời gian thực). Nó được thiết kế riêng cho các ứng dụng yêu cầu sự phản hồi cực kỳ khắt khe về mặt thời gian.
Đừng nhầm lẫn nó với những hệ điều hành như Windows hay macOS. RTOS không có giao diện, không có trình duyệt web, không có ứng dụng. Về bản chất kỹ thuật, RTOS là một OS siêu nhỏ gọn, được thiết kế để đảm bảo tính kỷ luật về thời gian cho các tác vụ nhúng.
Nhiều anh em thường nhầm lẫn "thời gian thực" nghĩa là "siêu nhanh" hay "ngay lập tức". Nhưng thực tế, trong thế giới nhúng, Real-time mang ý nghĩa là Tính xác định (Determinism). Tức là hệ thống cam kết sẽ phản hồi một sự kiện trong một khoảng thời gian cụ thể đã được định trước.

Để dễ hình dung, anh em hãy so sánh nó với hệ điều hành Windows trên máy tính:
- Khi bạn click mở một thư mục, đôi khi nó hiện ra ngay, nhưng đôi khi máy đang bận và một lúc mới hiện. Đó là hệ điều hành thông thường (General Purpose OS) – nó cố gắng làm mọi thứ nhanh nhất có thể nhưng không cam kết thời gian chính xác.
- Ngược lại, với RTOS, nếu bạn lập trình để túi khí ô tô bung ra khi va chạm, hệ thống phải cam kết thực hiện việc đó trong đúng vài mili giây. Chậm hơn 1 giây thôi là mọi thứ đã vô nghĩa. Đó chính là ý nghĩa của "thời gian thực".
Thực tế thì RTOS là nói về ý tưởng xây dựng các mô hình OS real-time cho các ứng dụng nhúng, thì khi có ý tưởng đó thì các hãng, nhà phát triển đã xây dựng nhiều mô hình RTOS khác nhau. Thì FreeRTOS là một RTOS mã nguồn mở được phát triển bới AWS, cực nhẹ, dễ dàng tích hợp vào nhiều loại chip.
Tại sao Dev IoT lại cần đến RTOS?
Nếu code theo kiểu truyền thống (Bare-metal), bạn giống như một người thợ chỉ có một tay, làm xong việc này mới sang việc kia. Còn với RTOS, nó đóng vai trò là lãnh đạo, điều phối toàn bộ tài nguyên của chip, và nhờ người lãnh đạo đa di năng này, CPU của chúng ta có thể làm việc năng suất hơn cụ thể là có thể thực hiện nhiều tác vụ cùng một lúc, thứ mà lập trình tuần tự không thể.
Thay vì để hệ thống bị nghẽn bởi một hàm delay hay một quá trình gửi dữ liệu mạng kéo dài, RTOS cho phép chia chương trình thành nhiều phần độc lập. Nó cũng sẽ đảm bảo những việc quan trọng (như đọc cảm biến, xử lý ngắt) luôn được ưu tiên thực hiện đúng lúc, đúng thời điểm, không bao giờ bị trễ hẹn.
Sự hiện diện ngầm của nó trong ESP-IDF
Trong thế giới của ESP-IDF, CPU không còn chạy hì hục từ dòng code đầu tiên đến dòng code cuối cùng nữa. Thay vào đó, nó giống như một hạ tầng dùng chung. Khi bạn có một công việc (tác vụ) – dù là đọc cảm biến, nháy LED hay xử lý giao thức mạng – bạn chỉ việc "đăng ký" nó với FreeRTOS. Việc điều phối CPU vào lúc nào, cho ai và trong bao lâu sẽ do hệ điều hành này toàn quyền quyết định dựa trên các quy tắc cực kỳ nghiêm ngặt.
1. Cơ chế chiếm quyền (Preemptive) – Kẻ mạnh sẽ được ưu tiên
Đây là điểm mấu chốt tạo nên sự khác biệt. Trong lập trình tuần tự, nếu một đoạn code đang chạy bị "treo" hoặc chạy quá lâu, toàn bộ hệ thống sẽ phải đợi nó.
Nhưng với FreeRTOS, hệ thống hoạt động theo cơ chế chiếm quyền. Mỗi tác vụ bạn đăng ký sẽ đi kèm với một con số gọi là Độ ưu tiên (Priority). Khi một tác vụ quan trọng xuất hiện, FreeRTOS sẽ ngay lập tức "đóng băng" tác vụ ít quan trọng hơn lại, thu hồi CPU và trao quyền cho tác vụ quan trọng xử lý ngay tức khắc. Khi việc quan trọng xong xuôi, tác vụ cũ mới được quay lại làm tiếp đúng vị trí nó vừa bị dừng.

2. Tận dụng thời gian chết.
Trong các dòng chip không có RTOS, khi bạn sử dụng hàm delay(), CPU thực chất vẫn đang chạy (nhưng là chạy vòng lặp vô nghĩa) để chờ thời gian trôi qua. Điều này cực kỳ lãng phí.
Với FreeRTOS chạy ngầm, khi bạn ra lệnh cho một tác vụ "nghỉ ngơi", nó sẽ báo cho hệ điều hành biết: "Tôi chưa cần CPU trong 100ms tới". Ngay lập tức, FreeRTOS sẽ lấy CPU đó cấp cho các tác vụ khác đang cần, hoặc đơn giản là đưa CPU vào chế độ ngủ để tiết kiệm năng lượng. Hệ thống không bao giờ lãng phí dù chỉ là một micro giây.
3. Sự đồng bộ giữa hai nhân (Dual-core Synchronization)
ESP32 sở hữu sức mạnh của 2 nhân xử lý (Core 0 và Core 1). Trong lập trình thông thường, việc bắt hai nhân này làm việc cùng nhau mà không xảy ra xung đột dữ liệu là một cơn ác mộng.
Tuy nhiên, nhờ có FreeRTOS chạy ngầm, hệ điều hành sẽ tự động cân bằng tải. Nó biết cách đẩy các tác vụ hệ thống (như quản lý Wi-Fi) sang một nhân và dành nhân còn lại cho ứng dụng của bạn. Bạn không cần phải lo lắng về việc viết mã điều khiển từng nhân một cách thủ công.
Việc làm quen với khái niệm FreeRTOS chạy ngầm trong ESP-IDF có thể khiến anh em cảm thấy hơi ngợp lúc ban đầu vì sự phức tạp của nó, hy vọng bài giới thiệu này đã giúp anh em có cái nhìn tổng quan khi nghe đến RTOS. Đừng quá lo lắng về những dòng code phức tạp phía sau, vì một khi đã thông suốt về hệ thống việc hiện thực hóa nó bằng mã nguồn chỉ còn là vấn đề thời gian và luyện tập.


