發表文章

目前顯示的是 11月, 2018的文章

FreeRTOS學習筆記 (三)-時間管理vTaskDelay()及vTaskDelayUntil()

FreeRTOS 任務中,在函數中使用延時函數就會讓任務進入阻塞狀態 (block) , 通常使用 vTaskDelay() 及 vTaskDelayUntil() 。 -vTaskDelay() 為相對延時 -vTaskDelayUntil() 為絕對延時 要使用則在 FreeRTOSConfig.h 中必須定義 : #define INCLUDE_vTaskDelay          1 #define INCLUDE_pcTaskGetTaskName    1 -------------------------------------------------------- 1.vTaskDelay() 其原型為 : void vTaskDelay ( const TickType_t xTicksToDelay ) -參數: const TickType_t xTicksToDelay 如果直接給數值,如 vTaskDelay(100) ,則表示暫停 100 個 ticks ,由於每個 MCU 的 Ticks 不同, FreeRTOS 提供了 #define portTICK_RATE_MS portTICK_PERIOD_MS #define portTICK_PERIOD_MS  ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) 幫我們轉為 ms ,故 vTaskDelay(100) 就是讓任務暫停 100ms 2.vTaskDelayUntil() 其原型為: void vTaskDelayUntil ( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) 使用範例: // Perform an action every 10 ticks. void vTaskFunction( void * pvParameter...

FreeRTOS學習筆記 (二)-任務創建和刪除(xTaskCreate及vTaskDelete)

圖片
函數 功能 xTaskCreate() 動態創建一個任務 xTaskCreateStatic() 靜態創建一個任務 xTaskCreateRestricted() 創建使用 MPU 進行限制任務 vTaskDelay() 任務刪除 1. xTaskCreate ()      --創建一個任務,RAM默認使用heap_4.c(後面章節補充)管理內存。 新創建的任務默認是就緒狀態,如果當前無更高優先權的任務運行,此任務將立刻執行: pvTaskCode :任務函數(函數名稱) pcName :任務名子,名稱不能超過 configMAX_TASK_NAME_LEN, 會自動刪除超過字串 usStackDepth :任務的棧大小 pvParameters :傳遞給任務的參數 uxPriority :任務的優先權,0~configMAX_PRIORITIES-1 pvCreatedTask : 任務句柄。任務創建成功會返回此任務句柄,其他API也會用到      返回值: errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:失敗,內存不夠 pdPASS:成功 2. vTaskDelete () --刪除任務函數,被刪除的任務將不存在也不再運行。 任務被刪除後,句柄將無法 繼 續使用,若使用 xTaskCreate() 創立則刪除後會釋放掉內存,申請的記憶體會在空閒任務中釋放,所以刪掉任務需要一點時間給空閒任務。 參數: xTaskToDelete :要刪除的任務句柄 返回值:無 ------------------------------------------------------------------------------ 測試: 1.啟動兩個Task void vTaskFunction1 ( void * pvParameters ) {   while (1)  {  taskENTER_CRITICAL();   pr...

FreeRTOS學習筆記(一) -基礎知識與了解

圖片
     FreeRTOS為一個輕量可裝載於MCU上的作業系統,與裸機最大差別在於可在MCU上執行多任務(TASK),任務特性: 支持搶占 可設定任務優先級 每個任務都有自己的記憶體空間(有時候不好去估算需要的大小,目前我都是先估算一個大小後再開始調整,以不浪費空間為主) 使用簡單 一, 任務狀態 --FreeRTOS狀態只會出現下圖中狀態之一 Running : 任務運行中,在單核心的MCU中永遠只會有一個任務在運行。 Ready : 任務處於準備中(沒有被掛起也無進入阻塞),因為目前有優先級更高的任務在執行。 Block (阻塞): 若任務處於此狀態,通常都是因為調用vTaskDelay()進入阻塞狀態,超過阻塞時間則進入Ready狀態。 Suspend (掛起): 任務進入此狀態都是調用了vTaskSuspend(),進入此狀態的任務將不再被調度器調用至運行狀態,直到調用vTaskResume()恢復。 二, 任務函式 -通常任務多為一個永久迴圈, void vTaskFunction ( void * pvParameters )  { for( ;; ) {                /*                    自己的任務運行程式                       */ vTaskDelay( xDelay ); /*也可用其他API進行延時,後面補充*/ }           vTaskDelete(NULL); /*要退出且刪除任務,一定要調用vTaskDelete()*/  } 任務函數沒有返回值 pvParameters :傳遞資料 若跳出迴圈,一定要使用vTaskDelet...

FreeRTOS學習筆記 (零 )-FreeRTOS系統配置

圖片
    FreeRTOS使用前該如何知道怎麼配置系統是很重要的,通常都是在FreeRTOSConfig.h中定義。 ====================================================== (1) #define configUSE_PREEMPTION     -設為1使用搶佔模式;設為0則為協作式模式     -搶佔式由系統決定如何調度     -協作式模式只有在某些時候才會進行任務切換:            >任務調用了taskYIELD()            >任務調用了會進入bLOCK的API            >中斷 (2) #define configUSE_IDLE_HOOK     -為1時使用空閒任務,被刪掉的任務都會在空閒任務釋放並分配空間,故使用vTaskDelete()       刪除任務要確保空閒任務有處理時間。     -空閒任務是為了確保至少有一個任務在運行,因此優先權通常為最低     -空閒任務原型:     void vApplicationMallocFailedHook( void ) (3) #define configUSE_TICK_HOOK     -為1則可以設立一個時間片中斷函式,可做定時器,其原型: void vApplicationTickHook ( void ) (4) #define configCPU_CLOCK_HZ     - 設置CPU時脈 (5) #define configTICK_RATE_HZ     -為系統節拍的頻率,每單位時間內有幾次tick,通常都是設1000 1ms (6) #define configM...