01 FreeRTOS任务实例

2023-05-16

FreeRTOS任务实例

  • 一、简要说明
    • 1. 官方例程下载
  • 二、学习任务的创建
    • 1. 创建一个任务
    • 2. 任务中传递参数
    • 3. 不同优先级的任务
  • 三、任务的延时
    • 1.使用阻塞式延时
    • 2. 精确的任务定时
    • 3.低优先级任务无延时,高优先级延时

一、简要说明

   从这里开始正式进入实操环节,由于移植部分已经完成,为了加快学习部分,在以后的学习中都使用官方提供的VS2010项目作为学习的主要工具。

1. 官方例程下载

点击下载

下载完成就是一个压缩包,解压即可
在这里插入图片描述
解压完成打开后应该是下面这样,打开 .sln 文件(前提是下载有Microsoft Visual Studio工具)。
在这里插入图片描述
打开以后应该是下面这样
在这里插入图片描述
任意打开一个官方示例
在这里插入图片描述
双击 main.c 打开main文件单击键盘上的F5运行(可能会报错),如果报错按照下图处理
在这里插入图片描述

直接点击确定就可以
在这里插入图片描述

二、学习任务的创建

1. 创建一个任务

   打开第一个官方例程,在上一篇对任务的概述中已经有很详细的介绍了,这里只是简单一提。
在这里插入图片描述
创建一个任务
在这里插入图片描述
这就是上面创建的这个任务的具体实现,每隔一段事件就会打印 Task 1 is running 这个字符串在控制台上,例程中还类似的创建了另一个任务vTask2。
在这里插入图片描述
在任务2创建之后就启动了调度器 vTaskStartScheduler() 开始调度任务。
两个任务的优先级相同都是1,默认情况下是启用了时间片调度的
在这里插入图片描述
运行结果如下,任务1和任务2是交替运行的:
在这里插入图片描述

2. 任务中传递参数

   打开第二个官方例程 Example002 ,结合第一个例程来看,发现创建了两个任务,但是在创建的任务中,使用的确实同一个任务函数。
在这里插入图片描述
   但是多的是,在创建任务的同时向任务函数中传递了不同的参数。
在这里插入图片描述
   把视角切换到任务函数这边,可以发现他用了一个字符指针变量 pcTaskName 来存储了这个出入任务函数的参数,当然这是在已知传入的参数是字符串类型的才能这样一概而论,如果传入的参数类型是变动的是未知的但是可以预料的,那么直接传入一个固定类型的方式将不再适用,这是需要特别注意的。
在这里插入图片描述
   运行一下,结果与第一个例程有着一样的效果,但是代码量却少了不少,这不失为一种在工程应用开发中对与有着几乎一模一样的功能的任务提供的一种解决方案:
在这里插入图片描述

3. 不同优先级的任务

   在上面的两个例程中,两个任务的优先级都是相同的都是1,这几乎是最低的优先级了(前提是configMAX_PRIORITIES设置的比1大)
   打开第三个官方例程 Example003 ,Task1的优先级是1,Task2的有优先级是2,这两个的任务函数和第二个例程的任务函数相同。在这里插入图片描述
运行一下:
  发现任务1根本没有得到运行
在这里插入图片描述

  单片机中当下状态只能有一个任务在运行,在非阻塞式的任务中当然就只能运行高优先级的任务了,下面我们编写单片机的程序,观察一下是不是这么回事:
  唯一改变的是两个任务的函数部分
  故意把两个延时改成不相同的情况,这样会得到更加肯定的现象(只会有一个灯闪烁,而另一个灯是不会有任何变化的)
在这里插入图片描述

在这里插入图片描述

三、任务的延时

1.使用阻塞式延时

   打开官方例程 Example004 ,与之前不同是任务函数中使用了FreeRTOS官方的延时函数,这是一个具有阻塞式功能的延时,就是说当任务在延时的过程中,让出CPU的使用权,让调度器去选择当前高优先级的就绪任务去使用CPU。
在这里插入图片描述
   仔细一看,这里不是普通的一个250,这里是用了一个宏 pdMS_TO_TICKS 来接收的一个250,最后将计算的值给了变量xDelay250ms。
在这里插入图片描述
同样运行一下:
任务1又出来了,开始运行了。
在这里插入图片描述

   这个宏是什么呢,都干了哪些事呢?
   追寻一下,在 projdefs.h 中可以找到他的身影。在这里发现了一个宏定义的常量 configTICK_RATE_HZ ,在宏 pdMS_TO_TICKS 中是把接收的变量 xTimeInMs 和这个宏定义的常量 configTICK_RATE_HZ 的乘积再除以了一个1000。继续追寻宏定义的常量 configTICK_RATE_HZ 。(这里可以看到,官方怕这里定义的内容不适用于所有的场景,表示这个可以再 FreeRTOSConfig.h 这个文件中重写以至于适用在自己的应用上)
在这里插入图片描述
   追寻一下 configTICK_RATE_HZ 这个宏,这个宏在 FreeRTOSConfig.h 文件中可以找到。这是系统节拍时钟周期,决定着系统的中断频率。
  系统节拍中断服务程序会调用函数 xTaskIncrementTick() ,该函数返回值为真(不等于pdFALSE),说明处于就绪态任务的优先级比当前运行的任务优先级高。这会触发一次PendSV中断,进行上下文切换。

参考内容

在这里插入图片描述
   回过头来,宏 pdMS_TO_TICKS 主要的作用是将输入的 ms 时间转换为时钟节拍数。这正是 vTaskDelay() 这个函数的意义:延时多少个时钟节拍以后再运行当前的任务。

   这里用pc模拟依然看不出效果,还是在单片机上跑一跑吧,还是把延时调成不一样的,下载进开发板,可以明显发现另外一个灯开始闪烁了,这就是阻塞延时的效果。
在这里插入图片描述

2. 精确的任务定时

   打开官方例程 Example005。
在这里插入图片描述
运行一下:
在这里插入图片描述

   在这一个例程中使用了 vTaskDelayUntil() 这个函数,类似于 vTaskDelay()
   函数 vTaskDelay() 的参数用来指定任务在调用 vTaskDelay() 到切出阻塞态整个过程包含多少个心跳周期。任务保持在阻塞态的时间量由 vTaskDelay() 的入口参数指定,但任务离开阻塞态的时刻实际上是相对于 vTaskDelay() 被调用那一刻的。
   vTaskDelayUntil() 的参数就是用来指定任务离开阻塞态进入就绪态那一刻的精确心跳计数值。API 函数 vTaskDelayUntil() 可以用于实现一个固定执行周期的需求(当你需要让你的任务以固定频率周期性执行的时候)。由于调用此函数的任务解除阻塞的时间是绝对时刻,比起相对于调用时刻的相对时间更精确(即比调用 vTaskDelay() 可以实现更精确的周期性)。

  什么意思呢,就是说在 vTaskDelayUntil() 这个函数调用之前,就需要指定任务遇到延时进入就绪状态的那一刻的具体时钟数,时钟数一到任务立即进入就绪状态;而在 vTaskDelay() 这个函数中表示的是这个任务在遇到这个函数的时候需要时钟计数多少时钟再从这个函数之后继续运行,这显然不精准。

   最开始指定离开阻塞态进入就绪态那一刻的精确心跳计数值的函数是 xTaskGetTickCount() ,这个函数返回的变量 xLastWakeTime 将会在 vTaskDelayUntil() 这个函数中自动更新,而且最开始指定的心跳计数值只执行一次。

  使用 vTaskDelay() 无法保证它们具有固定的执行频率,因为这两个任务退出阻塞态的时刻相对于调用 vTaskDelay() 的时刻。通过调用 vTaskDelayUntil() 代替 vTaskDelay() ,把这两个任务进行转换,以解决这个潜在的问题。

在这里插入图片描述

   在简单的示例中,运行的结果和普通的延时效果几乎没有差别。

3.低优先级任务无延时,高优先级延时

  打开 Example006,main 函数内容如下,与前面的内容一样。
在这里插入图片描述
  不一样的是低优先级的实例任务中没有延时。
在这里插入图片描述
  而高一级优先级的实例任务中具有一个延时。
在这里插入图片描述

运行的效果也是几乎可以预见的,结果如下:
  高一级的任务在阻塞式延时的时候,将CPU的使用权让出来了,让给了优先级为1的两个任务,这两个具有相同的低优先级的任务是由时间轮片控制依次运行相同时间,但是一旦高优先级的任务处于就绪状态,就会打断低优先级任务的执行,从而让高优先级任务获得使用CPU的权利。
在这里插入图片描述

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

01 FreeRTOS任务实例 的相关文章

  • 基于HAL库的FREERTOS----------二.任务API函数

    任务API函数览概 CUBEMX对 做了API的封装 很多 的函数没有封装到位 可以用原函数调用 任务API函数分别介绍 1 uxTaskPriorityGet 此函数用来获取指定任务的优先级 要使用此函数的话宏 INCLUDE uxTas
  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • FreeRTOS系列

    本文主要介绍如何在任务或中断中向队列发送消息或者从队列中接收消息 使用STM32CubeMX将FreeRTOS移植到工程中 创建两个任务以及两个消息队列 并开启两个中断 两个任务 Keyscan Task 读取按键的键值 并将键值发送到队列
  • 【FreeRTOS】队列的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS打印任务对CPU的占有率

    1 配置RTOS 1 打开RTOS Config Parameter 找到Run Time And Task States gathering related definitions 使能GENERATE RUN TIME STATS US
  • 基于HAL库的FREERTOS----------一.任务

    FreeROTS 就是一个免费的 RTOS 类系统 这里要注意 RTOS 不是指某一个确定的系统 而是指一类系统 比如 UCOS FreeRTOS RTX RT Thread 等这些都是 RTOS 类操作系统 FreeRTOS 是 RTOS
  • FreeRTOS+CubeMX系列第一篇——初识FreeRTOS

    文章目录 一 关于FreeRTOS 二 FreeRTOS的特点 三 如何在CubeMX上配置FreeRTOS 四 FreeRTOS文档资料 五 同系列博客 一 关于FreeRTOS 1 什么是FreeRTOS FreeRTOS是一个迷你的实
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • FreeRTOS之软件定时器

    FreeRTOS之软件定时器 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 include sys h include delay h include usart h include led h in
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本
  • Arduino IDE将FreeRTOS用于STM32

    介绍 适用于STM32F103C8的FreeRTOS STM32F103C是一种能够使用FreeRTOS的ARM Cortex M3处理器 我们直接在Arduino IDE中开始使用STM32F103C8的FreeRTOS 我们也可以使用K
  • FreeRTOS死机原因

    1 中断回调函数中没有使用中断级API xxFromISR 函数 xSemaphoreGiveFromISR uart busy HighterTask 正确 xSemaphoreGive uart busy 错误 2 比configMAX
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • 单片机通信数据延迟问题排查

    1 问题说明 笔者在最近的项目中 发现系统的响应延迟较高 经过排查 排除了单片机运行卡死的问题 2 原因分析 具体排查过程这里就不细致说明了 直接给出排查后原因 任务执行周期规划不合理 导致freertos队列发送接收到的命令有延迟 为了便
  • FreeRTOS之系统配置

    1 FreeRTOS的系统配置文件为FreeRTOSConfig h 在此配置文件中可以完成FreeRTOS的裁剪和配置 在官方的demo中 每个工程都有一个该文件 2 先说一下 INCLUDE 开始的宏 使用 INCLUDE 开头的宏用来
  • FreeRTOSConfig.h 配置优化及深入

    本篇目标 基于上一篇的移植freertos stm32f4 freertos 上 修改 FreeRTOSConfig h 文件的相关配置来优化辅助 FreeRtos 的使用 并且建立一些基本功能 信号量 消息地列等 的简单应用位于 stm3
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • C++ freeRTOS任务,非静态成员函数的无效使用

    哪里有问题 void MyClass task void pvParameter while 1 this gt update void MyClass startTask xTaskCreate this gt task Task 204

随机推荐

  • MQTT协议简介及协议原理

    文章目录 MQTT协议MQTT协议简介MQTT通信模型MQTT客户端的功能 xff1a MQTT客户服务器功能 xff1a 消息主题与服务质量MQTT控制报文固定报头可变报头CONNECT报文CONNACK报文 有效载荷 MQTT协议 MQ
  • 你不得不看的图文并茂的MQTT协议通信过程!!!

    文章目录 MQTT连接服务器MQTT订阅主题MQTT发布消息服务质量等级 QoSQoS0的PUBLISH控制报文QoS1的PUBLISH控制报文QoS2的PUBLISH控制报文 取消订阅断开连接 MQTT连接服务器 客户端到服务器的网络连接
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient简介与使用

    文章目录 mqttclient简介与使用优势 xff1a 在线代码生成工具占用资源大小整体框架支持的平台版本问题版权和许可linux平台下测试使用安装cmake xff1a 测试程序编译 amp 运行编译成动态库libmqttclient
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient代码生产工具介绍

    文章目录 mqttclient代码生产工具介绍连接参数配置订阅主题相关的代码配置发布消息相关的代码配置生成代码 mqttclient代码生产工具介绍 mqttclient代码生产工具主要是用于配置MQTT的参数 xff0c 并且生成相应的代
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient配置及裁剪工具

    文章目录 mqttclient配置及裁剪工具salof相关的配置使用mqttclient裁剪配置工具 mqttclient配置及裁剪工具 MQTT TOPIC LEN MAX 配置客户端支持最大的主题名长度 xff0c 主题是支持通配符的
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient设计与实现方式

    文章目录 mqttclient设计与实现方式设计思想API接口MQTT客户端的核心结构mqttclient实现申请一个mqtt客户端释放已申请的mqtt客户端设置MQTT客户端的信息连接服务器订阅报文取消订阅发布报文内部线程核心的处理函数发
  • mqtt连接百度天工物接入平台

    文章目录 mqtt连接到百度天工物接入百度天工物接入简介使用百度天工物接入创建项目创建策略创建身份创建用户测试连接 MQTT软件测试连接手动安装相关的依赖包拉取mqttclient仓库简单介绍mqttclient仓库文件夹编译运行测试代码使
  • mqttclient连接到OneNET云平台

    文章目录 mqttclient连接到OneNET云平台使用OneNET测试连接手动安装相关的依赖包拉取mqttclient仓库简单介绍mqttclient仓库文件夹编译运行代码使用到的API mqttclient连接到OneNET云平台 有
  • 2022年最新《谷粒学院开发教程》:1 - 构建工程篇

    资料资料资料地址代码地址 后台管理系统目录前台展示系统目录1 构建工程篇7 渲染前台篇2 前后交互篇8 前台登录篇3 文件上传篇9 前台课程篇4 课程管理篇10 前台支付篇5 章节管理篇11 统计分析篇6 微服务治理12 项目完结篇 目录
  • MQTT移植到stm32开发板——使用RT-Thread操作系统

    文章目录 mqttclientENV介绍env工具下载安装通过env移植MQTT客户端打开 env 控制台打开env并更新软件包列表移植MQTT客户端 编写自己的代码 xff1a 连接参数配置订阅主题相关的代码配置发布消息相关的代码配置生成
  • MQTT移植到stm32开发板——使用TencentOS tiny操作系统

    mqttclient 一个高性能 高稳定性的跨平台MQTT客户端 一个高性能 高稳定性的跨平台MQTT客户端 xff0c 基于socket API之上开发 xff0c 可以在嵌入式设备 xff08 FreeRTOS LiteOS RT Th
  • MQTT移植到stm32开发板——使用FreeRTOS操作系统

    mqttclient 一个高性能 高稳定性的跨平台MQTT客户端 一个高性能 高稳定性的跨平台MQTT客户端 xff0c 基于socket API之上开发 xff0c 可以在嵌入式设备 xff08 FreeRTOS LiteOS RT Th
  • 深入了解C++多态的原理及实现方式

    文章目录 前言关于多态函数承载方式虚函数方式 前言 需要深入了解C C 43 43 语言的基础之上再看此文章 关于多态 具有多种形态 xff0c 调用同一个方法会随上下文不同而产生不同的结果 xff0c 多态有静态多态与动态多态两种 函数承
  • select、poll、epoll的原理与区别

    文章目录 前言同步I O异步I O阻塞I O非阻塞I O多路复用I Oselectselect整个处理过程如下select函数原型 xff1a select的缺点 pollepollepoll的原理epoll的操作模式epoll的函数epo
  • MQTT连接到阿里云物联

    连接到阿里云物联 既然懂得专门连接百度天工物接入 xff0c 那么连接阿里云物联其实也是一样的 xff0c 因为都是基于MQTT协议进行通信的 xff0c 首先打开阿里云物联 xff1a https iot console aliyun c
  • Ubuntu20 安装微信

    1 安装deepin wine span class token function git span clone span class token string 34 https gitee com wszqkzqk deepin wine
  • 如果让你设计哈希表.....

    先确定选题 xff0c 待写
  • STM32进阶之串口环形缓冲区实现

    如需转载请说明出处 xff1a STM32进阶之串口环形缓冲区实现 队列的概念 在此之前 xff0c 我们来回顾一下队列的基本概念 xff1a 队列 Queue xff1a 是一种先进先出 First In First Out 简称 FIF
  • 在ROS中实现基于darknet_ros的目标检测

    最近用自己的渣渣笔记本电脑跑了一下yolo目标检测在ROS中的实现 xff0c 实现了用摄像头进行目标检测的任务 以下为笔记 xff0c 防止遗忘 1 使用的环境和平台 Ubuntu 16 04 LTS 43 ROS 43 Yolo 2 实
  • 01 FreeRTOS任务实例

    FreeRTOS任务实例 一 简要说明1 官方例程下载 二 学习任务的创建1 创建一个任务2 任务中传递参数3 不同优先级的任务 三 任务的延时1 使用阻塞式延时2 精确的任务定时3 低优先级任务无延时 xff0c 高优先级延时 一 简要说