01 FreeRTOS任务实例

这篇具有很好参考价值的文章主要介绍了01 FreeRTOS任务实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简要说明

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

1. 官方例程下载

点击下载

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

直接点击确定就可以
freertos例程,visual studio,powerpoint,c++

二、学习任务的创建

1. 创建一个任务

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

2. 任务中传递参数

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

3. 不同优先级的任务

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

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

freertos例程,visual studio,powerpoint,c++

三、任务的延时

1.使用阻塞式延时

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

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

参考内容

freertos例程,visual studio,powerpoint,c++
   回过头来,宏 pdMS_TO_TICKS 主要的作用是将输入的 ms 时间转换为时钟节拍数。这正是 vTaskDelay() 这个函数的意义:延时多少个时钟节拍以后再运行当前的任务。

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

2. 精确的任务定时

   打开官方例程 Example005。
freertos例程,visual studio,powerpoint,c++
运行一下:
freertos例程,visual studio,powerpoint,c++

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

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

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

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

freertos例程,visual studio,powerpoint,c++

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

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

  打开 Example006,main 函数内容如下,与前面的内容一样。
freertos例程,visual studio,powerpoint,c++
  不一样的是低优先级的实例任务中没有延时。
freertos例程,visual studio,powerpoint,c++
  而高一级优先级的实例任务中具有一个延时。
freertos例程,visual studio,powerpoint,c++

运行的效果也是几乎可以预见的,结果如下:
  高一级的任务在阻塞式延时的时候,将CPU的使用权让出来了,让给了优先级为1的两个任务,这两个具有相同的低优先级的任务是由时间轮片控制依次运行相同时间,但是一旦高优先级的任务处于就绪状态,就会打断低优先级任务的执行,从而让高优先级任务获得使用CPU的权利。
freertos例程,visual studio,powerpoint,c++文章来源地址https://www.toymoban.com/news/detail-625731.html

到了这里,关于01 FreeRTOS任务实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详解FreeRTOS:FreeRTOS任务管理程序设计思路(基础篇—9)

    目录 1、中断服务函数 2、任务 3、空闲任务 4、任务的执行时间 作为一位RTOS程序开发者,要对自己设计的嵌入式系统要了如指掌,任务的优先级信息,任务与中断的处理,任务的运行时间、逻辑、状态等都要知道,才能设计出好的系统,所以,在设计的时候需要根据需求制定

    2024年02月13日
    浏览(40)
  • 【学习FreeRTOS】第5章——FreeRTOS任务挂起与恢复

    vTaskSuspend() ——挂起任务(类似暂停,可恢复,但删除任务,无法恢复) vTaskResume() ——恢复被挂起的任务 xTaskResumeFromISR()—— 在中断中恢复被挂起的任务 形参:待挂起任务句柄 此函数用于挂起任务,使用时需将宏 INCLUDE_vTaskSuspend 配置为 1。 无论优先级如何,被挂起的任务

    2024年02月13日
    浏览(41)
  • FreeRTOS教程2 任务管理

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCOM V2.6串口助手 一个滑动变阻器 逻辑分析仪nanoDLA 本文主要学习FreeRTOS任务管理的相关知识, 包括FreeRTOS创建/删除任务、任务状态、任务优先级、延时函数、空闲任务和任务

    2024年03月12日
    浏览(44)
  • Freertos 任务调度

    文章目录 前言 一、任务调度 二、任务优先级 三、任务状态           用51单片机或者stm32进行裸机开发时, 一般都是在 main 函 数里面用 while(1) 做一个大循 环来完成所有的处理。而Freertos是一个抢占式的实时多任务操作系统,可以并发处理各个任务。   Freertos支持三种任

    2024年02月15日
    浏览(38)
  • FreeRTOS的任务堆栈

    一、 FreeRTOS的任务堆栈 在FreeRTOS中,每个任务都有自己的堆栈。堆栈是用来存储任务运行时临时变量、函数返回地址等数据的一段内存空间。堆栈的大小是通过xTaskCreate()函数的参数指定的,通常情况下需要根据任务所需的局部变量的大小及递归调用深度来合理设置。 FreeRTO

    2024年02月14日
    浏览(40)
  • FreeRTOS任务优先级

    FreeRTOS中任务的最高优先级是通过FreeRTOSConfig.h文件中的configMAX_PRIORITIES进行配置的,用户实际可以使用的优先级范围是0到configMAX_PRIORITIES – 1,建议用户配置宏定义configMAX_PRIORITIES的最大值不要超过32。 用户配置任务的优先级数值越小,那么此任务的优先级越低, 空闲任务的

    2023年04月09日
    浏览(56)
  • FreeRTOS-任务通知详解

    ✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页: @rivencode的个人主页 🔥系列专栏: 玩转FreeRTOS 💬保持学习、保持热爱、认真分享、一起进步!!! FreeRTOS越学越简单,前面已经把真实的队列、信号量、事件组全部学完,现在学

    2024年02月06日
    浏览(35)
  • FreeRTOS教程8 任务通知

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCOM V2.6串口助手 本文主要学习 FreeRTOS 任务通知的相关知识, 包括FreeRTOS中的通信手段、任务通知的优缺点、任务通知 API 函数等知识 一个 FreeRTOS 负责的系统中,总是存在很多

    2024年03月20日
    浏览(34)
  • FreeRTOS_任务切换

    目录 1. RendSV 异常 2. FreeRTOS 任务切换场合 2.1 执行系统调用 2.2 系统滴答定时器(SysTick)中断 3. PendSV 中断服务函数 4. 查找下一个要运行的任务 4.1 通用方法 4.2 硬件方法 5. FreeRTOS 的时间片调度 6. 时间片调度实验 6.1 实验程序         RTOS 系统的核心是任务管理,而任务管理的

    2024年02月12日
    浏览(38)
  • Freertos任务的管理是何物?

    提示:文章来自正点原子和野火 使用Freertos,创建任务,运行任务,必须知道怎么配置任务的状态,并将其修改运行的状态,做到想让哪个任务保证必须优先的情况下,也能保证其他任务的实时性。所以要知道任务有 几种运行状态 ,还要知道怎么修改任务的状态。 说白了就

    2024年02月15日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包