首页 > 其他分享 >FreeRTOS学习:任务调度

FreeRTOS学习:任务调度

时间:2024-08-18 14:58:40浏览次数:16  
标签:函数 FreeRTOS 中断 PendSV 学习 任务 寄存器 任务调度

 注:在使用大多数功能时,FreeRTOS都要将对应的宏置为1,具体的需要查看FreeRTOS官方文档。 

任务堆栈相关寄存器如下,

启动第一个任务

FreeRTOS中启动第一个任务的流程总结如下,

  1. 启动任务调度器vTaskStartScheduler()
  2. 在该函数中会创建空闲任务prvIdleTask软件定时器任务xTimerCreateTimerTask(可选)
  3. 关闭中断,主要是为了防止其他中断打断第一个任务的启动
  4. 初始化一些全局变量
  5. 初始化任务运行时间统计功能(这个功能详解可以看后续文章)
  6. 调用函数启动任务调度器xPortStartScheduler()

xPortStartScheduler()的流程如下,

  1.  配置PendSV和SysTick的中断优先级位最低优先级
  2. 调用函数vPortSetupTimerInterrupt()配置SysTick
  3. 调用函数使能FPU(Cortex_M3内核没有)
  4. 调用prvStartFirstTask()函数启动第一个任务,该函数的流程为:首先复位MSP指针(后面会介绍)的初始值并使能中断,然后触发SVC中断。在SVC中断中,首先获取任务优先级最高的任务控制块pxCurrentTCB并将该任务的寄存器值出栈到CPU寄存器中,然后设置PSP指针(后面会讲),最后返回r14寄存器执行第一个任务。

MSP和PSP指针介绍

MSP(主堆栈指针):由OS内核,异常服务例程及需要特权访问的应用程序使用,在FreeRTOS中用于中断以内使用。 

PSP(进程堆栈指针):用于常规的应用程序代码,在FreeRTOS中用于中断以外使用。 

SVC中断服务函数介绍

任务切换 

        任务切换的所有流程都是在PendSV中断中进行,触发PendSV中断有两个方式,一是滴答定时器中断触发,二是API函数portYIELD()触发。FreeRTOS中其他API函数的PendSV中断触发本质都是使用portYIELD(),该函数内部就是将ICSR寄存器的bit28进行置1的操作(详细看Cortex_M3的手册)。

任务切换流程如下,

建议在学习的朋友对照源码一起学习,效果更加。

时间片调度

时间片调度针对的是同等优先级的任务,让它们可以轮流的享有相同的CPU时间,这个时间可以通过设置滴答定时器的频率来设置。在FreeRTOS中,一个时间片等于SysTick中断周期。

备注:

  • 同等优先级任务轮流执行,时间片流转
  • 一个时间片大小,取决于滴答定时器的中断频率
  • 注意没有用完的时间片不会再使用,下次任务依然按照一个时间片执行

标签:函数,FreeRTOS,中断,PendSV,学习,任务,寄存器,任务调度
From: https://blog.csdn.net/kkbbaaii/article/details/141299014

相关文章

  • 零基础学习人工智能—Python—Pytorch学习(五)
    前言上文有一些文字打错了,已经进行了修正。本文主要介绍训练模型和使用模型预测数据,本文使用了一些numpy与tensor的转换,忘记的可以第二课的基础一起看。线性回归模型训练结合numpy使用首先使用datasets做一个数据X和y,然后结合之前的内容,求出y_predicted。#pipinstallmatp......
  • DP学习笔记
    动态规划算法与分治法类似,是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始......
  • tarjan之LCA学习笔记
    tarjan之LCA学习笔记tarjan算法求LCA可谓是一个极其巧妙的离线算法其本质是利用DFS遍历时产生的DFS序和并查集来在线性的时间复杂度内求出所有询问的结果既然是离线算法,其和在线算法的区别就在与离线算法需要记录下所有查询,对查询进行一定操作来得到更高的效率,而这......
  • C语言学习————常量和宏、初识指针
    #define定义常量和宏define是一个预处理指令用途:1.define定义符号#defineMAX1000intmain(){ printf("%d\n",MAX); return0;}2.define定义宏#defineADD(X,Y)((X)+(Y))intmain(){ printf("%d\n",ADD(2,3)); return0;}指针内存内存是计算机上特......
  • 【防忘笔记】Spring+Struts2古董框架学习
    Spring+Struts2项目框架梳理若基于Spring+Struts2的方式进行开发,前后端的交互逻辑会与boot系以及MCV的组织结构有所不同这里是对于学习过程的一些记录前置通用知识Struts2框架资料Struts2基础篇之基本概念Java之struts2框架学习一般情况的Spring前后端调试流程要理解基于......
  • ssy中学暑假集训有关数学及多项式学习笔记
    8.16日集训倒数第\(7\)天唉,不知不觉间在ssy中学的暑假集训就要结束了,只剩下一周的时间了,然而byn和yzh还有bao学姐\(21\)号就要走了,暑假就要过去了....今天模拟赛的第二题很有意思,涉及到了许多的数学知识,正好来恶补一下:浅谈反演原理和二项式反演首先来说说什么是反演(inversio......
  • 越权漏洞学习-做你做不了的事情
    原文链接:https://blog.csdn.net/weixin_49349476/article/details/131362007(一)、什么是越权漏洞1、了解越权漏洞:越权漏洞是指一个用户或者一个攻击者通过利用系统中某一漏洞,可以获得超过其正常权限的权限。也就是说,越权漏洞会使攻击者能够执行未经授权的操作或访问受保护的资源......
  • 学习-zabbix架构及术语
    Zabbix组成架构ZabbixServerzabbixserver是agent程序报告系统可用性、系统完整性和统计数据的核心组件、是所有配置信息、统计信息和操作数据的核心存储器zabbix数据库存储所有配置信息和zavvix收集到的数据都被存储再数据库中zabbixweb界面为了从任何地方和任何......
  • [学习笔记]Python学习3——变量
                    上一篇笔记对Python环境进行了简介,了解了其组成以及相关概念。        公众号端:[学习笔记]Python学习2——Python环境https://mp.weixin.qq.com/s?__biz=MzkwMjc0MTE3Mw==&mid=2247483706&idx=1&sn=b0904c6b019c0a010fd85ab992efc......
  • DataWhale AI夏令营-大模型微调-学习笔记3
     Task1:从零入门大模型微调一、问题概述从零入门大模型微调是Datawhale2024年AI夏令营第四期的学习活动(“大模型技术”方向),基于讯飞开放平台“星火大模型驱动阅读理解题库构建挑战赛”开展的实践学习。学习内容:基于讯飞大模型定制训练平台和spark-13b微调模型,生成高考......