1 前言
最近博主在做一些適配freeRTOS的項目,簡單來說就是從別的RTOS平臺遷移到freeRTOS平臺。 由于之前的代碼都是可用的,憑經(jīng)驗我們認為只需要將OSAL的接口重新封裝一下,理論上上層的邏輯應(yīng)該問題不大;但是我們沒想到的卻是在OSAL層適配的時候,遇到了一些之前沒有考慮到的問題。
2 遇到的問題
這個問題主要的體現(xiàn)就是在創(chuàng)建任務(wù)的接口調(diào)用上,freeRTOS的接口原型為:
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;
我們關(guān)注下第5個參數(shù)uxPriority,這個參數(shù)就是指定任務(wù)的優(yōu)先級。 我們都知道freeRTOS是基于任務(wù)優(yōu)先級來進行調(diào)度的,創(chuàng)建任務(wù)時指定的任務(wù)優(yōu)先級直接影響任務(wù)響應(yīng)的實時性。 早前我們是使用AliOS,功能組件代碼也都是使用AliOS的創(chuàng)建任務(wù)的API:
/**
* Create a task.
*
* @param[in] task handle.
* @param[in] name task name.
* @param[in] fn task function.
* @param[in] arg argument of the function..
* @param[in] stack_buf stack-buf: if stack_buf==NULL, provided by kernel.
* @param[in] stack_size stack-size in bytes.
* @param[in] prio priority value, the max is RHINO_CONFIG_USER_PRI_MAX(default 60).
*
* @return 0: success, otherwise: fail.
*/
int aos_task_new_ext(aos_task_t *task, const char *name, void (*fn)(void *),
void *arg, int stack_size, int prio);
這樣在做OS層接口的轉(zhuǎn)換的時候,優(yōu)先級這個數(shù)值就出問題了。 比如AliOS的接口傳入prio=60;然后60傳入freeRTOS就會出問題了,導(dǎo)致的結(jié)果就是新創(chuàng)建的任務(wù)可以被調(diào)度起來,但是創(chuàng)建任務(wù)的接口沒法返回了。 這里的根本原因就是freeRTOS的優(yōu)先級定義,數(shù)值越小,優(yōu)先級越低;反之,優(yōu)先級越高。
3 如何解決
解決的方法,倒是比較簡單,但是會比較繁瑣。 我們需要對所有創(chuàng)建的任務(wù),傳入的優(yōu)先級數(shù)值重新進行評估,明確每個任務(wù)是高優(yōu)先級還是低優(yōu)先級。 比如上面的prio=60(低優(yōu)先級)改為prio=0或1就可以解決問題了。
4 經(jīng)驗總結(jié)
針對freeRTOS這種反常的優(yōu)先級數(shù)值定義,我總結(jié)了其他常見RTOS的定義,做下對比,加深理解和記憶:
| RTOS名稱 | 優(yōu)先級數(shù)值范圍 | 優(yōu)先級數(shù)值的定義 |
|---|---|---|
| freeRTOS | 0 - (configMAX_PRIORITIES-1) | 數(shù)值越小,優(yōu)先級越低 |
| AliOS | 0 - 61 | 數(shù)值越小,優(yōu)先級越高 |
| uCOS | 0 - OSLOWESTPRIO | 數(shù)值越小,優(yōu)先級越高 |
| RT-Thread | 0 - 255 | 數(shù)值越小,優(yōu)先級越高 |
| threadx | 0 - (TXMAXPRIORITIES-1) | 數(shù)值越小,優(yōu)先級越高 |
| huawei lite os | 0 - 31 | 數(shù)值越小,優(yōu)先級越高 |
| Oneos | 0 - (OSTASKPRIORITY_MAX-1) | 數(shù)值越小,優(yōu)先級越高 |
| tencent tiny os | 0 - (TOSCFGTASKPRIOMAX-1) | 數(shù)值越小,優(yōu)先級越低 |
看到這里,大家一定感慨,就只有freeRTOS獨一檔的存在,只有它是數(shù)值越小,優(yōu)先級越低! 這里提醒下大家,如果你從其他RTOS平臺遷移到freeRTOS平臺,尤其注意下優(yōu)先級數(shù)值的問題,否則可能會導(dǎo)致莫名其妙的問題。
5 更多分享
歡迎關(guān)注我的github倉庫01workstation,日常分享一些開發(fā)筆記和項目實戰(zhàn),歡迎指正問題。
同時也非常歡迎關(guān)注我的專欄:有問題的話,可以跟我討論,知無不答,謝謝大家。
-
接口
+關(guān)注
關(guān)注
33文章
9576瀏覽量
157539 -
RTOS
+關(guān)注
關(guān)注
25文章
868瀏覽量
123184 -
FreeRTOS
+關(guān)注
關(guān)注
14文章
499瀏覽量
67172
發(fā)布評論請先 登錄
FreeRTOS中的任務(wù)管理
FreeRTOS任務(wù)調(diào)度及優(yōu)先級問題
轉(zhuǎn):第13章 FreeRTOS任務(wù)優(yōu)先級修改及其分配方案
FreeRTOS任務(wù)調(diào)度優(yōu)先級,會直接在就緒列表中調(diào)用低優(yōu)先級任務(wù)么?
stm32cube創(chuàng)建任務(wù)的優(yōu)先級與xTaskCreate的區(qū)別是什么
FREERTOS中任務(wù)優(yōu)先級的設(shè)置
FreeRTOS中斷優(yōu)先級和任務(wù)優(yōu)先級架構(gòu)的相關(guān)資料推薦
對FreeRTOS任務(wù)的使用
2.FreeRTOS中斷優(yōu)先級和任務(wù)優(yōu)先級
#FreeRTOS學習筆記(二):任務(wù)創(chuàng)建/刪除,掛起/解掛
FreeRTOS任務(wù)的優(yōu)先級示例
FreeRTOS中任務(wù)狀態(tài)與任務(wù)優(yōu)先級
【freeRTOS開發(fā)筆記】關(guān)注創(chuàng)建任務(wù)時傳入優(yōu)先級數(shù)值問題
評論