1. 程式人生 > 實用技巧 >FreeRTOS 學習筆記2——task

FreeRTOS 學習筆記2——task

FreeRTOS task manage study Note

FreeRTOS task manage study Note
create
task priority
時間,tick
task 狀態
task block api
task idle hook function
task Priority set and get
task delete
Scheduling Algorithms
例程TOC

create


BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,  /* task 函式 */
                        const char * const pcName,  /* task 字元名,用於debug*/
                        uint16_t usStackDepth,   /* task堆疊大小 */
                        void *pvParameters,      /* task 引數,可以為NULL */
                        UBaseType_t uxPriority,  /* task 任務優先順序 */
                        TaskHandle_t *pxCreatedTask ); /* task控制代碼(可以用於調整task優先順序,刪除task等操作),可以為NULL */

task priority

  • API: vTaskPrioritySet()
  • 任務排程方法有兩種:
    • Generic Method, 當configUSE_PORT_OPTIMISED_TASK_SELECTION 設為0,或者不定義此項時。freeRTOS 不限制 configMAX_PRIORITIES 的大小,但要儘可能小。
    • Architecture Optimized Method ,當configUSE_PORT_OPTIMISED_TASK_SELECTION 設為1時,configMAX_PRIORITIES的大小限制在32,但儘可能小。

時間,tick

  • configTICK_RATE_HZ
    設定tick產生的頻率,當設為100時,tick間隔10ms,當設為1000時,tick間隔1ms
  • pdMS_TO_TICKS() 巨集將ms轉換為當前對應的tick數,當tick rate變化時,時間不變。

task 狀態

task block api

  • vTaskDelay(), vTaskDelay( pdMS_TO_TICKS( 100 ) ) 延時100ms
  • xTaskGetTickCount() 獲取當前計數值
  • vTaskDelayUntil()

task idle hook function

vApplicationIdleHook( void );

task Priority set and get

void vTaskPrioritySet( TaskHandle_t pxTask, UBaseType_t uxNewPriority );
UBaseType_t uxTaskPriorityGet( TaskHandle_t pxTask );

task delete

void vTaskDelete( TaskHandle_t pxTaskToDelete );

Scheduling Algorithms

configUSE_PREEMPTION 搶佔策略
configUSE_TIME_SLICING 時間片策略
configUSE_TICKLESS_IDLE 空閒時降低tick頻率,用於低功耗用途。

例程

    xTaskCreate( vTask_A, "taskA", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);
    xTaskCreate( vTask_B, "taskB", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);


void vTask_A( void *pvParameters )
{
    int16_t sSendNum = 1;
    for (;;) {

        vTaskDelay( 2000/portTICK_PERIOD_MS);
        printf("Sending Num:%d\r\n", sSendNum);
        xQueueSend( xMsgQueue, (void *)&sSendNum, portMAX_DELAY);
        sSendNum++;
    }
}

void vTask_B( void *pvParameters )
{
    int16_t sReceiveNum = 0;
    for (;;) {

        if ( xQueueReceive( xMsgQueue, &sReceiveNum, portMAX_DELAY)) {
            printf("ReceiveNum:%d\r\n", sReceiveNum);
        }
    }
}


來自為知筆記(Wiz)