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

文章目录

  • 1 前言
  • 2 遇到的问题
  • 3 如何解决
  • 4 经验总结
  • 5 更多分享


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 - OS_LOWEST_PRIO 数值越小,优先级越高
RT-Thread 0 - 255 数值越小,优先级越高
threadx 0 - (TX_MAX_PRIORITIES-1) 数值越小,优先级越高
huawei lite os 0 - 31 数值越小,优先级越高
Oneos 0 - (OS_TASK_PRIORITY_MAX-1) 数值越小,优先级越高
tencent tiny os 0 - (TOS_CFG_TASK_PRIO_MAX-1) 数值越小,优先级越低

看到这里,大家一定感慨,就只有freeRTOS独一档的存在,只有它是数值越小,优先级越低
这里提醒下大家,如果你从其他RTOS平台迁移到freeRTOS平台,尤其注意下优先级数值的问题,否则可能会导致莫名其妙的问题。

5 更多分享

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

同时也非常欢迎关注我的CSDN主页和专栏:

【http://yyds.recan-li.cn】

【C/C++语言编程专栏】

【GCC专栏】

【信息安全专栏】

【RT-Thread开发笔记】

【freeRTOS开发笔记】

有问题的话,可以跟我讨论,知无不答,谢谢大家。

你可能感兴趣的:(freeRTOS学习笔记,C/C++编程语言,freertos)