【UCOS-III】中断管理

引言:中断是学习 µC/OS-III 的过程中一个重要的部分,任务切换、系统时钟节拍等等,都是利用 中断来完成的,并且,既然是 RTOS,那么对中断的响应也应该是十分迅速的。µC/OS-III 有一 套中断管理的方法,并且在用户使用 µC/OS-III 的中断管理前,仅需进行少量的配置,使用起来 非常方便。

1 ARM Cortex-M 中断

中断是 CPU 的一种常见特性,中断一般由硬件产生,当中断发生后,会中断 CPU 当前正 在执行的程序而跳转到中断对应的服务程序中去执行,ARM Cortex-M 内核的 MCU 具有一个 用于中断管理的嵌套向量中断控制器(NVIC,全称:Nested Vectored Interrupt Controller)。
但是主要我还是想说一下涉及到堆栈中的理解:

保存处理器状态:当中断发生时,处理器会保存当前的处理器状态(包括程序计数器、寄存器内容等)到堆栈中。这样,在中断处理完成后,处理器能够恢复之前的状态,继续执行中断发生前的任务。

中断服务程序(ISR)的执行:在处理器转到中断服务程序时,ISR 可能会使用堆栈来保存和恢复局部变量、临时数据和调用其他函数的返回地址等。这是因为 ISR 需要一个干净的执行环境,不影响被中断的任务的执行状态。

嵌套中断处理:在某些情况下,中断服务程序可能会被更高优先级的中断再次中断。此时,处理器需要再次保存当前的处理器状态到堆栈中,以便在处理完高优先级中断后,能继续处理之前的中断。这种机制允许嵌套中断的处理,并且依赖于堆栈来管理多个中断的上下文切换。

恢复处理器状态:中断处理结束后,处理器会从堆栈中恢复先前保存的状态,这包括程序计数器和寄存器内容等。恢复处理器状态后,处理器能够继续执行被中断的任务,就像中断从未发生过一样。

2 µC/OS-III 中断配置项

ARM Cortex-M 使用 NVIC 对不同优先级的中断进行管理,首先看一下 NVIC 在 CMSIS 中 的结构体定义,如下所示:

typedef struct 
{ __IOM uint32_t ISER[8U] /* 中断使能寄存器 */ uint32_tRESERVED0[24U]; __IOM uint32_t ICER[8U]; /* 中断除能寄存器 */ uint32_tRSERVED1[24U]; __IOM uint32_t ISPR[8U]; /* 中断使能挂起寄存器 */ uint32_tRESERVED2[24U]; __IOM uint32_t ICPR[8U]; /* 中断除能挂起寄存器 */ uint32_tRESERVED3[24U]; __IOM uint32_t IABR[8U]; /* 中断有效位寄存器 */ uint32_tRESERVED4[56U]; __IOM uint8_t IP[240U]; /* 中断优先级寄存器 */ uint32_tRESERVED5[644U]; __OM uint32_t STIR; /* 软件触发中断寄存器 */
} NVIC_Type;

在 NVIC 的相关结构体中,成员变量 IP 用于配置外部中断的优先级,其定义如下所示:

__IOM uint8_t IP[240U]; /* 中断优先级寄存器 */

1. CPU_CFG_NVIC_PRIO_BITS 此宏用于定义中断优先级配置寄存器的实际使用位数,中断优先级配置寄存器实际使用到 多少比特位,这个宏就应该定义成多少,因为 STM32 的优先级配置寄存器都只使用到了高四比 特位,因此对于 STM32 而言,这个宏应该配置为 4。
2. CPU_CFG_KA_IPL_BOUNDARY 此宏用于定义受 µC/OS-III 管理的最高中断优先等级,中断优先级低于此宏定义值(中断 优先级数值大于此宏定义值)的中断受 µC/OS-III 管理。此宏定义的值可以根据用户的实际应 用场景来决定,本教程的配套例程源码全部将此宏定义配置为 4,即中断优先级为 4~15 的中断 由 µC/OS-III 管理,而中断优先级为 0~3 的中断不由 µC/OS-III 管理,如下图所示:

3 µC/OS-III 中断管理详解

PendSV 中断优先级配置 PendSV 主要用于任务切换,因此在 µC/OS-III 内核开始进行多任务处理前,也就是在 µC/OS-III 内核启动之前,就需要配置好 PendSV。在文件 os_cpu_a.asm 中有标号(汇编中的标 号,类似于 C 语言中的函数名)OSStartHighRdy,OSStartHighRdy 用于开启系统中第一个任务, 在函数 OSStart()中被调用。

SysTick 中断优先级配置 SysTick 主要用于为 µC/OS-III 内核提供时钟节拍,在调用函数 OSStart()后,需要调用函数 OS_CPU_SysTickInit()对 SysTick 进行配置,在对 SysTick 的配置过程中,就包括对 SysTick 中 断优先级的配置,函数 OS_CPU_SysTickInit()中对 SysTick 中断优先级的配置。

4 µC/OS-III 临界区

临界区指的是代码中的一些关键部分,临界区中代码的运行要求不能被打断,而中断或任 务切换都有可能打断临界区中正在运行的关键代码,那么就必须要通过屏蔽中断来保护临界区 中代码的执行。 µC/OS-III 提供了两个用于在进入临界区前屏蔽中断和在退出临界区后恢复中断的函数,这 两个函数为函数 CPU_CRITICAL_ENTER()和函数 CPU_CRITICAL_EXIT(),接下来分别来看一 下这两个函数。

5 µC/OS-III 中断嵌套计数器

在 µC/OS-III 中,会通过全局变量 OSIntNestingCtr 记录中断嵌套的次数,方便 µC/OS-III 判 断当前是否处于中断状态。当全局变量 OSIntNestingCtr 大于 0 的时候,就表示当前处于中断状 态,当全局变量 OSIntNestingCtr 等于 0 的时候,就表示当前不是处于中断状态。 全局变量 OSIntNestingCtr 是在中断服务函数中更新的,因此,µC/OS-III 提供了两个分别 用于中断服务函数前后的函数,分别为 OSIntEnter()和函数 OSIntExit()。其中函数 OSIntEnter() 只是简单地更新了全局变量 OSIntNestingCtr 的值,而函数 OSIntExit()除了更新全局变量 OSIntNestingCtr 的值,同时还会根据需要进行任务切换。 下面以 µC/OS-III 提供了 SysTick 的中断服务函数为例,展示函数 OSIntEnter()和函数 OSIntExit()的使用:
 

void OS_CPU_SysTickHandler(void) 
{ CPU_SR_ALLOC(); CPU_CRITICAL_ENTER(); /* 进入中断后,先调用函数 OSIntEnter() */ OSIntEnter(); CPU_CRITICAL_EXIT(); /* 中断服务函数的内容 */ OSTimeTick(); /* 中断返回前,调用函数 OSIntExit() */ OSIntExit(); 
} 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts组件x轴坐标显示不全解决方法

1.旋转: 修改前: option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun,Mon, Tue, Wed, Thu, Fri, Sat, Sun,Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [120, 200, 150, 80, 70, 110, 130,120, 200, 150, 80, 70, 1…

每日一练——删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣(LeetCode) int removeDuplicates(int* nums, int numsSize) {int i 0;int j 0;while(numsSize--){if(nums[i] ! nums[j]){i;nums[i] nums[j];j;}else j;}return i 1; }

Golang | Leetcode Golang题解之第142题环形链表II

题目: 题解: func detectCycle(head *ListNode) *ListNode {slow, fast : head, headfor fast ! nil {slow slow.Nextif fast.Next nil {return nil}fast fast.Next.Nextif fast slow {p : headfor p ! slow {p p.Nextslow slow.Next}return p}}r…

AI数据分析:根据Excel表格数据绘制柱形图

工作任务:将Excel文件中2013年至2019年间线上图书的销售额,以条形图的形式呈现,每个条形的高度代表相应年份的销售额,同时在每个条形上方标注具体的销售额数值 在deepseek中输入提示词: 你是一个Python编程专家&#…

eNSP学习——RIP的路由引入

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建公司B的RIP网络 3、优化公司B的 RIP网络 4、连接公司A与公司B的网络 需要eNSP各种配置命令的点击链接自取:华为eNSP各种设备配置命令大全PDF版_ensp…

[Leetcode]同时进行正向和逆向迭代匹配解决回文链表问题

题目链接:234. 回文链表 - 力扣(LeetCode) 题目: 题解: currentNode 指针是先到尾节点,由于递归的特性再从后往前进行比较。frontPointer 是递归函数外的指针。若 currentNode.val ! frontPointer.val 则返回 false。…

876. 链表的中间结点-链表

876. 链表的中间结点 - 力扣(LeetCode) 快慢指针 class Solution { public:ListNode* middleNode(ListNode* head) {ListNode* slow head;ListNode* fast head;while(fast ! nullptr && fast->next ! nullptr){slow slow->next;fast …

用MATLAB绘制地球围绕太远运动而月球围绕地球运动

绘制 MATLAB代码: clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;% 初始化参数 num_frames 1000; % 动画帧数 G200; dt 0.01; % 时间步长% 设置太阳、地球和月球的初始位置和半径 sun_position [0, 0]; earth_radius …

Leetcode881. 救生艇

Every day a Leetcode 题目来源:881. 救生艇 解法1:贪心 排序 双指针 排序后,使用双指针分别指向数组首尾,每次取两个指针指向的元素之和与 limit 比较,如果小于等于 limit,则两个指针同时向中间移动一…

Android Studio历史版本

android studio的历史版本

HQL面试题练习 —— 累加刚好超过各省GDP40%的地市名称

目录 1 题目2 建表语句3 题解 1 题目 现有各省地级市的gdp数据,求从高到底累加刚好超过各省GDP40%的地市名称,临界地市也需要。例如: 浙江省的杭州24% 宁波 20% ,杭州宁波44% 大于40% 取出杭州、宁波 江苏省的苏州19% 南京 14% 无锡 12%&am…

2.nginx常用命令

使用nginx命令需要进入nginx目录里面执行。 /usr/local/nginx/sbin/ 查看nginx的版本号 启动nginx ./nginx 关闭nginx ./nginx -s stop 查看nginx的是否运行的命令 重新加载nginx 针对配置目录中配置文件nginx.cnf修改后需要重新加载 /usr/local/nginx/conf/nginx.cnf …

【数学】各种图面积公式的推导

Hello!大家好,我是学霸小羊,今天讲讲面积公式。 1.长方形 长方形是 由无数条 长度为长方形的长(或宽)的线 组成的图形,这些线有多少根,我们不知道,只需要知道他们垒成了一个由高 宽…

Mysql执行一条语句都有哪些操作

Mysql的执行流程 MySQL 的架构共分为两层:Server 层和存储引擎层, Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外&#xf…

鸿蒙轻内核M核源码分析系列十九 Musl LibC

LiteOS-M内核LibC实现有2种,可以根据需求进行二选一,分别是musl libC和newlibc。本文先学习下Musl LibC的实现代码。文中所涉及的源码,均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_m 获取。LiteOS-M内核提供了和内核相关的…

基于小波样条框架的一维时间序列信号降噪方法(MATLAB R2018A)

1952年,DUFFIN在研究非调和Fourier级数时引入了Hilbert空间中框架的概念,然而并没有引起很大的反响。1986年,DAUBECHIES研究发现利用框架可以将L2(R)中的函数展开成类似标准正交基的级数,并且用框架研究函数时所需的条件要比用标准…

多态的应用——数组多态

介绍 ai查询 在Java中,动态数组通常通过ArrayList类来实现,它是Java集合框架(Java Collections Framework)的一部分。ArrayList是一个可调整大小的数组实现,提供了比标准数组更多的灵活性和功能。 以下是使用ArrayLis…

基于51单片机的MQ-2烟雾报警设计

随着现代家庭用火、用电量的增加,家庭烟雾发生的频率越来越高。烟雾报警器也随之被广泛应用于各种场合。本课题所研究的无线多功能烟雾报警器采用STC89C51为核心控制器,利用气体传感器MQ-2、ADC0832模数转换器、DS18B20温度传感器等实现基本功能。通过这些传感器和芯片,当环…

前端技术回顾系列 08|TS 泛型基础

在微信中阅读,关注公众号:CodeFit。 创作不易,如果你觉得这篇文章对你有帮助,请不要忘了 点赞、分享 和 关注 我的公众号:CodeFit,为我的持续创作提供一些动力。 上篇内容回顾:枚举(Enums) 在上篇文章中,我们详细回顾了 TypeScript 中的 枚举(Enums)。 枚举 是一…

设置路径别名

一、描述 如果想要给路径设置为别名,就是常见的有些项目前面的引入文件通过开头的,也就是替换了一些固定的文件路径,怎么配置。 二、配置 import { defineConfig } from vite import react from vitejs/plugin-react import path from path…