uCOS3实时操作系统(系统架构和中断管理)

文章目录

  • 系统架构
  • 中断管理
    • ARM中断寄存器相关知识
    • ucos中断机制

系统架构

  • ucos主要包含三个部分的源码:
    1、OS核心源码及其配置文件(ucos源码)
    2、LIB库文件源码及其配置文件(库文件,比如字符处理、内存管理)
    3、CPU板级源码及其配置文件(用于适配不同的开发板)
  • PendSV 中断的实现,裸机是不需要实现这个函数的,ucos的任务切换就是通过软件触发PendSV中断调用汇编函数 OSStartHighRdy 实现。
  • SysTick 中断的实现,裸机中通过此中断实现系统时钟HAL_TICK,ucos也是通过该中断调用 OS_CPU_SysTickHandler(); 实现。
  • 以上两个中断接口需要在中断向量表进行修改,注意SysTick的中断函数是自己手动实现不需要修改名称,添加 OS_CPU_SysTickHandler(); 即可,而PendSV 是ucos汇编源码实现,需要在中断向量表修改接口。

中断管理

ARM中断寄存器相关知识

  • 外部中断的优先级设置通过NVIC寄存器设置,ARM Cortex-M 的 NVIC 最大可支持 256 个中断源,其中包括 16 个系统中断和 240 个外部中断。然而芯片厂商一般情况下都用不完这些资源,以正点原子的战舰开发板为例,所使用的STM32F103ZET6 芯片就只用到了 10 个系统中断和 60 个外部中断
    ARM Cortex-M 使用了 8bit 位宽的寄存器来配置中断的优先级,这个寄存器就是中断优先级配置寄存器,因此中断优先级的配置范围就应该是 0 ~ 255。但是芯片厂商一般用不完这些资源,对于 STM32,只用到了中断优先级配置寄存器的高四位[7:4],低四位[3:0]取零处理,因此 STM32 提供了最大 2^4^=16 级(0~15) 的中断优先级等级
    进一步的,ARM Cortex-M 还使用了抢占优先级和子优先级的机制,在 STM32 上使用 µC/OS-III 时,使用中断优先级分组 4(NVIC_PriorityGroup_4)即优先级配置寄存器的高四位全部用于抢占优先级,不使用子优先级,那么这么一来只需要设置中断的抢占优先级即可。
  • 系统中断的优先级通过以下三个寄存器设置:
    在这里插入图片描述
  • 系统中断屏蔽主要通过三个寄存器实现:
    PRIMASK:PRIMASK 寄存器有 32bit,但只有 bit0 有效,是可读可写的,将 PRIMASK 寄存器设置为 1 用于屏蔽除 NMI 和 HardFault 外的所有异常和中断,将 PRIMASK 寄存器清 0 用于使能中断。
    FAULTMASK:FAULTMASK 寄存器有 32bit,但只有 bit0 有效,也是可读可写的,将 FAULTMASK寄存器设置为 1 用于屏蔽除 NMI 外的所有异常和中断,将 FAULTMASK 寄存器清零用于使能中断。
    BASEPRI:BASEPRI 有 32bit,但只有低 8 位[7:0]有效,也是可读可写的。 BASEPRI 寄存器比起 PRIMASK 和 FAULTMASK 寄存器直接屏蔽掉大部分中断的方式, BASEPRI 寄存器的功能显得更加细腻, BASEPRI 用于设置一个中断屏蔽的阈值,设置好 BASEPRI 后,中断优先级低于 BASEPRI 的中断就都会被屏蔽掉, µC/OS-III 就是使用 BASEPRI 寄存器来管理受 µC/OS-III管理的中断的,而不受 µC/OS-III 管理的中断,则不受 µC/OS-III 的影响。

ucos中断机制

  • 中断优先级可以理解为抢占优先级,任务优先级可以理解为子优先级

  • 在ucos中,PendSV的中断优先级设置为最低级16,因此只要其他任务中断优先级大于16,ucos就先执行中断里面的内容,然后才进行任务切换函数(只是个函数不是任务)

  • 在ucos中将 BASEPRI 设置为4,即受ucos控制的最高优先级为4

  • OS_CPU_SysTickInit() 对 SysTick 进行配置, 设置systick的中断优先级为4,systick中断优先级大于一切,毕竟是系统心跳,但是此处会出现一个问题(如果我们使用临界区包含关闭所有受ucos控制的中断的时候,系统时钟也不会发生中断)

  • 控制所有中断,将前面所提到的 PRIMASK 或者 FAULTMASK 置为 1 实现

    CPU_IntDis ; 关闭所有中断
    CPU_IntEn ; 打开所有中断
    

    在这里插入图片描述

  • 控制受ucos管理的中断,通过将BASEPRI的值设置为 4 或者 0 即可进行关闭和打开,0 即为打开所有中断,4 即为优先级大于4的关闭。

    #define  CPU_SR_ALLOC()             CPU_SR  cpu_sr = (CPU_SR)0
    CPU_SR_ALLOC(); /* 必须定义在所有局部变量之后 */
    CPU_SR_Save ; 保存中断状态,并关闭受 µC/OS-III 管理的中断
    CPU_SR_Restore ; 恢复中断状态
    

    在这里插入图片描述

  • 临界区包含(其实就是调用控制受ucos管理的中断的函数)

    CPU_SR_ALLOC(); /* 必须定义在所有局部变量之后 */
    /* 非临界区代码 */
    CPU_CRITICAL_ENTER(); /* 进入临界区 */
    /* 临界区代码 */
    CPU_CRITICAL_EXIT(); /* 退出临界区 */
    /* 非临界区代码 */
    
  • 锁定任务调度器,仅仅PendSV中断不产生

    OS_ERR err;
    OSSchedLock(&err); 锁定 uC/OS-III 的任务调度器
    OSSchedUnlock(&err); 恢复 uC/OS-III 的任务调度器
    
  • SysTick 的中断服务函数为例,展示函数 OSIntEnter() 和函数 OSIntExit() 的使用,函数 OSIntEnter() 只是简单地更新了全局变量 OSIntNestingCtr 的值, 而函数 OSIntExit() 除了更新全局变量OSIntNestingCtr 的值,同时还会根据需要进行任务切换。:

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

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

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

相关文章

前端api(请求后端)简易template

微信小程序 API 模块模板 基本 API 模块结构 /*** 示例API模块*/ const api require(../api); const config require(../../config/index);// 示例API对象 const exampleApi {// API方法定义... };// 导出模块 module.exports exampleApi;标准 RESTful 请求方法 获取列表…

leetcode 1035. Uncrossed Lines

题目描述 本题本质上就是求nums1和nums2的最长公共子序列的长度。因此本题本质上与第1143题一模一样。 代码&#xff1a; class Solution { public:int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {//本题等价于求nums1和nums2的最长公…

如何动态调整Python爬虫的Request请求延迟

引言 在网络爬虫开发中&#xff0c;合理控制请求延迟&#xff08;Request Delay&#xff09;是避免被封禁、提高爬取效率的关键。固定延迟&#xff08;如 **<font style"color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">time.sleep(1)</font…

QSS【QT】

文章目录 QSSid选择器 & 类型选择器伪类选择器盒子模型 QSS 设置样式的时候&#xff0c;是可以指定某个控件来设置的。 指定控件之后&#xff0c;此时的样式就会针对这个指定的控件&#xff0c;也会针对子控件生效 ui->pushButton_2->setStyleSheet("QPushButt…

学习笔记二十二—— 并发五大常见陷阱

⚠️ 并发五大常见陷阱 目录 数据竞争 (Data Race)死锁 (Deadlock)竞态条件 & 饿死现象 (Race Condition & Starvation)悬挂指针 (Dangling Pointer)重复释放 (Double Free)开发自查清单 1. 数据竞争 (Data Race) 专业定义 两个及以上线程在缺乏同步的情况下同时访问同…

ESP32- 开发笔记- 硬件设计-ESP32-C3基本电路

ESP32的最小电路 1 ESP32固件下载 ESP32 有多种下载(烧录)固件的方式,具体选择取决于开发环境和硬件连接。以下是常见的几种下载方式: 1.1 USB 串口下载(最常用) 适用场景:通过 USB 转串口芯片(如 CP2102、CH340)连接电脑,使用 esptool 或其他工具烧录固件。这里…

Qt6文档阅读笔记-RESTful API Server解析

本例使用QHttpServer创建RESTful API服务端。 此例接收REST风格的请求&#xff0c;与此例与之对应的客户端是RESTful Color Palette API client。 满足REST限制的API被称为RESTful风格的API。 RESTful API服务端一般包括&#xff1a;create、read、update、delete操作。 其中…

HarmonyOS 基础语法概述 UI范式

ArkUI框架 - UI范式 ArkTS的基本组成 装饰器&#xff1a; 用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。如上述示例中Entry、Component和State都是装饰器&#xff0c;Component表示自定义组件&#xff0c;Entry表示该自定义组件为入口组件&#xff0c;Stat…

Docker镜像基本概念与构建指南

Docker镜像基本概念与构建指南 一、Docker镜像基本概念 Docker镜像是容器运行的基础&#xff0c;包含应用程序及其运行所需的文件系统、依赖库、环境变量和配置。其核心特性包括&#xff1a; 只读性&#xff1a;镜像本身不可修改&#xff0c;容器运行时在镜像层之上创建可写…

如何避免 CDN 缓存泄漏用户隐私数据

CDN 通过将内容缓存到全球各地的边缘服务器上,显著缩短了数据传输的物理距离,从而加速了内容的交付。然而,这一技术在提升性能的同时,也悄然埋下了一颗隐私隐患的种子——缓存数据可能被不当访问或泄漏,进而暴露用户的敏感信息。 目录 禁用对用户个人信息的缓存 仅缓存…

软考中级数据库系统工程师学习资料分享

软考中级数据库系统工程师考试对于很多 IT 从业者和计算机专业的大学生来说&#xff0c;是一个重要的职业资格认证。它不仅能够提升个人的专业技能&#xff0c;还能为职业发展增添有力的砝码。今天&#xff0c;我将为大家分享一套全面且实用的学习资料&#xff0c;帮助大家更好…

数据处理: 均值漂移聚类(Mean Shift)

一、 基本原理 Mean Shift是一种基于密度的非参数聚类算法&#xff0c;不需要预先指定簇的数量&#xff0c;而是通过寻找数据空间中密度最大的区域来自动确定聚类中心, 适合图像分割和目标跟踪等。 算法步骤 初始化&#xff1a;对每个数据点作为起点。 迭代&#xff1a;计算…

辛格迪客户案例 | 苏州富士莱医药GMP培训管理(TMS)项目

一、案例概述 富士莱医药股份有限公司位于美丽的江南水乡常熟&#xff0c;前身为常熟富士莱医药化工有限公司&#xff0c;从建厂初期面积仅有10余亩&#xff0c;逐步扩展到100余亩。近年来公司飞速发展&#xff0c;以黑马姿态发展成为中国专业生产硫辛酸系列产品、肌肽系列产品…

SQL注入相关知识

一、布尔盲注 1、布尔盲简介 布尔盲注是一种SQL注入攻击技术&#xff0c;用于在无法直接获取数据库查询结果的情况下&#xff0c;通过页面的响应来判断注入语句的真假&#xff0c;从而获取数据库中的敏感信息 2、布尔盲注工作原理 布尔盲注的核心在于利用SQL语句的布尔逻辑…

Linux基础学习--linux的文件权限与目录配置

linux的文件权限与目录配置 1.用户与用户组 在Linux中&#xff0c;每个文件都有相当多的属性和权限&#xff0c;其中最重要的概念就是文件的拥有者。 1.1 文件拥有者 Linux是一个多人多任务的系统&#xff0c;常常有多人共用一台主机的情况出现&#xff0c;因此在系统中可以…

【数据可视化-19】智能手机用户行为可视化分析

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个…

vue项目通过GetCapabilities获取wmts服务元数据信息并在openlayers进行叠加显示

vue项目通过openlayers加载wmts服务示例&#xff1a; <template><div id"map" ref"mapContainer"></div> </template><script> import ol/ol.css; import Map from ol/Map; import View from ol/View; import TileLayer fr…

JavaWeb学习打卡-Day1-分层解耦、Spring IOC、DI

三层架构 Controller&#xff08;控制层&#xff09;&#xff1a;接收前端发送的请求&#xff0c;对请求进行处理&#xff0c;并响应数据。Service&#xff08;业务逻辑层&#xff09;&#xff1a;处理具体的业务逻辑。DAO&#xff08;数据访问层/持久层&#xff09;&#xff…

【含文档+PPT+源码】基于Python爬虫二手房价格预测与可视化系统的设计与实现

项目介绍 本课程演示的是一款基于Python爬虫二手房价格预测与可视化系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项…

游戏引擎学习第229天

仓库:https://gitee.com/mrxiao_com/2d_game_5 回顾上次内容并介绍今天的主题 上次留下的是一个非常简单的任务&#xff0c;至少第一步是非常简单的。我们需要在渲染器中加入排序功能&#xff0c;这样我们的精灵&#xff08;sprites&#xff09;才能以正确的顺序显示。为此我…