【freeRTOS开发笔记】关注创建任务时传入优先级数值问题

描述

1 前言

最近博主在做一些适配freeRTOS的项目,简单来说就是从别的RTOS平台迁移到freeRTOS平台。 由于之前的代码都是可用的,凭经验我们认为只需要将OSAL的接口重新封装一下,理论上上层的逻辑应该问题不大;但是我们没想到的却是在OSAL层适配的时候,遇到了一些之前没有考虑到的问题。

2 遇到的问题

这个问题主要的体现就是在创建任务的接口调用上,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的优先级定义,数值越小,优先级越低;反之,优先级越高

3 如何解决

解决的方法,倒是比较简单,但是会比较繁琐。 我们需要对所有创建的任务,传入的优先级数值重新进行评估,明确每个任务是高优先级还是低优先级。 比如上面的prio=60(低优先级)改为prio=0或1就可以解决问题了。

4 经验总结

针对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平台,尤其注意下优先级数值的问题,否则可能会导致莫名其妙的问题。

5 更多分享

欢迎关注我的github仓库01workstation,日常分享一些开发笔记和项目实战,欢迎指正问题。

同时也非常欢迎关注我的专栏:有问题的话,可以跟我讨论,知无不答,谢谢大家。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分