【freeRTOS】Day1



RTOS的使用不外乎幾個重點,任務的建立/調度,訊息的傳遞,資源的安排

先以一個freeRTOS任務建置的例子來簡單介紹,

使用xTaskCreate()建立task任務,vTaskStartScheduler()啟動任務,

task_1()即被執行的task

vTaskDelay()可暫時交出CPU的使用權,task將處于Blocked阻塞狀況,直到tick的時間結束再回到task_1()

TaskHandle_t  task_1_handle;

static void task_1 (void * pvParameter)
{
    while (true)
    {
        /* Do task things */
        
        /* Delay a task for a given number of ticks */
        vTaskDelay(100);
    }
}

int main(void)
{
    xTaskCreate(task_1, \
                "LED0", \
                configMINIMAL_STACK_SIZE + 200, \
                NULL, \
                configMAX_PRIORITIES-1, \
                &task_1_handle);

    /* Start FreeRTOS scheduler. */
    vTaskStartScheduler();

    while (true)
    {
        /* FreeRTOS should not be here... FreeRTOS goes back to the start of stack
         * in vTaskStartScheduler function. */
    }
}

🔔 vTaskStartScheduler()執行後就啟動RTOS程序,系統不會走到下面的 while(true)迴圈



以下是最先要注意 FreeRTOSConfig.h 的參數設定,會影響task任務的運行結果

configMAX_PRIORITIES

  • 任務優先權最大值,建立任務時為其分配優先權從 0到configMAX_PRIORITIES-1
  • configUSE_PORT_OPTIMISED_TASK_SELECTION為1時不可大於32
  • tskIDLE_PRIORITY為數值0的空閒任務
  • configUSE_PREEMPTION

  • configUSE_PREEMPTION默認為 1
  • configUSE_PREEMPTION為0時任務不進行搶佔,除非運行的任務進入Blocked阻塞/Suspend/Resume,或執行taskYIELD()
  •      再或者有ISR()中斷進行切換

  • 例子:
    • task A擁有高優先權,執行vTaskDelay()進入Blocked mode,程序進入task B
      configUSE_PREEMPTION = 1 ,當vTaskDelay()的計數時間到時,task A將從task B搶奪系統回到Running mode
      configUSE_PREEMPTION = 0 ,task A只有在task B讓出系統才能再度運行


    configUSE_TIME_SLICING

  • configUSE_TIME_SLICING默認為 0
  • configUSE_TIME_SLICING為1時,系統將在每個tick在相同優先權的任務間輪流巡視
  • 例子:
    • task A與B的優先權相同
      configUSE_TIME_SLICING = 1
      configUSE_PREEMPTION = 1 ( 必須為1 )
      configTICK_RATE_HZ = 1000 ( 1000Hz == 1ms )
      可以看到task A和B每執行1ms就進入Blocked

  • 例子:
    • 優先權 task A > B = C,那程序將只運行在task A

    configTOTAL_HEAP_SIZE

  • heap size定義出的記憶體大小供stack建立時的可分配容量,其中也包含TCB (Task Control Block)所需
  • #define configTOTAL_HEAP_SIZE ( 4096 ) 即規畫4096 byte,
  •      configSTACK_DEPTH_TYPE 定義stack寛度為16或32bit

         16bit時,stack size 100則表示為200 bytes

         32bit時,stack size 100則表示為400 bytes

         所以task無論一個或數個,stack size加總必小于heap size

         ❗如果stack size加總超過heap size,系統在運行時會隨即跳到app_error_fault_handler()

    configSUPPORT_DYNAMIC_ALLOCATION

  • TaskCreate()任務動態配置函式的使用,configSUPPORT_DYNAMIC_ALLOCATION需為 1





  • 留言

    2024

    11-27SPI Flash 操作 (Read/Write/Erase)
    11-19Rotary Encoder Switch 旋轉編碼開關
    11-14Command Line Interface - CLI via UART
    11-14【STM32】USB HID - Volume Control
    11-13【STM32】USB Custom HID
    11-12【STM32】USB HID Keyboard + Mouse
    11-12【STM32】USB HID Keyboard
    11-12【STM32】USB HID Mouse
    10-15SSD1306 128x64 OLED 【五】Wokwi Animator
    09-2432F429IDISCOVERY - - LTDC [3] + FMC (SDRAM) + FatFS
    09-2432F429IDISCOVERY - - LTDC [2] + FMC (SDRAM)
    09-20STM32 + FatFs + SD card via SPI【三】FatFS指令操作II
    09-19STM32 + FatFs + SD card via SPI【二】FatFS指令操作
    09-18STM32 + FatFs + SD card via SPI【一】移植FatFS
    09-0232F429IDISCOVERY - - LTDC [1]
    04-17SSD1306 128x64 OLED 【四】Adafruit / GFX Library
    04-17Arduino - Serial Plotter繪圖儀
    04-16SSD1306 128x64 OLED 【三】
    04-15SSD1306 128x64 OLED 【二】 Datasheet
    04-12SSD1306 128x64 OLED 【一】I2C版本
    03-20【freeRTOS】vTaskDelay 與 vTaskDelayUntil 的差異
    03-19【freeRTOS】API功能列表
    03-18【freeRTOS】Day1
    03-08MBR和Blank project的差別
    03-05刪除註冊檔registry的資料
    02-27DFU over Bluetooth Low Energy
    02-27nRF Util - 使用手冊
    02-26nRF Command Line Tools
    02-20建立BootLoader settings
    02-19Secure DFU packet (ZIP) build 建立含袐鑰的Zip檔
    02-19Secure DFU via BLE
    02-19Secure DFU via UART
    02-16nRF Util 安裝
    01-16nRF52840 ic升級成nRF52840 Dongle的程式

    2023

    11-21[ SEGGER Embedded Studio ] 新增header files
    11-21[ SEGGER Embedded Studio ] 編譯nRF52840時遇到的問題
    11-07Arduino Nano ESP32 - Debugging除錯模式
    11-03Git快速入手 - 使用Git GUI
    10-30Git快速入手 - 使用Git Bash
    10-12程式碼高亮顯示 -- google-code-prettify

    2022

    11-30[EZ-PD] CCG6DF CCG6SF的Host SDK遇到編譯錯誤(一)

    2019

    05-27[ Eagle PCB ] 合板成品
    05-23#CASE_001_USB_TOOL_RL78_G12
    05-22[ Eagle PCB ] 初次洗板
    05-21[ Eagle PCB ] Panelize 併板
    05-20[ Eagle PCB ] 建立自己的Library及元件
    05-20[ Eagle PCB ] 添加library及元件
    05-20[ Eagle PCB ] Introduce

    2018

    04-25[ TCP test Tool ] 好用的TCP Server/Client工具
    01-16RZ/A1H -[0]- Renesas RZ/A1H YR0K77210S009BE BSP環境架設

    2017

    12-11EZ USB Suit使用JLink online debug FX3
    10-20RL78 -[12]- CS+_CACX_Lab5_LowPower mode
    10-16RL78 -[11]- CS+_CACX_Lab4_ADC_溫度感測
    10-13RL78 -[10]- CS+_CACX_Lab4_ADC_內部參考電壓
    10-13RL78 -[9]- CS+_Lab3_I2C + MPU6050
    10-13RL78 -[8]- CS+_Lab2_Uart transmit
    10-12RL78 -[7]- Renesas Flash Programmer 獨立燒錄軟體
    10-12RL78 -[6]- CS+_雜記
    10-12RL78 -[5]- CS+_tracking variables on debug mode
    10-12RL78 -[4]- CS+_顯示ROM與RAM的使用size
    10-12RL78 -[3]- CS+_Lab1_Led blinking
    10-12RL78 -[2]- CS+專案建立
    10-12RL78 -[1]- 開發環境介紹
    10-06ESP-01 -[0]- 硬體設置
    10-06LinkIt 7688 program Renesas RL78/G12 by 1-wire
    10-06LinkIt Smart 7688 -[3]- Build the firmware from source codes
    10-06LinkIt Smart 7688 -[2]- 使用UART進入bootloader / kernel console
    10-06LinkIt Smart 7688 -[1]- 使用SSH連接kernel console
    10-06LinkIt Smart 7688 -[0]- 初次使用
    07-14LinkIt Smart 7688 -[9]- Using MRAA SPI in Python
    07-13LinkIt Smart 7688 -[8]- Using MRAA UART in Python
    07-12LinkIt Smart 7688 -[7]- Using MRAA I2C in Python
    07-12LinkIt Smart 7688 -[6]- Using MRAA PWM in Python
    07-12LinkIt Smart 7688 -[5]- Using MRAA GPIO in Python
    07-10LinkIt Smart 7688 -[4]- 雜記
    06-29輕乳酪蛋糕 Cotton Cheesecake
    06-26VirtualBox 的 Ubuntu與Windows 共用資料夾

    2015

    04-29偵測USB PnP