🌱 OS Hook Functions trong Hệ thống Nhúng: Ý Nghĩa và Ứng Dụng với FreeRTOS

🌱 OS Hook Functions trong Hệ thống Nhúng: Ý Nghĩa và Ứng Dụng với FreeRTOS

    Khi làm việc với RTOS, developer thường cần theo dõi hoặc can thiệp vào các sự kiện cụ thể của hệ thống, như khi một task bị xóa, bộ nhớ cấp phát thất bại, hoặc hệ thống rơi vào trạng thái idle. Việc sửa đổi mã nguồn RTOS có thể phức tạp và khó bảo trì, đặc biệt trong các dự án lớn.

    Ví dụ thực tế: Trong một hệ thống giám sát trên STM32, bạn muốn ghi log mỗi khi một task hoàn thành hoặc phát hiện lỗi khi bộ nhớ heap cạn kiệt. Nếu không có Hook Functions, bạn phải thêm mã thủ công vào từng task hoặc chỉnh sửa FreeRTOS, gây mất thời gian và rủi ro lỗi.

    Hook Functions cung cấp một cách linh hoạt để xử lý các tình huống này mà không can thiệp vào lõi RTOS. Bài viết này sẽ cùng bạn tìm hiểu về OS Hook Functions!

RTOS Hook Functions


Hook Functions là gì?

    Hook Functions là các hàm callback do người dùng định nghĩa, được RTOS gọi tự động tại những điểm cụ thể trong quá trình thực thi. Chúng cho phép bạn "móc" (hook) code của mình vào hệ thống để xử lý các sự kiện mà không cần thay đổi mã nguồn chính của RTOS.

    Ví dụ trong FreeRTOS, Hook Functions được thiết kế để theo dõi hoặc can thiệp vào các hoạt động như tạo task, xóa task, cấp phát bộ nhớ, hoặc trạng thái idle, mang lại sự linh hoạt tối đa cho nhà phát triển hệ thống nhúng.


Cách Hook Functions hoạt động trong RTOS

    Hook Functions hoạt động như sau:

  1. Định nghĩa: Bạn viết một hàm với tên và tham số theo chuẩn của RTOS (ví dụ: vApplicationIdleHook trong FreeRTOS).
  2. Kích hoạt: RTOS gọi hàm này khi sự kiện tương ứng xảy ra (ví dụ: khi không có task nào sẵn sàng chạy).
  3. Cấu hình: Một số Hook yêu cầu bật tùy chọn trong file cấu hình (như configUSE_IDLE_HOOK).

    Hook Functions không thay thế logic chính của RTOS mà bổ sung chức năng tùy chỉnh, giúp hệ thống dễ mở rộng và bảo trì.

    ➤ Hook Functions có nhiều ứng dụng thực tế trong hệ thống nhúng:

  • Debugging: Ghi log khi stack overflow hoặc malloc thất bại.
  • Power Saving: Chuyển vi điều khiển sang chế độ ngủ trong Idle Hook.
  • Monitoring: Theo dõi thời gian chạy của scheduler qua Tick Hook.
  • Error Handling: Xử lý lỗi hệ thống mà không dừng chương trình.

Các loại Hook Functions trong FreeRTOS

    FreeRTOS cung cấp nhiều Hook Functions phổ biến <Tham khảo tại freeRTOS Hook Functions>

Tên Hook Mục đích Cấu hình
vApplicationIdleHook Chạy khi hệ thống ở trạng thái idle (không có task nào chạy). configUSE_IDLE_HOOK
vApplicationTickHook Chạy trong mỗi lần ngắt tick của scheduler. configUSE_TICK_HOOK
vApplicationMallocFailedHook Chạy khi cấp phát bộ nhớ heap thất bại. configUSE_MALLOC_FAILED_HOOK
vApplicationStackOverflowHook Chạy khi stack của task bị tràn. configCHECK_FOR_STACK_OVERFLOW
vApplicationDaemonTaskStartupHook Chạy khi task daemon khởi động. configUSE_DAEMON_TASK_STARTUP_HOOK

Ví dụ thực tế trên FreeRTOS với STM32

    Dưới đây là ví dụ sử dụng Hook Functions để giám sát hệ thống giám sát nhiệt độ trên STM32:

    Kịch bản: Theo dõi Idle và Stack Overflow

  • Task đọc nhiệt độ từ cảm biến I2C.
  • Hook Functions ghi log khi hệ thống idle hoặc stack overflow.
  1. #include "stm32f4xx_hal.h"
  2. #include "FreeRTOS.h"
  3. #include "task.h"
  4. UART_HandleTypeDef huart1;
  5. I2C_HandleTypeDef hi2c1;
  6. void vApplicationIdleHook(void) {
  7. // Switch STM32 to low sleep mode when idle
  8. HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
  9. // Logging
  10. HAL_UART_Transmit(&huart1, (uint8_t*)"Idle\n", 5, 100);
  11. }
  12. void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
  13. // Logging when stack overflow
  14. char msg[50];
  15. sprintf(msg, "Stack overflow in %s\n", pcTaskName);
  16. HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 100);
  17. while (1); // Stop the system to debug
  18. }
  19. void TempSensorTask(void *pvParameters) {
  20. while (1) {
  21. int temp = HAL_I2C_Master_Receive(&hi2c1, 0x40, NULL, 0, 100); // Emulation
  22. HAL_UART_Transmit(&huart1, (uint8_t*)&temp, sizeof(temp), 100);
  23. vTaskDelay(pdMS_TO_TICKS(1000));
  24. }
  25. }
  26. void app_main() {
  27. HAL_UART_Init(&huart1);
  28. HAL_I2C_Init(&hi2c1);
  29. xTaskCreate(TempSensorTask, "TempSensor", 128, NULL, 1, NULL);
  30. vTaskStartScheduler();
  31. }
  32. // FreeRTOSConfig.h
  33. #define configUSE_IDLE_HOOK 1
  34. #define configCHECK_FOR_STACK_OVERFLOW 2 // Method 2: Check the details

Giải thích:

  • vApplicationIdleHook: Chạy khi không có task nào sẵn sàng, chuyển STM32 sang chế độ ngủ và ghi log.
  • vApplicationStackOverflowHook: Phát hiện stack overflow, ghi tên task bị lỗi qua UART.


Kết luận

    Hook Functions là một công cụ quan trọng trong hệ thống nhúng, đặc biệt với hệ thống sử dụng RTOS, giúp tùy chỉnh hành vi hệ thống mà không cần sửa đổi mã nguồn lõi. Từ việc tiết kiệm năng lượng, xử lý lỗi, đến giám sát hệ thống, Hook Functions mang lại sự linh hoạt, hiệu quả và để nâng cao độ tin cậy của hệ thống.

    Bạn đã từng sử dụng Hook Functions trong dự án của mình chưa? Hãy chia sẻ hoặc đặt câu hỏi để cùng thảo luận!

>>>>>> Follow ngay <<<<<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊
Chúc các bạn học tập tốt 😊

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

Đăng nhận xét

Mới hơn Cũ hơn
//