最近博主在做一些适配freeRTOS的项目,简单来说就是从别的RTOS平台迁移到freeRTOS平台。 由于之前的代码都是可用的,凭经验我们认为只需要将OSAL的接口重新封装一下,理论上上层的逻辑应该问题不大;但是我们没想到的却是在OSAL层适配的时候,遇到了一些之前没有考虑到的问题。
这个问题主要的体现就是在创建任务的接口调用上,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;
我们关注下第5个参数uxPriority
,这个参数就是指定任务的优先级。 我们都知道freeRTOS是基于任务优先级来进行调度的,创建任务时指定的任务优先级直接影响任务响应的实时性。 早前我们是使用AliOS,功能组件代码也都是使用AliOS的创建任务的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层接口的转换的时候,优先级这个数值就出问题了。 比如AliOS的接口传入prio=60
;然后60传入freeRTOS就会出问题了,导致的结果就是新创建的任务可以被调度起来,但是创建任务的接口没法返回了。 这里的根本原因就是freeRTOS的优先级定义,数值越小,优先级越低;反之,优先级越高
。
解决的方法,倒是比较简单,但是会比较繁琐。 我们需要对所有创建的任务,传入的优先级数值重新进行评估,明确每个任务是高优先级
还是低优先级
。 比如上面的prio=60(低优先级)改为prio=0或1就可以解决问题了。
针对freeRTOS这种反常
的优先级数值定义,我总结了其他常见RTOS的定义,做下对比,加深理解和记忆:
RTOS名称 | 优先级数值范围 | 优先级数值的定义 |
---|---|---|
freeRTOS | 0 - (configMAX_PRIORITIES-1) | 数值越小,优先级越低 |
AliOS | 0 - 61 | 数值越小,优先级越高 |
uCOS | 0 - OSLOWESTPRIO | 数值越小,优先级越高 |
RT-Thread | 0 - 255 | 数值越小,优先级越高 |
threadx | 0 - (TXMAXPRIORITIES-1) | 数值越小,优先级越高 |
huawei lite os | 0 - 31 | 数值越小,优先级越高 |
Oneos | 0 - (OSTASKPRIORITY_MAX-1) | 数值越小,优先级越高 |
tencent tiny os | 0 - (TOSCFGTASKPRIOMAX-1) | 数值越小,优先级越低 |
看到这里,大家一定感慨,就只有freeRTOS独一档的存在,只有它是数值越小,优先级越低
! 这里提醒下大家,如果你从其他RTOS平台迁移到freeRTOS平台,尤其注意下优先级数值的问题,否则可能会导致莫名其妙的问题。
欢迎关注我的github仓库01workstation,日常分享一些开发笔记和项目实战,欢迎指正问题。
同时也非常欢迎关注我的专栏:有问题的话,可以跟我讨论,知无不答,谢谢大家。
全部0条评论
快来发表一下你的评论吧 !