FreeRTOS中断、临界区和任务调度器

一、中断

中断是 CPU 的一种常见特性,中断一般由硬件产生,当中断发生后,会中断 CPU 当前正
在执行的程序而跳转到中断对应的服务程序种去执行,ARM Cortex-M 内核的 MCU 具有一个
用于中断管理的嵌套向量中断控制器
NVIC。ARM Cortex-M 的 NVIC 最大可支持 256 个中断源,其中包括 16 个系统中断和 240 个外部中断。

中断优先级配置寄存器的值与对应的优先等级成反比,即中断优先级配置寄存器的值越小,中断的优先等级越高。

STM32 的中断优先级可以分为抢占优先级和子优先级。抢占优先级:抢占优先级高的中断可以打断正在执行但抢占优先级低的中断,即抢占优先级支持中断嵌套。子优先级:抢占优先级相同时,子优先级高的中断不能打断正在执行但子优先级低的中的中断,即子优先级不支持中断嵌套


二、临界区

 宏 taskENTER_CRITICAL()

此宏用于在非中断中进入临界区,展开后是函数 vPortEnterCritical(),函数vPortEnterCritical() 的代码如下所示:

void vPortEnterCritical( void )
{
    /* 关闭受 FreeRTOS 管理的中断 */
    portDISABLE_INTERRUPTS();

    /* 临界区支持嵌套 */
    uxCriticalNesting++;

    if( uxCriticalNesting == 1 )
    {
        /* 这个函数不能在中断中调用 */
        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
    }
}

从上面的代码中可以看出,函数 vPortEnterCritical()进入临界区就是关闭中断,当然了,不受 FreeRTOS 管理的中断是不受影响的。还可以看出,FreeRTOS 的临界区是可以嵌套的,意思
就是说,在程序中可以重复地进入临界区,只要后续重复退出相同次数的临界区即可。  

宏 taskEXIT_CRITICAL()

此宏用于从非中断中退出临界区,此宏展开后是vPortExitCritical(),函数vPortExitCritical()的代码如下所示:

void vPortExitCritical( void )
{
    /* 必须是进入过临界区才能退出 */
    configASSERT( uxCriticalNesting );

    uxCriticalNesting--;

    if( uxCriticalNesting == 0 )
    {
        /* 打开中断 */
        portENABLE_INTERRUPTS();
    }
}

这个函数就很好理解了,就是将用于临界区嵌套的计数器减 1,当计数器减到 0 的时候,
说明临界区已经没有嵌套了,于是调用函数 portENABLE_INTERRUPT()打开中断。在函数的一
开始还有一个断言,这个断言用于判断用于临界区嵌套的计数器在进入此函数的不为 0,这样
就保证了用户不会在还未进入临界区时,就错误地调用此函数退出临界区。

三、任务调度器

1、FreeRTOS 中提供的任务调度器是基于优先级的全抢占式调度:在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的。

2、函数 vTaskStartScheduler()用于启动任务调度器,任务调度器启动后,FreeRTOS 便会开始进行任务调度,除非调用函数 xTaskEndScheduler()停止任务调度器,否则不会再返回。也就是说调用vTaskStartScheduler函数启动任务调度器之后不会执行函数后面的语句

3、挂起任务调度器,禁止任务的调度和切换,执行内容不允许被其他内容打断,但是中断可以正常打断执行的内容。挂起任务调度器主要是防止任务与任务之间的资源抢夺。与临界区不一样的是,挂起任务调度器,未关闭中断;任务调度器仅仅是防止了任务之间的资源争夺,中断照样可以直接响应;

vTaskSuspendAll() ;
/*代码*/
xTaskResumeAll()    ;

4、 vTaskStartScheduler()主要做了六件事情
(1) 创建空闲任务,根据是否支持静态内存管理,使用静态方式或动态方式创建空闲任务。
(2) 创建定时器服务任务,创建定时器服务任务需要配置启用软件定时器,创建定时器服务
任务,同样是根据是否配置支持静态内存管理,使用静态或动态方式创建定时器服务任务。   (3)关闭中断,使用 portDISABLE_INTERRUPT()关闭中断,这种方式只关闭受 FreeRTOS 管
理的中断。关闭中断主要是为了防止 SysTick 中断在任务调度器开启之前或过程中,产生中断。
FreeRTOS 会在开始运行第一个任务时,重新打开中断。
(4)初始化一些全局变量,并将任务调度器的运行标志设置为已运行
(5)初始化任务运行时间统计功能的时基定时器,任务运行时间统计功能需要一个硬件定时
器提供高精度的计数,这个硬件定时器就在这里进行配置,如果配置不启用任务运行时间统计
功能的,就无需进行这项硬件定时器的配置。
(6)最后就是调用函数 xPortStartScheduler()。

四、 NVIC异常类型

五、总结

进入临界区只是关闭了freeRTOS管理的中断,通过配置freertosconfig.h中的宏 configMAX_SYSCALL_INTERRUPT_PRIORITY (配置 FreeRTOS 可管理的最高优先级的中断,值为5),所以进入临界区之后中断优先级大于5的都可以打断临界区的运行。然后任务切换也可以打断临界区的运行

挂起任务调度器只是关闭了任务的调度和切换,但是此时中断都可以打断此任务的运行

优先级最小的中断>优先级最大的任务  中断是数字越小优先级越高,任务优先级是数字越大优先级越高

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/275615.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据库】为什么要分库分表

为什么要分库分表 1.为什么要分库分表?2.垂直拆分3.水平拆分4.总结4.1 逻辑库和物理库4.2 逻辑表和物理表 1.为什么要分库分表? 随着近些年信息化大跃进,各行各业无纸化办公产生了大量的数据,而越来越多的数据存入了数据库中。当…

Vue 问题解决

一、问题:TypeError: (0 , _message.default) is not a function 当没有default时,在其他页面import引入的时,必须加{}。 二、问题:Vue前端页面的表格数据总是一行一行的显示 使用Async/Await来解决前端数据一行一行显示的问题。可以将获取部…

python 实现粒子群算法(带绘制)

本文章用python实现了粒子群算法, 标准PSO的算法流程如下: 初始化一群微粒(群体规模为m),包括随机的位置和速度;评价每个微粒的适应度;对每个微粒,将它的适应值和它经历过的最好位…

众和策略股市行情分析:股票开户后什么时候能交易?

股票开户后什么时候能生意? 股票开户后不才一生意日便能正常展开生意操作,包含申报股票生意及非生意事务。假设投资者是周五或接近节假期时结束的开户,就要不才周一或假期结束后才华进行生意。 当然,假设投资者注册的是一些特别…

BDD - Python Behave 配置文件 behave.ini

BDD - Python Behave 配置文件 behave.ini 引言behave.ini配置参数的类型配置项 behave.ini 应用feature 文件step 文件创建 behave.ini执行 Behave 引言 前面文章 《BDD - Python Behave Runner Script》就是为了每次执行 Behave 时不用手动敲一长串选项,其实还有…

《深入理解C++11:C++11新特性解析与应用》笔记四

第四章 新手易学,老兵易用 4.1 右尖括号>的改进 在 C98 中,有一条需要程序员规避的规则:如果在实例化模板的时候出现了连续的两个右尖括号 >,那么它们之间需要一个空格来进行分隔,以避免发生编译时的错误。C98 会将>&g…

【量化】蜘蛛网策略复现

文章目录 蜘蛛网策略研报概述持仓数据整理三大商品交易所的数据统一筛选共有会员清洗数据计算研报要求数据全部代码 策略结果分析无参数策略有参数策略正做反做 MSD技术指标化 蜘蛛网策略 策略来自《东方证券-股指期货趋势交易之蜘蛛网策略——从成交持仓表中捕捉知情投资者行为…

腾讯云轻量应用服务器详细介绍

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器,CPU内存带宽配置高并且价格特别优惠,轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年,540元三年、2核4G5M带宽218元一年,756元3年、4核8G12M带宽646元15个月等&#xf…

Linux操作系统:LVM与磁盘配额

目录 一、LVM逻辑卷管理基础 1、LVM逻辑卷管理的概念 2、LVM逻辑卷管理的核心组件 3、LVM逻辑卷管理的优势 4、LVM逻辑卷管理的命令 4.1 扫描命令的用法 4.1.1 pvscan 4.1.2 vgscan 4.1.3 lvscan 4.2 查看命令的用法 4.2.1 pvdisplay 4.2.2 vgdisplay 4.2.3 lvdis…

12.27_黑马数据结构与算法笔记Java(补2)

目录 279 0-1 背包问题 动态规划 实现 280 0-1 背包问题 动态规划 降维 281 完全背包问题 动态规划 分析 282 完全背包问题 动态规划 实现 283 零钱兑换问题 动态规划 分析 284 零钱兑换问题 动态规划 实现 285 零钱兑换问题 动态规划 降维 286 零钱兑换II 动态规划 分析…

【idea】运行工程时候卡了许久Java Method Breakpoints

老以为是数据库连接不上,此问题概率性小,操作上面不小心打了断点… 应该是打断点的时候,打到了方法上面,去掉哟 Java Method Breakpoints

C++day2作业

把课上strcut的练习&#xff0c;尝试着改成class #include <iostream>using namespace std; class Stu { private:int age;string sex;int hign; public:int soce;void get_information();void set_information(); }; void Stu::set_information() {static Stu s1;cout …

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

「从红月开始」运输公司遭精神污染,小十七救哥哥,事发地陷危机

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《从红月开始》第3集超前爆料&#xff0c;本次透露陆辛首次被派遣去调查精神污染的任务。他的目的地是四方运输公司&#xff0c;一个主要由亡命之徒组成的组织。他们表面上从事运输业务&#xff0c;但背地里进行偷渡和走私活动。 …

【CSAPP】探究BombLab奥秘:Phase_2的解密与实战

&#x1f4cb; 前言 ​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《斯坦福大学之CSAPP》⏰诗赋清音&#xff1a;桃花灼灼春风暖&#xff0c;心随乐曲扬徐徐。 苦尽甘来梦未阑&#xff0c;岁月长河任舟游。 ​ &#x1f389;欢迎…

cnPuTTY 0.80.0.1—PuTTY Release 0.80中文版本简单说明~~

2023-12-18 官方发布了PuTTY 0.80本次发布主要是针对Terrapin攻击(CVE-2023-48795)的修改发布。 更多详细的内容请查看PuTTY Change Log。 有关Terrapin攻击可用简单参考&#xff1a;警告&#xff01;&#xff01;&#xff01;Terrapin攻击(CVE-2023-48795)~~~ 为了缓解此漏洞…

【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

一、通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗&#xff1f; 如果你进行的矩阵乘法涉及一个线性方程组 Ax b&#xff0c;并且你乘以一个可逆矩阵 M&#xff0c;且产生新的方程组 M(Ax) Mb&#xff0c;那么这两个系统是等价的&#xff1b;它们具有相同的解集。这…

【unity3D-粒子系统】粒子系统主模块-Particle System篇

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的粒子系统主模块-Particle System 基础知识 Particle System 介绍&#xff1a;粒子系统的主模块&#xff0c;是必需的模块&#x…

在线客服系统推荐:提升客户满意度与工作效率的利器

客服系统分为售前和售后&#xff0c;售前客户系统是为了能够及时解决客户在购买产品前的问题&#xff0c;通过客服人员让客户了解产品的功能点是能够满足他们的需求点&#xff0c;从未达到转化的目的。 而售后客户系统主要是提供给购买后的客户强大的产品售后支持&#xff0c;…

PiflowX组件-DataGen

DataGen组件 组件说明 按数据生成规则模拟数据。在开发和演示场景下使用比较方便。具体可以查看Flink官方DataGen connector。 计算引擎 flink 有界性 字段的数据全部生成完成后&#xff0c;source 就结束了。 因此&#xff0c;有界性取决于字段的有界性。 组件分组 co…