UCOS-III 任务调度锁定/解锁接口OSSchedLock/Unlock详解

news2024/9/19 8:15:54

        在实时操作系统中,任务调度是系统实现多任务并发执行的核心机制。但在某些场景下,我们需要临时关闭任务调度,以确保某段代码在执行过程中不被打断。下面将详细介绍这两个接口的应用场景及实现原理。

 1. 关闭调度的应用场景

        关闭任务调度的主要目的是确保某些关键代码在执行过程中不被其他任务中断,从而保证代码执行的原子性和数据的一致性。常见的应用场景包括:

1.1 临界区保护

        在访问共享资源,如全局变量、外设硬件等,关闭调度可以防止其他任务,在当前任务未完对共享资源成操作之前访问这些资源。

1.2 时序完整性

      在读写外部硬件设备时,需要连续执行一系列操作且不应被中断,关闭调度可以确保整个操作序列的完整性,以正确读写设备。

1.3 数据的一致性

        在对一些关键数据结构进行修改时,关闭调度可以避免数据被其他任务读取或修改,确保数据的一致性。

2. 关闭调度接口OSSchedLock

2.1 OSSchedLock接口流程

  • 防止从中断服务程序(ISR)中调用:在使用 OS_CFG_CALLED_FROM_ISR_CHK_EN 配置项使能时,OSSchedLock 会检查是否在ISR中调用,如果是,则返回错误码 OS_ERR_SCHED_LOCK_ISR
  • 检查系统状态:确保系统已经启动,如果系统尚未启动,则返回错误码 OS_ERR_OS_NOT_RUNNING
  • 防止嵌套溢出OSSchedLock 会检查嵌套计数器 OSSchedLockNestingCtr,防止其值超过250。
  • 进入临界区:使用 CPU_CRITICAL_ENTER 关闭中断,增加 OSSchedLockNestingCtr 的值,并启动调度锁时间测量(如果使能了该功能),退出临界区。

2.2 OSSchedLock接口流程图

 3. OSSchedUnlock打开调度接口

3.1 OSSchedUnlock接口流程

  • 防止从ISR中调用:与 OSSchedLock 类似,OSSchedUnlock 也会检查是否在ISR中调用,如果是,则返回错误码 OS_ERR_SCHED_UNLOCK_ISR
  • 检查系统状态:确保系统已经启动,如果系统尚未启动,则返回错误码 OS_ERR_OS_NOT_RUNNING
  • 检查调度器锁定状态:如果调度器未锁定,则返回错误码 OS_ERR_SCHED_NOT_LOCKED
  • 进入临界区:使用 CPU_CRITICAL_ENTER 关闭中断,减少 OSSchedLockNestingCtr 的值。如果 OSSchedLockNestingCtr 值大于0,说明调度器仍然被锁定,返回错误码 OS_ERR_SCHED_LOCKED
  • 调度解锁:如果 OSSchedLockNestingCtr 值为0,调用 OSSched 函数重新启用任务调度,并返回错误码 OS_ERR_NONE

3.2 OSSchedUnlock接口流程图

4. 注意事项

  1. 必须成对调用:必须确保 OSSchedLockOSSchedUnlock 成对调用,以避免系统调度器状态不一致。
  2. 避免长时间锁定:避免长时间锁定调度器,以防止其他任务无法得到执行,影响系统实时性。
  3. 嵌套深度控制:注意控制调度器锁定的嵌套深度,防止过度使用导致系统调度问题。

5. 总结

        在实时操作系统中,关闭和打开任务调度是确保系统执行关键代码时保持原子性和数据一致性的重要手段。通过正确使用 OSSchedLock 和 OSSchedUnlock 接口,我们可以有效地控制任务调度,实现高效、稳定的实时系统。

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

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

相关文章

Windows环境下部署本地大模型教程

自ChatGPT在2022年爆发式出圈以来,大模型对人类世界产生了重大影响,无论是在生产、工作、写作方面还是自动驾驶领域,大模型发挥了非常重要的作用。 现各大厂,无论是国内大厂还是国外大厂,都纷纷推出了自己的对话大模型…

服务暴露 traefik

一。traefik 部署 前置资源 还是那个网站,这里复制 entryPoints,进入traefik的大门 可选在哪台机器上部署 traefik 部署 用 Daemonset 的方式是为了,加机器到集群后,能自动部署traefik 到目标机器 注意 8084端口 必须加…

【JVM基础06】——组成-直接内存详解

目录 1- 引言:直接内存概述1-1 直接内存是什么?直接内存的定义(What)1-2 为什么用直接内存?Java程序对直接内存的使用 (Why) 2- ⭐核心:详解直接内存(How)2-1 文件拷贝案例介绍对比常规 IO(BIO) 和 NIO常规 IO 的操作流程NIO 的操…

C++ - char*、const char*、char[]、string

const char* const char* 用来定义字符串常量。 char[ ] char型的字符数组是一种定长的数组,存储指定长度的字符序列,数组中的每个元素都是一个char类型的变量,如: char arr[] {h, a, l, l, o, \0}; char c arr[0]; // 访问…

Spring Boot的Web开发

目录 Spring Boot的Web开发 1.静态资源映射规则 第一种静态资源映射规则 2.enjoy模板引擎 3.springMVC 3.1请求处理 RequestMapping DeleteMapping 删除 PutMapping 修改 GetMapping 查询 PostMapping 新增 3.2参数绑定 一.支持数据类型: 3.3常用注解 一.Request…

[Vulnhub] Raven2 PHPMailer-RCE+MSQP:Mysql权限提升

信息收集 IP AddressOpening Ports192.168.101.160TCP:22,80,111,46606 $ nmap -p- 192.168.101.160 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.7p1 Debian 5deb8u4 (protocol 2.0) | ssh-hostkey: | 1024 26:81:c1:f…

拉提查合创5步玩转git工具协作代码开发

1 工具使用场景 开发团队使用git版本管理工具,进行协作代码开发过程中,最常用的场景为: (1)拉取代码 将git远端仓库最新代码拉取到本地。 (2)提交代码 将本地新增修改的代码提交至git远端仓库中…

Spring Cloud微服务项目统一封装数据响应体

在微服务架构下,处理服务之间的通信和数据一致性是一个重要的挑战。为了提高开发效率、保证数据的一致性及简化前端开发,统一封装数据响应体是一种非常有效的实践。本文博主将介绍如何在 Spring Cloud 微服务项目中统一封装数据响应体,并分享…

【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现

1 绪论 1.1 研究背景与意义 在气候变化日益受到全球关注的背景下,天气气温的变化已经对人们的生活各方面都产生了影响,人们在外出时大多都会在手机上看看天气如何,根据天气的变化来决定衣物的穿着和出行的安排。[1]如今手机能提供的信息已经…

C++基础知识:函数重载相关注意事项:1.引用作为重载条件,2.2.函数重载遇见函数默认参数。

1.引用作为重载条件 #include<iostream>using namespace std;//1.引用作为重载的条件 //int 和 const int 类型不同&#xff0c;所以可以作用重载条件 void fn(int &a) //int &a10;不合法 //10放在了常量区&#xff0c;而引用要么在栈区&#xff0c;要么在堆区{…

mysql的MHA以及故障模拟

目录 MHA概念 MHA的组件 MHA的特点 实验&#xff1a;搭建完成MHA的架构 实验&#xff1a;主备切换 实验结果 实验&#xff1a;故障切换 实验&#xff1a;故障恢复 MHA概念 MHA&#xff1a;高可用模式下的故障切换&#xff0c;基于主从复制。它解决的是单点故障和主从复…

Ruby、Python、Java 开发者必备:Codigger之软件项目体检

在编程的广阔天地里&#xff0c;Ruby、Python 和 Java 开发者们各自凭借着独特的语言特性&#xff0c;构建着精彩纷呈的应用世界。然而&#xff0c;无论使用哪种语言&#xff0c;确保项目的高质量始终是至关重要的目标。而 Codigger 项目体检则成为了实现这一目标的得力助手&am…

【JS】事件循环

事件循环&#xff08;Event Loop&#xff09; 什么是事件循环 事件循环就是一个执行任务队列的机制 为什么会出现事件循环 为了避免单线程出现阻塞,采用了异步的形式执行任务。为了解决异步任务的问题,采用了事件循环机制。 事件循环的流程 JavaScript是一门单线程的语言…

Chapter 17 Python文件操作(下)

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、文件的写入二、文件的追加 前言 Python作为一种高效且易于学习的编程语言&#xff0c;提供了一系列强大的文件操作功能&#xff0c;使得用户能够轻松地实现文件的读…

深度解析Linux-C——函数和内存管理

目录 函数指针&#xff1a; 指针函数&#xff1a; 参数为指针的函数&#xff1a; 参数为数组的函数&#xff1a; C语言内存管理 stdlib.h头文件常用函数介绍 1、局部变量 2、全局变量 3、 堆空间变量 4、静态变量 5、常量 函数指针&#xff1a; 指向函数的指针&#…

针对datax-web 中Swagger UI接口未授权访问

application.yml 添加以下配置 实现访问doc.html 以及/v2/api-docs 接口时需要进行简单的校验 swagger:basic:enable: trueusername: adminpassword: 12345 配置重启后再进行相关访问则需要输入用户名和密码

Radon(拉当) 变换:超详细讲解(附MATLAB,Python 代码)

Radon 变换 Radon 变换是数学上用于函数或图像的一种积分变换&#xff0c;广泛应用于图像处理领域&#xff0c;尤其是在计算机断层成像 (CT) 中。本文档将详细介绍 Radon 变换的数学含义及其在图像处理中的应用。 数学定义 Radon 变换的数学定义是将二维函数 f ( x , y ) f…

Spark实时(二):StructuredStreaming编程模型

文章目录 StructuredStreaming编程模型 一、基础语义 二、事件时间和延迟数据 三、​​​​​​​容错语义 StructuredStreaming编程模型 一、基础语义 Structured Streaming处理实时数据思想是将实时数据看成一张没有边界的表,数据源源不断的追加到这张表中,这可以让我…

零基础STM32单片机编程入门(二十二) ESP8266 WIFI模块实战含源码

文章目录 一.概要二.ESP8266 WIFI模块主要性能参数三.ESP8266 WIFI模块芯片内部框图四.ESP8266 WIFI模块原理图五.ESP8266 WIFI模块与单片机通讯方法1.硬件连接2.ESP8266模块AT指令介绍 六.STM32单片机与ESP8266WIFI模块通讯实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 …

Super 4PCS配准算法

Nicolas Mellado&#xff0c;CNRS&#xff08;Centre national de la recherche scientifique&#xff0c;法国国家科学研究中心&#xff09;的研究员&#xff0c;在IRIT&#xff08;Institut de Recherche en Informatique de Toulouse&#xff0c;图卢兹计算机科学研究所&…