当前位置: 首页 > article >正文

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();
    }
    

相关文章:

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

文章目录 系统架构中断管理ARM中断寄存器相关知识ucos中断机制 系统架构 ucos主要包含三个部分的源码: 1、OS核心源码及其配置文件(ucos源码) 2、LIB库文件源码及其配置文件(库文件,比如字符处理、内存管理&#xff0…...

图像预处理-图像噪点消除

一.基本介绍 噪声:指图像中的一些干扰因素,也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。 滤波器:也可以叫做卷积核 - 低通滤波器是模糊,高通滤波器是锐化 - 低通滤波器就…...

6.数据手册解读—运算放大器(二)

目录 6、细节描述 6.1预览 6.2功能框图 6.3 特征描述 6.3.1输入保护 6.3.1 EMI抑制 6.3.3 温度保护 6.3.4 容性负载和稳定性 6.3.5 共模电压范围 6.3.6反相保护 6.3.7 电气过载 6.3.8 过载恢复 6.3.9 典型规格与分布 6.3.9 散热焊盘的封装 6.3.11 Shutdown 6.4…...

用 Deepseek 写的uniapp油耗计算器

下面是一个基于 Uniapp 的油耗计算器实现&#xff0c;包含 Vue 组件和页面代码。 1. 创建页面文件 在 pages 目录下创建 fuel-calculator 页面&#xff1a; <!-- pages/fuel-calculator/fuel-calculator.vue --> <template><view class"container"…...

thinkphp实现图像验证码

示例 服务类 app\common\lib\captcha <?php namespace app\common\lib\captcha;use think\facade\Cache; use think\facade\Config; use Exception;class Captcha {private $im null; // 验证码图片实例private $color null; // 验证码字体颜色// 默认配置protected $co…...

【k8s系列4】工具介绍

1、虚拟机软件 vmware workstation 2、shell 软件 MobaXterm 3、centos7.9 下载地址 &#xff08;https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.374bf5adOaiFPW&#xff09; 4、上网软件...

微博辐射源和干扰机

微波辐射源和干扰机是电子战和通信领域中的两个重要概念&#xff0c;它们在军事、民用及科研中具有广泛应用。以下是两者的详细解析及其相互关系&#xff1a; ‌1. 微波辐射源‌ ‌定义‌&#xff1a; 微波辐射源是指能够主动发射微波&#xff08;频率范围通常为 ‌300 MHz&…...

计算机网络——网络模型

一、OSI七层模型 &#xff08;1&#xff09;客户端发送请求时 OSI 七层模型的运作流程 应用层&#xff08;Application Layer&#xff09; 用户通过浏览器输入URL&#xff08;如https://example.com&#xff09;&#xff0c;根据协议类型&#xff08;HTTP/HTTPS&#xff09;确…...

Spark-SQL核心编程2

路径问题 相对路径与绝对路径&#xff1a;建议使用绝对路径&#xff0c;避免复制粘贴导致的错误&#xff0c;必要时将斜杠改为双反斜杠。 数据处理与展示 SQL 风格语法&#xff1a;创建临时视图并使用 SQL 风格语法查询数据。 DSL 风格语法&#xff1a;使用 DSL 风格语法查询…...

Java 序列化与反序列化终极解析

Java 序列化与反序列化终极解析 1. 核心概念 (1) 什么是序列化&#xff1f; 定义&#xff1a;将对象转换为字节流的过程&#xff08;对象 → 字节&#xff09; 目的&#xff1a; 持久化存储&#xff08;如保存到文件&#xff09; 网络传输&#xff08;如RPC调用&#xff09…...

STM32单片机入门学习——第41节: [12-1] Unix时间戳

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.18 STM32开发板学习——第41节: [12-1] Unix时间戳 前言开发板说明引用解答和科普一…...

无人机自主导航与路径规划技术要点!

一、自主导航与路径规划技术要点 1. 传感器融合 GPS/北斗定位&#xff1a;提供全局定位&#xff0c;但在室内或遮挡环境下易失效。 惯性测量单元&#xff08;IMU&#xff09;**&#xff1a;通过加速度计和陀螺仪实时追踪姿态&#xff0c;弥补GPS信号丢失时的定位空缺。 …...

AI绘画SD中,如何保持生成人物角色脸部一致?Stable Diffusion精准控制AI人像一致性两种实用方法教程!

在AI绘画StableDiffusion中&#xff0c;一直都有一个比较困难的问题&#xff0c;就是如何保证每次出图都是同一个人。今天就这个问题分享一些个人实践&#xff0c;大家和我一起来看看吧。 一. 有哪些实现方式 方式1&#xff1a;固定Seed种子值。 固定Seed种子值出来的图片人…...

java 设计模式 策略模式

简介 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;旨在定义一系列算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。换句话说&#xff0c;策略模式通过将不同的算法…...

std::set (C++)

std::set 1. 概述定义特点 2. 内部实现3. 性能特征4. 常用 API5. 使用示例6. 自定义比较器7. 注意事项与优化8. 使用建议 1. 概述 定义 template<class Key,class Compare std::less<Key>,class Allocator std::allocator<Key> > class std::set;特点 有…...

STM32 HAL 通用定时器延时函数

使用通用定时器TIM3&#xff0c;实现ms、us延时。 delay.c #include "delay.h" #include "stm32f1xx_hal.h"TIM_HandleTypeDef htim3;/*** brief 初始化定时器3用于延时* param 无* retval 无*/ void Delay_Init(void) {TIM_ClockConfigTypeDef sClock…...

RK3588S开发板将SPI1接口改成GPIO

参考官方教程&#xff1a;ROC-RK3588S-PC 一.基本知识&#xff1a; 1.GPIO引脚计算&#xff1a; ROC-RK3588S-PC 有 5 组 GPIO bank&#xff1a;GPIO0~GPIO4&#xff0c;每组又以 A0~A7, B0~B7, C0~C7, D0~D7 作为编号区分&#xff0c;常用以下公式计算引脚&#xff1a;GPIO…...

PLOS ONE:VR 游戏扫描揭示了 ADHD 儿童独特的大脑活动

在孩子的成长过程中&#xff0c;总有那么一些“与众不同”的孩子。他们似乎总是坐不住&#xff0c;课堂上小动作不断&#xff0c;注意力难以集中&#xff0c;作业总是拖拖拉拉……这些行为常常被家长和老师简单地归结为“淘气”“不听话”。然而&#xff0c;他们可能并不只是“…...

DemoGen:用于数据高效视觉运动策略学习的合成演示生成

25年2月来自清华、上海姚期智研究院和上海AI实验室的论文“DemoGen: Synthetic Demonstration Generation for Data-Efficient Visuomotor Policy Learning”。 视觉运动策略在机器人操控中展现出巨大潜力&#xff0c;但通常需要大量人工采集的数据才能有效执行。驱动高数据需…...

极狐GitLab 账号限制有哪些?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 账户和限制设置 (BASIC SELF) 默认项目限制 您可以配置新用户能在其个人命名空间中创建的默认最大项目数。此限制仅影响更改…...

@JsonView + 单一 DTO:如何实现多场景 JSON 字段动态渲染

JsonView 单一 DTO&#xff1a;如何实现多场景 JSON 字段动态渲染 JsonView 单一 DTO&#xff1a;如何实现多场景 JSON 字段动态渲染1、JsonView 注解产生的背景2、为了满足不同场景下返回对应的属性的做法有哪些&#xff1f;2.1 最快速的实现则是针对不同场景新建不同的 DTO…...

JVM之经典垃圾回收器

一、垃圾回收算法 1. 标记-清除&#xff08;Mark-Sweep&#xff09; 步骤&#xff1a; 标记&#xff1a;遍历对象图&#xff0c;标记所有存活对象。清除&#xff1a;回收未被标记的垃圾对象。 特点&#xff1a;简单&#xff0c;但会产生内存碎片。 2. 标记-复制&#xff08;…...

15 nginx 中默认的 proxy_buffering 导致基于 http 的流式响应存在 buffer, 以 4kb 一批次返回

前言 这也是最近碰到的一个问题 直连 流式 http 服务, 发现 流式响应正常, 0.1 秒接收到一个响应 但是 经过 nginx 代理一层之后, 就发现了 类似于缓冲的效果, 1秒接收到 10个响应 最终 调试 发现是 nginx 的 proxy_buffering 配置引起的 然后 更新 proxy_buffering 为…...

人工智能学习框架完全指南(2025年更新版)

一、核心框架分类与适用场景 人工智能框架根据功能可分为深度学习框架、机器学习框架、强化学习框架和传统工具库,以下是主流工具及选型建议: 1. 深度学习框架 (1)PyTorch 核心优势:动态计算图、灵活性强,适合科研与快速原型开发,支持多模态任务(如NLP、CV) 。技术生…...

安卓手机万能遥控器APP推荐

软件介绍 安卓手机也能当“家电总控台”&#xff1f;这款小米旗下的万能遥控器APP&#xff0c;直接把遥控器做成“傻瓜式操作”——不用配对&#xff0c;不连蓝牙&#xff0c;点开就能操控电视、空调、机顶盒&#xff0c;甚至其他品牌的电器&#xff01;雷总这波操作直接封神&…...

颚式破碎机的设计

一、引言 颚式破碎机作为矿山、建材等行业的重要破碎设备&#xff0c;其性能优劣直接影响物料破碎效率与质量。随着工业生产规模的扩大和对破碎效率要求的提高&#xff0c;设计一款高效、稳定、节能的颚式破碎机具有重要意义。 二、设计需求分析 处理能力&#xff1a;根据目…...

PH热榜 | 2025-04-18

1. Wiza Monitor 标语&#xff1a;跟踪工作变动&#xff0c;接收Slack和电子邮件的提醒。 介绍&#xff1a;Wiza Monitor是一款用于追踪职位变动的工具&#xff0c;可以实时跟踪客户和潜在客户的工作变动&#xff0c;还可以通过电子邮件和Slack发送提醒&#xff0c;让你的客户…...

Android平台 Hal AIDL 系列文章目录

目录 1. Android Hal AIDL 简介2. AIDL 语言简介3. Android 接口定义语言 (AIDL)4. 定义AIDL 接口5. AIDL 中如何传递 Parcelable 对象6. 如何使用AIDL 定义的远程接口进行跨进程通信7. 适用于 HAL 的 AIDL8. Android Hal AIDL 编译调试9. 高版本Android (AIDL HAL) 沿用HIDL方…...

十、数据库day02--SQL语句01

文章目录 一、新建查询1.查询窗口的开启方法2. 单语句运行方法 二、数据库操作1.创建数据库2. 使用数据库3. 修改数据库4. 删除数据库和查看所有数据库5. 重点&#xff1a;数据库备份5.1 应用场景5.2 利用工具备份备份操作还原操作 5.3 扩展&#xff1a;使用命令备份 三、数据表…...

基于Atlas 800I A2 + Ubuntu 22.04 LTS 离线部署神州鲲泰问学一体机平台

一.环境信息 1.1.硬件信息 Atlas 800I A2 1.2.操作系统 版本&#xff1a; cat /etc/os-release PRETTY_NAME"Ubuntu 22.04 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04 (Jammy Jellyfish)" VERSION_CODENAMEjammy IDubun…...