FreeRTOS 常用函数详解
提示:此内容涉及部分汇编+数据结构+计算机操作系统
目录
- FreeRTOS调度机制
- 优先级与状态
- FreeRTOS调度链表
- 相关函数
- 一、xTaskCreate 创建任务相关
- 三、 QueueDefinition(队列结构体)
- 四、 EventGroup_t(事件组结构体)
- 进程通信方式:
- 共享内存怎么做?
FreeRTOS调度机制
优先级与状态
- 优先级不同
- 高优先级的任务,优先执行,可以抢占低优先级的任务
- 高优先级的任务不停止,低优先级的任务永远无法执行
- 同等优先级的任务,轮流执行:时间片轮转
- 状态
不同的状态通过对应的链表来管理
- 运行态:running
- 就绪态:ready
- 阻塞:blocked,等待某件事(时间、事件)
- 暂停:suspend,休息去了
- 怎么管理?
- 怎么取出要运行的任务?
- 找到最高优先级的运行态、就绪态任务,运行它
- 如果大家平级,轮流执行:排队,链表前面的先运行,运行1个tick后乖乖地去链表尾部排队
- 怎么取出要运行的任务?
调度方法:TICK中断
如果优先级为0 则需要注意空闲任务
FreeRTOS调度链表
相关函数
一、xTaskCreate 创建任务相关
作用为:
- 分配TCB结构体
- 分配栈区 在栈区
- 写入的函数地址和参数
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;
进程通信方式:
- 信号量
- 消息队列
- 管道
匿名(需要血缘关系)
有名(不需要血缘关系)
高级(另一个程序在当前程序打开,算是当前程序的子进程,称高级管道) - socket(套接字)
- 共享内存通信(最快)
共享内存怎么做?
特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。
- 创建共享内存,指定key、size、mode(权限)
- 将当前进程连接到共享内存
- 把共享内存的地址读取出来,并强制转换为本地变量
- 读写操作了
做法:将同一段物理内存映射到堆与栈之间的那一段虚拟内存中,
详细出处
FreeRTOS 常用函数详解相关推荐
- QT:常用函数详解--常用操作记录(个人笔记)
QT:常用函数详解(个人笔记) PS:一下内容个人笔记,要求自己看懂,随笔,阅读体验会很差很差! Qt setContentsMargins()函数 函数原型:void QLayout::setCon ...
- python的shutil模块是内置的_Python之shutil模块11个常用函数详解,python内置函数是什么...
Python之shutil模块11个常用函数详解,python内置函数是什么 shutil 是 Python 中的高级文件操作模块,与os模块形成互补的关系,os主要提供了文件或文件夹的新建.删除.查 ...
- MySql截取字符串的几个常用函数详解
MySql截取字符串的几个常用函数详解 MySQL 截取字符的几个常用函数:left(), right(), substring(), substring_index(),mid(), substr( ...
- blankcount函数python,Python pandas常用函数详解
本文研究的主要是pandas常用函数,具体介绍如下. 1 import语句 2 文件读取 df = pd.read_csv(path='file.csv') 参数:header=None 用默认列名, ...
- 【Python入门】Python之OS模块39个常用函数详解
os,语义操作系统,所以该模块就是操作系统相关的功能了,用于处理文件和目录这些我们日常手动需要做的操作,比如新建文件夹.获取文件列表.删除某个文件.获取文件大小.重命名文件.获取文件修改时间等,该模块 ...
- numpy随机生成01矩阵_Python数据分析Numpy库常用函数详解,提到循环就该想到的库...
Python进行数据分析的核心库肯定是Pandas,该库差不多可以解决结构化数据的绝大部分处理需求.在<Python数据分析常用函数及参数详解,可以留着以备不时之需 >一文中也已经对该库的 ...
- linux网络编程常用函数详解与实例(socket--bind--listen--accept)
常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可 ...
- el replace 表达式_EL表达式运算符、常用函数详解
运算符: 1.算术运算符有五个:+.-.*或$./或div.%或mod 2.关系运算符有六个:==或eq.!=或ne.或gt.<=或le.>=或ge 3.逻辑运算符有三个:&&am ...
- r 语言c函数,R语言常用函数详解
R语言对于我们生信人员来讲,再熟悉不过,然而任何一门语言想要学好,必须经过常年的日积月累才可以做到,在这里,我列举R中常用的函数的用法, 供大家学习. 1.序列函数seq 用法: seq(form,t ...
最新文章
- mac git命令按tab键自动补全
- python的优点-python的功能与优缺点
- 当对项目强名时自动构建失败(TeamFoudationServer试用笔记)
- α测试,Beta测试
- pythonset是什么类型的游戏_Python集合(set)类型的操作
- mysql 外键关联
- 【GPU编程】开始Cg之旅,编译自己的第一个Cg程序
- 正则表达式---------常用字符及其功能
- ASP.net的RUL重写
- 思科华为双向的chap
- 最新51单片机毕业设计项目集合
- 《InfoGAN: Interpretable Representation Learning》翻译
- “github中文版”来了,这个神器一键帮你汉化
- SolidWorks二次开发---简单的参数化示例
- Django之验证码(十七)
- 基于OpenCV的卡尔曼滤波的设计
- 融合注意力机制和Bi-LSTM的旅游评价情感分析模型
- html5设置单元格行高,单元格的行高怎么设置 EXCEL文档怎么统一设置行高
- 2019全网最全面试详解.
- [网络工程师]-路由协议-OSPF协议