FreeRTOS任务调度与任务切换 | FreeRTOS八

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

目录

说明:

一、任务调度器

1.1、开启任务调度器函数

1.2、任务调度器实现步骤

1.3、xPortStartScheduler()函数

二、启动一个任务

2.1、prvStartFirstTask()函数

2.2、vPortSVCHandler()函数

三、任务切换

3.1、任务切换触发途径

3.2、PendSV中断触发任务切换步骤


说明:

关于内容:

1)以下内容多为概念了解与步骤分析

2)暂无个人示例代码,使用的是FreeRTOS的官方示例代码

3)若想移植代码测试的,请移步其它地方寻找,下文内容暂无个人示例代码供测试

关于其它:

1)操作系统:win 10

2)平台:keil 5 mdk

3)语言:c语言

4)板子:STM32系列移植FreeRTOS

一、任务调度器

1.1、开启任务调度器函数

名称:vTaskStartScheduler(),作用:启动任务调度器,当任务调度器启动后,FreeRTOS会开始进行任务的调度。

1.2、任务调度器实现步骤

1)创建空闲任务:prvldelTask

如下图1:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图1

2)创建软件定时器任务:xTimerCreateTimerTask(可选,不配置宏定义则不创建)

如下图2:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图2

3)关中断(会在启动第一个任务时开启)

如下图3:

FreeRTOS任务调度与任务切换 | FreeRTOS八

图3

4)初始化全局变量

如下图4,因为刚启动任务调度器,此时没有任务在运行,给等待时间为最大值8个F,如下图5:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图4FreeRTOS任务调度与任务切换 | FreeRTOS八

 图5

5)初始化任务运行时间统计功能的时基定时器

如下图6,实际上并没有实现功能,只是定义了一个接口:

FreeRTOS任务调度与任务切换 | FreeRTOS八

图 6

6)调用函数xPortStartScheduler完成任务调度器

如下图7:

FreeRTOS任务调度与任务切换 | FreeRTOS八

图7

1.3、xPortStartScheduler()函数

作用:完成启动任务调度器中与硬件框架相关的配置部分,以及启动第一个任务。

1)检测用户在FreeRTOSConfig.h文件中对中断的相关配置是否有误

如下图8,内容较多,截取部分:

FreeRTOS任务调度与任务切换 | FreeRTOS八

图8

2)配置PendSV和SysTick的中断优先级为最低优先级

如下图9,通过给寄存器赋值给优先级:

FreeRTOS任务调度与任务切换 | FreeRTOS八

图9

3)调用vPortSetupTimerlnterrupt()函数配置SysTick

图下图10:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图10

4)初始化临界区嵌套计数器为 0

如下图11:

FreeRTOS任务调度与任务切换 | FreeRTOS八

图11

5)调用函数prvStartFirstTask()函数启动第一个任务

如下图12:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图12

二、启动一个任务

如何启动一个任务?

        找到优先级最高的任务,将最高优先级任务的寄存器值放到CPU的寄存器中,就相当于启动了最高优先级的任务。

        例如:要启动的第一个任务是A,任务A的寄存器值,在创建时就保存在申请的任务堆栈中,将任务A堆栈的寄存器值取出,放到CPU寄存器上,即可。

注意:

1)中断产生时,硬件自动将PSR,PC(R15,程序计算器PC),LR(R14,连接寄存器),R12,R3-R0保存和恢复,而R4-R11需要手动保存和恢复。R12(MSP主栈堆指针-->中断、PSP进程栈堆指针)

2)进入中断后,硬件会强制使用MSP指针,此时LR(R14,连接寄存器)的值将会被自动更新为特殊的EXC_RETURN

2.1、prvStartFirstTask()函数

作用:初始化启动第一个任务前的环境,主要是重新设置MSP指针,并使能全局中断(开启PendSV)

什么是MSP指针?

        程序在运行过程需要一定的栈空间来保存局部变量等信息。当有信息保持到栈里面时,MCU会自动更新SP指针,ARM Cortex-M内核提供了两个栈空间。

MSP(主堆栈指针):由OS内核、异常服务例程以及需要所有特权访问的应用程序代码来使用;

PSP(进程堆栈指针):用于常规的应用程序代码(不处于异常服务例程中时);

在FreeRTOS中,中断使用MSP(主堆栈),中断以外使用PSP(进程堆栈)。

1)复位MSP初始值

如下图13:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图13

2)使能中断(开启中断)

如下图14:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图14

3)触发SVC中断(获取当前优先级最高的任务控制块pxCurrentTCP;将该任务的寄存器值出栈至CPU寄存器中;设置PSP;返回r14,执行第一个任务)

如下图15:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图15

2.2、vPortSVCHandler()函数

1)通过pxCurrentTCP获取优先级最高的就绪态任务的任务栈地址,优先级最高的就绪态任务是系统将要运行的任务

如下图16:

FreeRTOS任务调度与任务切换 | FreeRTOS八

图16

2)通过任务栈顶指针,将任务栈中的内容出栈到CPU寄存器中,任务栈中的内容在调用任务函数时已初始化,设置PSP值

图下图17:

FreeRTOS任务调度与任务切换 | FreeRTOS八

图17

3)设置控制中断寄存器值写0,允许中断

如下图18:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图18

4)R14在ISR中,记录了异常返回值EXC_RETURN

异常返回值EXC_RETURN合法值如下图19:

 FreeRTOS任务调度与任务切换 | FreeRTOS八

图19

三、任务切换

任务切换的本质是?

        CPU寄存器的切换(切换到那个任务的寄存器值,就是在运行那个任务)。

       

3.1、任务切换触发途径

相当于触发PnedSV中断的途径,如下:

1)滴答定时器触发

2)调用FreeRTOS的API函数触发,例如:portYIELD()

本质上是通过向中断控制和状态寄存器ICSR的bit28写入1挂起PendSV来启动PendSV中断。

3.2、PendSV中断触发任务切换步骤

1)当前PSP是正在运行的任务的栈指针,读取当前PSP进程指针,存入r0

2)压栈(也叫保存现场,从r0开始往下)

如下图20:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图20

3)获取当前最高优先级任务控制块

4)出栈(也叫恢复现场,把寄存器的值给CPU寄存器)

如下图21:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图21

5)更新切换后的任务栈指针给PSP(也就是把r0给PSP)

6)bx r14执行更新任务函数

3.3、任务切换实现函数

名称:__asm void xPortPendSVHandler( void ),作用:实现任务切换

实现步骤如下:

1)手动8字节对齐,给PSP,r0的值

如下图22:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图22

2)获取当前最高优先级任务

如下图23:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图23

3)获取当前任务最高优先级

如下图24:

FreeRTOS任务调度与任务切换 | FreeRTOS八

  图24

4)开中断

如下图25:

FreeRTOS任务调度与任务切换 | FreeRTOS八

5)压栈

如下图26:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图26

6)把栈顶给PSP

如下图27:

FreeRTOS任务调度与任务切换 | FreeRTOS八

 图27文章来源地址https://www.toymoban.com/news/detail-414053.html

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

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

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

相关文章

  • 初识FreeRTOS入门,对FreeRTOS简介、任务调度、内存管理、通信机制以及IO操作,控制两个led不同频率闪烁

    当代嵌入式系统的开发越来越复杂,实时性要求也越来越高。为了满足这些需求,开发者需要使用实时操作系统(RTOS),其中一个流行的选择是FreeRTOS(Free Real-Time Operating System)。本篇博客将详细介绍FreeRTOS的特性、任务调度、内存管理、通信机制以及一些示例代码。 FreeR

    2024年02月14日
    浏览(26)
  • FreeRTOS如何解决访问冲突/线程不安全(临界段、互斥锁、挂起调度、看门人任务)

    在多任务(多线程)系统中,存在一个隐患,那就是多线程的访问(在FreeRTOS中就是任务)。当一个任务A开始访问一个资源(外设、一块内存等),但是A还没有完成访问,B任务运行了,也开始访问,这就会造成数据破坏、错误等问题。 例如: 两个任务试图写入一个液晶显示

    2024年02月07日
    浏览(39)
  • 【09】FreeRTOS的时间片调度

       同等优先级任务 轮流地享有相同的 CPU 时间( 可设置 ), 叫时间片, 在FreeRTOS中,一个时间片就等于SysTick 中断周期 。在源码中,SysTick中断服务函数1ms中断一次,一个时间片就是1ms,滴答定时器SysTick的中断周期可以自己设置。 时间片调度运行举例: 运行条件: 1、创建

    2024年02月09日
    浏览(21)
  • 【学习日记】【FreeRTOS】调度器函数实现详解

    本文主要是对于 FreeRTOS 中调度器函数实现的详细解释,代码大部分参考了野火 FreeRTOS 教程配套源码,作了一小部分修改。 Cortex-M有两种栈空间,主堆栈和进程堆栈。 MSP 用于系统级别和中断处理的堆栈 MSP 用于保存中断发生时的堆栈状态以及在特殊操作(例如任务切换)期间

    2024年02月13日
    浏览(19)
  • 【Freertos基础入门】freertos任务的优先级

    本系列基于 stm32 系列单片机来使用freerots 任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS,它提供了强大的任务管理功能,让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能

    2024年02月13日
    浏览(24)
  • 二、FreeRTOS目录文件概述

    (1)官网下载FreeRTOS源码。 (2)FreeRTOS源码目录树。(由目录树生成工具zDirTree生成) (3)Demo目录。 Demo目录下是示例工程文件,以“芯片和编译器”组合成一个名字。 比如:CORTEX_STM32F103_Keil。 (4)Source目录。 Source根目录下是核心文件,这些文件是通用的。 Source/portable目录下是移植时

    2024年02月12日
    浏览(40)
  • FreeRTOS任务的挂起和恢复 | FreeRTOS四

    目录 说明: 一、任务挂起与恢复 1.1、什么是任务挂起 1.2、任务挂起函数 1.3、什么是任务恢复 1.4、任务恢复函数 1.5、什么是中断任务恢复函数 1.6、中断任务恢复函数 二、任务挂起与恢复实例代码(任务中) 2.1、主要代码 2.2、结果 三、任务挂起与恢复实例代码(中断中)

    2024年02月16日
    浏览(27)
  • 详解FreeRTOS:FreeRTOS任务管理程序设计思路(基础篇—9)

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

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

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

    2024年02月13日
    浏览(31)
  • 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日
    浏览(25)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包