提示:此内容涉及部分汇编+数据结构+计算机操作系统

目录

  • FreeRTOS调度机制
      • 优先级与状态
    • FreeRTOS调度链表
  • 相关函数
    • 一、xTaskCreate 创建任务相关
  • 三、 QueueDefinition(队列结构体)
  • 四、 EventGroup_t(事件组结构体)
    • 进程通信方式:
    • 共享内存怎么做?

FreeRTOS调度机制

优先级与状态

  • 优先级不同

    • 高优先级的任务,优先执行,可以抢占低优先级的任务
    • 高优先级的任务不停止,低优先级的任务永远无法执行
    • 同等优先级的任务,轮流执行:时间片轮转
  • 状态

不同的状态通过对应的链表来管理

  • 运行态:running
  • 就绪态:ready
  • 阻塞:blocked,等待某件事(时间、事件)
  • 暂停:suspend,休息去了
  • 怎么管理?
    • 怎么取出要运行的任务?

      • 找到最高优先级的运行态、就绪态任务,运行它
      • 如果大家平级,轮流执行:排队,链表前面的先运行,运行1个tick后乖乖地去链表尾部排队

调度方法:TICK中断

如果优先级为0 则需要注意空闲任务

FreeRTOS调度链表

相关函数

一、xTaskCreate 创建任务相关

作用为:

  1. 分配TCB结构体
  2. 分配栈区 在栈区
  3. 写入的函数地址和参数

xTaskCreate:函数原型:

BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,//任务函数const char * const pcName,//任务名字      const configSTACK_DEPTH_TYPE usStackDepth,//栈大小 (用来保护寄存器的值)void * const pvParameters,//传递给任务函数的参数(就是传给第一行的任务函数)UBaseType_t uxPriority,//任务优先级TaskHandle_t * const pxCreatedTask//TCB结构体 (传出的函数)//TCB 任务控制块)

任务控制块结构体 tskTaskControlBlock。

在FreeRTOS中,任务的执行是由系统调度的。系统为每个任务都定义了一个任务控制块,这个任务控制块里面存有任务的所有信息,如任务的栈指针,任务名称,任务的形参等。系统对任务的全部操作都可以通过这个任务控制块来实现。任务控制块结构体:

   为什么任务控制块中没有看到 :函数指针以及传入给函数的参数 因为栈中  R15:PC会保存函数指针 R0:会保存函数参数 以便下次调用时使用

函数原型:tskTaskControlBlock

typedef struct tskTaskControlBlock
{volatile StackType_t   *pxTopOfStack;  /*< Points to the location of the last item placed on the tasks stack.  THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. *///pxTopOfStack指向栈顶 此栈顶的值由 是由PC寄存器 赋给RO寄存器 函数就会开始执行//PC寄存器保存的就是函数地址ListItem_t          xStateListItem; //<任务的状态列表项被引用的列表表示该任务的状态(Ready, Blocked, Suspended)。* /ListItem_t           xEventListItem;     //用于从事件列表中引用任务。UBaseType_t          uxPriority;         //任务的优先级。0为最低优先级StackType_t         *pxStack;           /*指向堆栈的开始。* ///注意此处的指针在freeRtos中 是指向一个全局数组 此数组的内存用来分配给栈} tskTCB;

三、 QueueDefinition(队列结构体)

typedef struct QueueDefinition
{int8_t *pcHead;                    /*指向队列数据存储的起始位置*/int8_t *pcTail;                    /*指向队列存储区域末尾的字节。一旦分配了多余的字节来存储队列项,这是用来做记号的。 */int8_t *pcWriteTo;              /*< 指向存储区域中空闲的下一个位置。 */union/* 使用union是编码标准的一个例外,以确保两个互斥结构成员不会同时出现(浪费RAM)。*/{int8_t *pcReadFrom;          /*指向结构用作队列时读取队列项的最后一个位置。*/UBaseType_t uxRecursiveCallCount;/*在结构用作互斥锁时,维护递归互斥锁被递归地“占用”的次数的计数。*/} u;List_t xTasksWaitingToSend;       /*阻塞的任务列表,这些任务等待发送到此队列。按优先顺序存储。*/List_t xTasksWaitingToReceive;  /*队列等待读取的任务列表,这些任务等待接收此队列的数据。按优先顺序存储。 */volatile UBaseType_t uxMessagesWaiting;/*当前队列中的列表项数目。 */UBaseType_t uxLength;            /*队列的长度定义为它将持有的链表项的数量,而不是字节的数量。*/UBaseType_t uxItemSize;         /*队列持有的每个列表项的大小 */volatile int8_t cRxLock;      /*存储在锁定队列时从队列接收(从队列中删除)的项数。当队列未锁定时,设置为queue解锁。*/volatile int8_t cTxLock;     /*< 存储传输到队列的项数(添加到队列中)当队列被锁定时。当队列未锁定时,设置为queue解锁。*/
} xQUEUE;

四、 EventGroup_t(事件组结构体)

struct EventGroupDef_t;
typedef struct EventGroupDef_t   * EventGroupHandle_t; //控制块句柄(指针)typedef struct EventGroupDef_t  //事件标志组结构体(控制块)
{EventBits_t uxEventBits;  // 当前事件 每一位用来表示一个任务List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. *///等待被设置的任务列表#if ( configUSE_TRACE_FACILITY == 1 )UBaseType_t uxEventGroupNumber;#endif#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */#endif} EventGroup_t;

进程通信方式:

  1. 信号量
  2. 消息队列
  3. 管道
    匿名(需要血缘关系)
    有名(不需要血缘关系)
    高级(另一个程序在当前程序打开,算是当前程序的子进程,称高级管道)
  4. socket(套接字)
  5. 共享内存通信(最快)

共享内存怎么做?

特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。

  1. 创建共享内存,指定key、size、mode(权限)
  2. 将当前进程连接到共享内存
  3. 把共享内存的地址读取出来,并强制转换为本地变量
  4. 读写操作了

做法:将同一段物理内存映射到堆与栈之间的那一段虚拟内存中,

详细出处

FreeRTOS 常用函数详解相关推荐

  1. QT:常用函数详解--常用操作记录(个人笔记)

    QT:常用函数详解(个人笔记) PS:一下内容个人笔记,要求自己看懂,随笔,阅读体验会很差很差! Qt setContentsMargins()函数 函数原型:void QLayout::setCon ...

  2. python的shutil模块是内置的_Python之shutil模块11个常用函数详解,python内置函数是什么...

    Python之shutil模块11个常用函数详解,python内置函数是什么 shutil 是 Python 中的高级文件操作模块,与os模块形成互补的关系,os主要提供了文件或文件夹的新建.删除.查 ...

  3. MySql截取字符串的几个常用函数详解

    MySql截取字符串的几个常用函数详解 MySQL 截取字符的几个常用函数:left(), right(), substring(), substring_index(),mid(), substr( ...

  4. blankcount函数python,Python pandas常用函数详解

    本文研究的主要是pandas常用函数,具体介绍如下. 1 import语句 2 文件读取 df = pd.read_csv(path='file.csv') 参数:header=None 用默认列名, ...

  5. 【Python入门】Python之OS模块39个常用函数详解

    os,语义操作系统,所以该模块就是操作系统相关的功能了,用于处理文件和目录这些我们日常手动需要做的操作,比如新建文件夹.获取文件列表.删除某个文件.获取文件大小.重命名文件.获取文件修改时间等,该模块 ...

  6. numpy随机生成01矩阵_Python数据分析Numpy库常用函数详解,提到循环就该想到的库...

    Python进行数据分析的核心库肯定是Pandas,该库差不多可以解决结构化数据的绝大部分处理需求.在<Python数据分析常用函数及参数详解,可以留着以备不时之需 >一文中也已经对该库的 ...

  7. linux网络编程常用函数详解与实例(socket--bind--listen--accept)

    常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可 ...

  8. el replace 表达式_EL表达式运算符、常用函数详解

    运算符: 1.算术运算符有五个:+.-.*或$./或div.%或mod 2.关系运算符有六个:==或eq.!=或ne.或gt.<=或le.>=或ge 3.逻辑运算符有三个:&&am ...

  9. r 语言c函数,R语言常用函数详解

    R语言对于我们生信人员来讲,再熟悉不过,然而任何一门语言想要学好,必须经过常年的日积月累才可以做到,在这里,我列举R中常用的函数的用法, 供大家学习. 1.序列函数seq 用法: seq(form,t ...

最新文章

  1. mac git命令按tab键自动补全
  2. python的优点-python的功能与优缺点
  3. 当对项目强名时自动构建失败(TeamFoudationServer试用笔记)
  4. α测试,Beta测试
  5. pythonset是什么类型的游戏_Python集合(set)类型的操作
  6. mysql 外键关联
  7. 【GPU编程】开始Cg之旅,编译自己的第一个Cg程序
  8. 正则表达式---------常用字符及其功能
  9. ASP.net的RUL重写
  10. 思科华为双向的chap
  11. 最新51单片机毕业设计项目集合
  12. 《InfoGAN: Interpretable Representation Learning》翻译
  13. “github中文版”来了,这个神器一键帮你汉化
  14. SolidWorks二次开发---简单的参数化示例
  15. Django之验证码(十七)
  16. 基于OpenCV的卡尔曼滤波的设计
  17. 融合注意力机制和Bi-LSTM的旅游评价情感分析模型
  18. html5设置单元格行高,单元格的行高怎么设置 EXCEL文档怎么统一设置行高
  19. 2019全网最全面试详解.
  20. [网络工程师]-路由协议-OSPF协议

热门文章

  1. 解决Hive动态分区小文件过多问题
  2. android java线程从入门到精通
  3. mac使用终端上查看文件路径
  4. 综合布线系统工程招标文件简述
  5. 蓝牙音频广播多连接模块技术方案
  6. LED灯带的制作过程
  7. linux 命令行 time,详解Linux time 命令的使用
  8. java实现图片转化为字符图片
  9. R语言基础 | 方差分析(1):单因素方差分析
  10. Element UI中点击按钮后不失焦?如何强制给它失焦