0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式物联网开发 来源:嵌入式物联网开发 作者:嵌入式物联网开发 2022-07-11 09:13 次阅读

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,日常分享一些开发笔记和项目实战,欢迎指正问题。

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

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

    关注

    33

    文章

    8575

    浏览量

    151014
  • RTOS
    +关注

    关注

    22

    文章

    811

    浏览量

    119593
  • FreeRTOS
    +关注

    关注

    12

    文章

    484

    浏览量

    62139
收藏 人收藏

    评论

    相关推荐

    freeRTOS开发笔记】记一次坑爹的freeTOS升级

    freeRTOS开发笔记】记一次坑爹的freeTOS-v9.0.0升级到freeRTOS-v10.4.4
    的头像 发表于 07-11 09:15 4631次阅读
    【<b class='flag-5'>freeRTOS</b><b class='flag-5'>开发笔记</b>】记一次坑爹的freeTOS升级

    FreeRTOS中的任务管理

    任务FreeRTOS 中最基本的调度单元,它是一段可执行的代码,可以独立运行。FreeRTOS 中的任务是基于优先级的抢占式调度,
    的头像 发表于 11-27 17:03 998次阅读

    转:第13章 FreeRTOS任务优先级修改及其分配方案

    configMAX_PRIORITIES– 1。比如我们配置此宏定义为5,那么用户可以使用的优先级号是0,1,2,3,4,不包含5,对于这一点,初学者要特别的注意。u 用户配置任务优先级数值越小,那么此
    发表于 08-29 11:07

    FreeRTOS任务调度优先级,会直接在就绪列表中调用低优先级任务么?

    由于刚开始使用FreeRTOS,所以有很多问题,也正在学习。请问各位,假如优先级高的任务时间片用完后,会直接在就绪列表中调用低优先级任务么?假设:Task_A
    发表于 06-14 09:01

    stm32cube创建任务优先级与xTaskCreate的区别是什么

    请教一下,freertos中,为什么stm32cube创建的工程里,任务优先级只有下面这几种:而使用xTaskCreate创建
    发表于 06-15 09:00

    FREERTOS任务优先级的设置

    FREERTOS中,各个任务优先级怎么设置比较好呢?或者是说有什么标准?疑惑中。。。。。。
    发表于 07-19 08:03

    创建0优先级任务,程序会一直运行该任务这是为什么呢?

    看资料说,0优先级是空闲任务,但是其他任务是可以与空闲任务,共享0优先级的,那么我创建两个
    发表于 07-26 08:00

    FreeRTOS中断优先级任务优先级架构的相关资料推荐

    ,于是便有了这篇笔记,本篇文章以Cortex-M3(STM32F103)为例子。目录FreeRTOS中断优先级任务优先级1.Cortex-
    发表于 02-08 06:36

    FreeRTOS任务的使用

    FreeRTOS最基本的任务操作就是任务创建与删除,其API如下表:1.1动态任务创建xTask
    发表于 02-18 07:14

    freertos怎么在任务中修改任务优先级

    freertos怎么在任务中修改任务优先级
    发表于 10-11 07:56

    2.FreeRTOS中断优先级任务优先级

    ,于是便有了这篇笔记,本篇文章以Cortex-M3(STM32F103)为例子。目录FreeRTOS中断优先级任务优先级1.Cortex-
    发表于 12-04 20:21 9次下载
    2.<b class='flag-5'>FreeRTOS</b>中断<b class='flag-5'>优先级</b>和<b class='flag-5'>任务</b><b class='flag-5'>优先级</b>

    #FreeRTOS学习笔记(二):任务创建/删除,挂起/解挂

    FreeRTOS最基本的任务操作就是任务创建与删除,其API如下表:1.1动态任务创建xTask
    发表于 12-23 19:56 2次下载
    #<b class='flag-5'>FreeRTOS</b>学习<b class='flag-5'>笔记</b>(二):<b class='flag-5'>任务</b><b class='flag-5'>创建</b>/删除,挂起/解挂

    FreeRTOS任务优先级示例

    任务优先级:0~24之间。数字越大,任务优先等级越高。高优先级任务
    的头像 发表于 09-15 11:13 2797次阅读

    FreeRTOS任务状态与任务优先级

    处理器的话那么不管在任何时刻永远都只有一个任务处于运行态。 ● 就绪态 处于就绪态的任务是那些已经准备就绪(这些任务没有被阻塞或者挂起),可以运行的任务,但是处于就绪态的
    的头像 发表于 09-28 11:10 1120次阅读
    <b class='flag-5'>FreeRTOS</b>中<b class='flag-5'>任务</b>状态与<b class='flag-5'>任务</b><b class='flag-5'>优先级</b>

    freertos中断优先级在哪设置

    FreeRTOS是一个流行的实时操作系统,它广泛应用于嵌入式系统开发。在FreeRTOS中,中断优先级是一个重要的概念,因为它决定了中断处理的顺序和响应时间。 1. 理解中断
    的头像 发表于 09-02 14:17 636次阅读