FreeRTOS学习笔记一

2023-05-16

FreeRTOS 任务不允许以任何方式从实现函数中返回--它们绝不能有一条“return”
语句。

void ATaskFunction(void *pvParameters)
{
    int iVariableExample = 0;

    for(;;)
    {
        
    }
    传入NULL参数表示删除的是当前任务
    vTaskDelete(NULL);
}

FreeRTOS的调度器是能让任务切入切出的唯一实体。

创建任务

xTaskCreate()

portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode,           //是函数名
               const sifned portCHAR * const pcName,//具有描述性的任务名。这个参数不会被FreeRTOS使用。
               unsigned portSHORT usStackDepth,     //用于告诉内核为它分配多大的栈空间 ,指定的是栈空间可以保存多少个字(word)。
               void *pvParameters,   //任务函数接受一个指向void的指针(void*),即传递到任务中的值。
               unsigned portBASE_TYPE uxPriority,  //指定任务执行的优先级
               xTaskHandle *pxCreatedTask          //用于传出任务句柄

);

返回值,
1、pdTRUE : 表明任务创建成功
2、errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY
由于内存堆空间不足,FreeRTOS无法分配足够的空间来保存任务

int main(void)
{
    xTaskCreate(vTask2, "Task 2", 1000, NULL, 1, NULL);
    
    vTaskStartScheduler(); //启动调度器,任务开始执行
    
    for(; ;); //如果执行到这里很可能是内存堆栈不足导致空闲任务无法创建。
}


可以先在mani()中创建任务1,然后在任务1中创建任务2.


void vTaskFunction(void *pvParameters)
{

}

尽管现在只有一个任务实现代码(vTaskFunction),但是可以创建多个任务实例。


static const char *pcTextForTask1 = “Task 1 is running\r\n”;
static const char *pcTextForTask2 = “Task 2 is running\t\n”;

int main( void )
{
    xTaskCreate( vTaskFunction, "Task 1", 1000, (void*)pcTextForTask1, 1, NULL );
    xTaskCreate( vTaskFunction, "Task 2", 1000, (void*)pcTextForTask2, 1, NULL );
    vTaskStartScheduler();
    for( ;; );
}


任务优先级

uxPriority建立任务的时候初始化一个优先级,这个优先级可以在调度器启动后调用vTaskPrioritySet() API函数进行修改。

在FreeRTOSConfig.h 中配置configMAX_PRIORITIES的值,即是最多可具有的优先级数目。

低优先级号表示任务的优先级低,优先级号0表示最低优先级。有效的优先级号范围从0到(configMAX_PRIORITES-1)


要能够选择下一个运行的任务,调度器需要在每个时间片的结束时刻运行自己本身。一个称为心跳(tick,时钟滴答)中断的周期性中断
用于此目的。时间片的长度通过心跳中断的频率进行设定,心跳中断频率由FreeRTOSConfig.h中的编译时配置常量configTICK_RATE_HZ进行配置。

比如说如果configTICK_RATE_HZ设为100(HZ),则时间片长度为10ms。

需要说明的是,FreeRTOS API 函数调用中指定的时间总是以心跳中断为单位。常量portTICK_RATE_MS用于将以心跳为单位的时间值转化为
以毫秒为单位的时间值。有效精度依赖于系统心跳频率。

心跳计数(tick count)值表示的是从调度器启动开始,心跳中断的总数,并假定心跳计数器不会溢出。用户程序在指定延迟周期时不必考虑心跳计数溢出问题,yin
因为时间连贯性在内核中进行管理。


1.6 扩充“非运行态”

调度器总是选择所有能够进入运行态的任务中具有最高优先级的任务。一个高优先级但不能够运行的任务
意味着不会被调度器选中,而代之以另一个优先级虽然更低但能够运行的任务。


阻塞状态
如果一个任务正在等待某个事件,则称这个任务处于“阻塞态(blocked)”。阻塞态是非运行态的一个
子状态。

任务可以进入阻塞态以等待一下两种不同类型的事件:
1、定时(时间相关)事件

2、同步事件

互斥信号量可以实现同步事件。


任务可以在进入阻塞态以等待同步事件是指定一个等待超时时间,这样可以有效地实现阻塞状态下同时
等待两类的事件。比如说,某个任务可以等待队列中有数据到来,但最多只等10ms。如果10ms内有数据到来,
或是10ms过去了还没有数据到来,这两种情况下该任务都将退出阻塞态。

挂起状态

让一个任务进入挂起状态的唯一办法就是调用vTaskSuspend()函数
而吧一个挂起状态的任务唤醒的唯一途径就是调用vTaskResume()或vTaskResumeFromISR()函数

就绪状态

任务能够被运行

void vTaskDelay(portTickType xTicksToDelay);

xTicksToDelay  延时多少个心跳周期。调用该延迟函数的任务将进入阻塞态,经延迟指定的心跳周期数后,
再转移到就绪态。

常数portTICK_RATE_MS 可以用来将以毫秒为单位的时间值转
换为以心跳周期为单位的时间值。

vTaskDelay( 250 / portTICK_RATE_MS );
250ms

空闲任务是在调度启动时自动创建的,以保证至少有一个任务可运行。


空间任务可以获得的执行时间量,是系统处理能力裕量的一个度量指标。

vTaskDelayUntil()函数

vTaskDelayUntil() 类似于vTaskDelay()






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习笔记一 的相关文章

  • Linux用户与用户组介绍

    Linux用户与用户组介绍 文章目录 Linux用户与用户组介绍0 写在前面1 group1 1 什么是组 xff1f 1 2 groupadd1 2 groupmod1 3 groupdel1 4 gpasswd1 5 相关文件说明 2
  • Linux安装Oracle数据库

    Linux安装Oracle数据库 文章目录 Linux安装Oracle数据库0 写在前面1 Oracle 数据库1 1 简介1 2 Oracle 与 MySQL 的SQL 区别 2 前置准备2 1 安装依赖包2 2 配置用户组2 3 上传安
  • DataX与DB2导入导出案例

    DataX与DB2导入导出案例 文章目录 DataX与DB2导入导出案例0 写在前面1 DB2介绍2 DB2数据库对象关系3 安装前的准备3 1 安装依赖3 2 修改配置文件 sysctl conf3 3 修改配置文件 limits con
  • Doris集成其他系统——ODBC外部表

    Doris集成其他系统 ODBC外部表 文章目录 Doris集成其他系统 ODBC外部表0 写在前面1 正文1 1 ODBC外部表介绍1 2 使用方式 2 使用 ODBC 的 MySQL 外表2 1 前置芝士2 2 安装 unixODBC2
  • Linux安装ElasticSearch

    Linux安装ElasticSearch 文章目录 Linux安装ElasticSearch0 写在前面1 环境准备2 ES安装2 1ES解压2 2 新增普通用户2 3 给新创建的普通用户授权2 4 给新创建的普通用户设置sudo权限2 5
  • Hadoop入门学习——简介篇

    Hadoop入门学习 简介篇 文章目录 Hadoop入门学习 简介篇1 大数据概论1 1 分布式 并行 1 2 大数据特点 xff08 4V xff09 1 2 1 Volume xff08 大量 xff09 1 2 2 Velocity
  • Hadoop之分布式技术

    Hadoop之分布式技术 文章目录 Hadoop之分布式技术1 我们为什么需要分布式1 1 计算问题1 2 存储问题 2 分布式系统概述3 分布式实现方案4 分布式系统5 集群6 负载均衡7 弹性8 故障转移 1 我们为什么需要分布式 1
  • 认识DataX及简单入门

    认识DataX及简单入门 文章目录 认识DataX及简单入门1 DataX的概述1 1 什么是DataX1 2 DataX 的设计1 3 支持的数据源1 3 支持的数据源1 4 框架设计1 5 运行原理1 6 DataX和Sqoop的对比
  • Nginx 反向代理及https配置

    参考代码 在server中添加 location api proxy set header Host host proxy set header X Real IP remote addr proxy set header X Forwar
  • DataX使用之基础案例

    DataX使用之基础案例 文章目录 DataX使用之基础案例0 写在前面1 从stream 流读取数据并打印到控制台2 读取 MySQL 中的数据存放到 HDFS2 1 查看官方模板2 1 1 mysqlreader 参数解析 xff1a
  • DataX和Oracle使用案例

    DataX和Oracle使用案例 文章目录 DataX和Oracle使用案例0 写在前面1 从 Oracle 中读取数据存到 MySQL1 1 MySQL 中创建表1 2 编写 Datax 配置文件1 3 执行命令 2 读取 Oracle
  • MongoDB初认识

    MongoDB初认识 文章目录 MongoDB初认识0 写在前面1 MongoDB是什么2 MongoDB的优缺点3 基础概念解析4 安装4 1 下载地址4 2 安装MongoDB4 3 pgrep使用4 4 进入 shell 交互页面 0
  • DataX和MongoDB之间的数据导入导出案例

    DataX和MongoDB之间的数据导入导出案例 文章目录 DataX和MongoDB之间的数据导入导出案例0 写在前面1 MongoDB前置知识1 1 基础概念详解1 1 1 数据库1 1 2 集合1 1 3 文档 xff08 Docum
  • TI Cotex M3/4单片机关于寄存器操作详解

    TI Cotex M3 4单片机关于寄存器操作详解 前备知识寄存器与偏移量位带操作 位带区 TI单片机寄存器操作详解快速在TI的手册里面确认某外设某寄存器的确切地址寄存器操作介绍本文参考 前备知识 当前单片机的开发方式多种多样 xff0c
  • Cannot currently show the desktop

    问题解决办法篇 用VNC打开树莓派桌面时 xff0c 显示 Cannot currently show the desktop 意为当前无法显示桌面 xff0c 其实调整一下分辨率重新打开桌面就好了 法一 xff1a 有显示屏 将树莓派与显
  • 相机标定 >> 坐标系转换@内参、外参

    相机标定 gt gt 坐标系转换 64 内参 外参 1 坐标系介绍1 1 像素坐标系1 2 图像坐标系1 3 相机坐标系1 4 世界坐标系 2 相机标定2 1 内参2 1 1 内参的意义 xff08 透视映射 xff09 2 1 2 内参的
  • 2022年最新前端面试题

    js面试题 1 js数据类型 基本数据类型 Number String Boolean Null Undefined Symbol bigInt引用数据类型 object Array Date Function RegExp 2 js变量和
  • ruoyi(若依)框架使用说明(前后端分离)

    ruoyi 28 E8 8B A5 E4 BE 9D 29 E6 A1 86 E6 9E B6 E4 BD BF E7 94 A8 E8 AF B4 E6 98 8E 28 E5 89 8D E5 90 8E E7 AB AF E5 88
  • 1130 - Host XXX is not allowed to connect to this MySQL server。

    1 在用Navicat配置远程连接Mysql数据库时遇到如下报错信息 xff0c 这是由于Mysql配置了不支持远程连接引起的 2 在安装Mysql数据库的主机上登录root用户 xff1a mysql u root p 3 依次执行如下命
  • 阿里云Ubentu rsync同步文件到多台服务器

    cd usr local wget https rsync samba org ftp rsync src rsync 3 1 1 tar gz tar zxvf rsync 3 1 1 tar gz cd rsync 3 1 1 conf

随机推荐

  • java获取字符串最后一个字符

    第一种 String str 61 34 daipogfhjoripa1 34 char c 61 str charAt str length 1 第二种 str substring str length 1
  • 解决idea中maven依赖unknown的问题

    解决idea中maven依赖unknown的问题 1 出现问题原因 xff1a 最简单的原因是 xff0c 包名之间的横线 中英文切换问题 xff0c 改正就好 xff0c 或者忘记写版本号 从其他地方copy过来的 xff0c 仓库下载失
  • mySql中count带条件查询

    方法一 xff1a SELECT count t command name 61 39 UNLOCK 39 OR NULL unlockFrequency FROM 表 t 方法二 xff1a select count t command
  • tomcat下载安装步骤(超详细)

    下载安装 首先进入tomcat官网 https tomcat apache org 在圈住的位置点击下载自己想要的版本 我选择tomcat9 根据自己电脑下载64位或32位zip版本 下载完毕后解压到自己想放的位置 配置环境变量 在系统变量
  • 关于springboot访问tomcat,线程http-nio-8080-exec的来源问题

    最近在看并发操作时候 xff0c 例如jmeter进行接口压测 xff08 本地自己的springboot2的环境 xff09 xff0c 发现一个有趣的现象 xff0c 就是关于线程http nio 8080 exec 1 xff0c h
  • Docker容器的创建、启动、和停止及删除

    前言 xff1a 名词解释 这里有两个不同的单词 xff0c images和container 其中images很好理解 xff0c 跟平常使用的虚拟机的镜像一个意思 xff0c 相当于一个模版 xff0c 而container则是imag
  • Redis修改密码

    Redis修改密码 一开始自己使用redis一直没有使用密码 xff0c 后来在项目中要求配置密码 xff0c 每次都是在命令中修改 xff0c 单重启后悔失效 后来通过配置文件 xff0c 但重启后总是不生效 xff0c 试了好几种方法都
  • @ApiModel 和 @ApiModelProperty

    64 ApiModel 使用场景 xff1a 在实体类上边使用 xff0c 标记类时swagger的解析类 1 什么是Swagger OpenAPI规范 xff08 OpenAPI Specification 简称OAS xff09 是Li
  • MySQL_基本的SELECT语句

    目录 SQL概念 xff1a SQL分类 xff1a SQL语言的规则与规范 xff1a SELECT的基本语句 我是ZGB xff0c Java领域新星创作者 xff0c 阿里云专家博主 xff0c 华为云 云享专家博主 xff0c 热衷
  • springcloud之gateway服务网关

    目录 微服务中网关的作用 gateway 与 zuul springcloud gateway 简介 相关概念 工作流程 特征 快速上手 Maven 依赖 application properties 配置文件 启动类 eureka cli
  • 4438无线网络组网代码解析

    device bind process 是怎么实现绑定的 xff1f enum NOSTATE UBIND 等待接收 握手一次1 WAIT FOR TOUCH WAIT FOR CONFIRM 点击按键后 回复一次2 BIND SUCCES
  • python—函数

    函数 定义和注意事项 将可能需要反复执行的代码封装为函数 xff0c 并在需要该功能的地方进行调用 xff0c 不仅可以实现代码复用 xff0c 更重要的是可以保证代码的一致性 xff0c 只需要修改该函数代码则所有调用均受到影响 设计函数
  • ROS安装gazebo教程及报错解决,并基于gazebo仿真环境实现机器人在复杂路径下自动导航(更新中)

    安装教程 xff1a 教程 70分钟入门gazebo 报错一 xff1a E Could not get lock var lib dpkg lock frontend open 11 Resource temporarily unavai
  • UCOSIII-消息队列

    目录 1 简介 1 1消息队列 xff08 异步通信方式 xff09 1 2消息池 2 结构体 2 1消息元素os msg 2 2消息池元素osmsgpool 全局变量 2 3消息队列结构体OS Q 2 4消息列表结构体OS MSG Q 3
  • 利用Nodemcu+Arduino nano+TB6612+点灯科技APP制作简易麦克纳姆轮Wi-Fi遥控小车

    摘要 麦克纳姆轮小车由于车轮本身的特殊结构 xff0c 可以实现全向行驶 xff0c 可玩性非常强 麦克纳姆轮原理在这里不做展开 xff0c 麦克纳姆小车主要是通过控制四个轮胎的转与不转以及转动的方向来实现多方向的运动 xff0c 其中一种
  • Collecting package metadata (current_repodata.json): fail亲测成功

    在Ubantu中创建anaconda虚拟环境时报错 xff1a Collecting package metadata current repodata json failed ProxyError Conda cannot proceed
  • Vue----模板渲染语法中使用JavaScript表达式

    文章目录 3 5 模板渲染语法中使用JavaScript表达式 3 5 模板渲染语法中使用JavaScript表达式 在vue提供的模板渲染语法中 xff0c 除了支持绑定简单的数据值外 xff0c 还支持JavaScript表达式运算 用
  • 树莓派下载Ubuntu20.04.3版本 +通过设置找到wifi标志+开启vnc远程桌面+灰屏解决方法

    貌似从19版本开始就下完之后右上角没有出现wifi标志 xff0c 在csdn上也十分难找到方法 xff0c 对于网线直连的 csdn上是有十分多的方法的 xff0c 大家可以去找找看 但是对于一开始就连wifi的方法似乎特别少 xff0c
  • 字符数组和字符串数组中的‘\0‘尾零存在的问题

    一 在字符和字符串中是否必须存在 答 xff1a 在字符数组中非必要存在 xff0c 但是在字符串数组中定义的时候必须存在 字符数组 1 并不要求它的最后一个字符为 39 0 39 xff0c 甚至可以不包括 39 0 39 xff0c 像
  • FreeRTOS学习笔记一

    FreeRTOS 任务不允许以任何方式从实现函数中返回 它们绝不能有一条 return 语句 void ATaskFunction void pvParameters int iVariableExample 61 0 for 传入NULL