1 前言
最近博主在做一些適配freeRTOS的項目,簡單來說就是從別的RTOS平臺遷移到freeRTOS平臺。 由于之前的代碼都是可用的,憑經(jīng)驗我們認(rèn)為只需要將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)先級來進(jìn)行調(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ù)值重新進(jìn)行評估,明確每個任務(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文章
8459瀏覽量
150748 -
RTOS
+關(guān)注
關(guān)注
21文章
809瀏覽量
119366 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
483瀏覽量
61929
發(fā)布評論請先 登錄
相關(guān)推薦
評論