UCOS-III 互斥锁接口详解

news2024/9/9 1:08:49

        在实时操作系统uC/OS-III中,互斥锁(Mutex)是一种用于管理对共享资源的访问的同步机制。互斥锁通过保证在任何时刻只有一个任务可以持有锁,从而防止资源竞争问题。同时,uC/OS-III还实现了递归锁定和优先级继承机制,以增强系统的实时性和稳定性。

1. OSMutexCreate接口

1.1 接口说明

该接口用于创建一个互斥锁。

参数

  • p_mutex: 指向待初始化的互斥锁对象的指针。

  • p_name: 指向互斥锁名称的指针。

  • p_err: 指向错误码的指针。

可能的错误码

  • OS_ERR_NONE: 操作成功。

  • OS_ERR_CREATE_ISR: 在中断服务程序中调用。

  • OS_ERR_ILLEGAL_CREATE_RUN_TIME: 在系统启动后调用。

  • OS_ERR_OBJ_PTR_NULL: p_mutex为NULL。

  • OS_ERR_OBJ_CREATED: 互斥锁已创建。

1.2 接口实现流程图

2. OSMutexPend接口

2.1 接口说明

该接口用于等待一个互斥锁。

参数

  • p_mutex: 指向待等待的互斥锁对象的指针。

  • timeout: 等待的最大时钟节拍数。

  • opt: 等待选项,可以是阻塞或非阻塞。

  • p_ts: 指向接收时间戳的指针。

  • p_err: 指向错误码的指针。

可能的错误码

  • OS_ERR_NONE: 操作成功。

  • OS_ERR_MUTEX_OWNER: 当前任务已经拥有互斥锁。

  • OS_ERR_MUTEX_OVF: 互斥锁嵌套计数器溢出。

  • OS_ERR_OBJ_DEL: 互斥锁被删除。

  • OS_ERR_OBJ_PTR_NULL: p_mutex为NULL。

  • OS_ERR_OBJ_TYPE: p_mutex不是互斥锁。

  • OS_ERR_OPT_INVALID: 无效选项。

  • OS_ERR_OS_NOT_RUNNING: 系统未运行。

  • OS_ERR_PEND_ABORT: 等待被中止。

  • OS_ERR_PEND_ISR: 在中断服务程序中调用。

  • OS_ERR_PEND_WOULD_BLOCK: 非阻塞等待。

  • OS_ERR_SCHED_LOCKED: 调度器被锁定。

  • OS_ERR_STATUS_INVALID: 无效等待状态。

  • OS_ERR_TIMEOUT: 超时。

2.2 接口实现流程图

3. OSMutexPost接口

3.1 接口说明

该接口用于释放一个互斥锁。

参数
  • p_mutex: 指向待释放的互斥锁对象的指针。
  • opt: 选项,可以指定是否调度。
  • p_err: 指向错误码的指针。
可能的错误码
  • OS_ERR_NONE: 操作成功。
  • OS_ERR_MUTEX_NESTING: 互斥锁嵌套计数器未归零。
  • OS_ERR_MUTEX_NOT_OWNER: 当前任务不是互斥锁的拥有者。
  • OS_ERR_OBJ_PTR_NULL: p_mutex为NULL。
  • OS_ERR_OBJ_TYPE: p_mutex不是互斥锁。
  • OS_ERR_OPT_INVALID: 无效选项。
  • OS_ERR_OS_NOT_RUNNING: 系统未运行。
  • OS_ERR_POST_ISR: 在中断服务程序中调用。

3.2 接口实现流程图

4. 互斥锁递归锁定

4.1 递归锁定原理

        递归锁定允许同一个任务多次获得同一个互斥锁,而不会引起死锁。实现递归锁定的关键是增加一个嵌套计数器,每当一个任务获取锁时,计数器增加;每当任务释放锁时,计数器减少,直到计数器为零时,才真正释放互斥锁。

4.2  递归锁定应用场景

  • 嵌套函数调用:在一个任务中,函数A持有互斥锁,然后调用函数B,函数B也尝试获取同一个互斥锁。如果没有递归锁定,函数B会导致死锁。

4.3  递归锁定实现代码段

void OSMutexPend (OS_MUTEX *p_mutex, OS_TICK timeout, OS_OPT opt, CPU_TS *p_ts, OS_ERR *p_err) {
    CPU_SR_ALLOC();
    CPU_CRITICAL_ENTER();
    if (p_mutex->OwnerNestingCtr == 0u) {
        p_mutex->OwnerTCBPtr = OSTCBCurPtr;
        p_mutex->OwnerNestingCtr = 1u;
        CPU_CRITICAL_EXIT();
        *p_err = OS_ERR_NONE;
        return;
    }
    if (OSTCBCurPtr == p_mutex->OwnerTCBPtr) {
        p_mutex->OwnerNestingCtr++;
        CPU_CRITICAL_EXIT();
        *p_err = OS_ERR_MUTEX_OWNER;
        return;
    }

    ......

    CPU_CRITICAL_EXIT();
}

5. 互斥锁优先级继承

5.1 优先级继承实现原理

        优先级继承机制用于防止优先级反转。当高优先级任务等待被低优先级任务持有的互斥锁时,低优先级任务会临时提升到高优先级任务的优先级,以减少高优先级任务的等待时间。

5.2 优先级继承应用场景

        优先级继承在以下场景中非常有用:

        实时系统:在实时系统中,优先级反转可能会导致高优先级任务的响应时间过长,影响系统的实时性。

        资源竞争:当多个任务竞争同一个资源时,优先级继承可以确保高优先级任务能够尽快获得资源。

5.3 优先级继承实现代码段

void OSMutexPend (OS_MUTEX *p_mutex, OS_TICK timeout, OS_OPT opt, CPU_TS *p_ts, OS_ERR *p_err) {
    OS_TCB *p_tcb;
    CPU_SR_ALLOC();
    CPU_CRITICAL_ENTER();
    if (p_mutex->OwnerNestingCtr == 0u) {
        p_mutex->OwnerTCBPtr = OSTCBCurPtr;
        p_mutex->OwnerNestingCtr = 1u;
        CPU_CRITICAL_EXIT();
        *p_err = OS_ERR_NONE;
        return;
    }
    p_tcb = p_mutex->OwnerTCBPtr;
    if (p_tcb->Prio > OSTCBCurPtr->Prio) {
        OS_TaskChangePrio(p_tcb, OSTCBCurPtr->Prio);
    }

   ......

    CPU_CRITICAL_EXIT();
}

总结

        文中详细介绍了uC/OS-III中互斥锁的接口及其实现原理,包括互斥锁的创建、等待和释放过程,同时解析了递归锁定和优先级继承机制。

互斥锁接口

  1. OSMutexCreate: 创建互斥锁,初始化互斥锁的数据结构,并进行必要的检查。
  2. OSMutexPend: 等待互斥锁,支持阻塞和非阻塞模式,通过嵌套计数器实现递归锁定,同时支持优先级继承以防止优先级反转。
  3. OSMutexPost: 释放互斥锁,通过递减嵌套计数器来实现递归锁定的释放,保证只有在嵌套计数器归零时才真正释放锁。

递归锁定

递归锁定允许同一任务多次获得同一互斥锁而不会导致死锁。通过嵌套计数器,每次任务获得锁时计数器递增,释放锁时计数器递减,只有在计数器归零时才真正释放锁。这在复杂代码段或嵌套函数调用中尤为有用,避免了任务的死锁。

优先级继承

优先级继承机制防止优先级反转。当高优先级任务等待低优先级任务持有的锁时,低优先级任务会暂时提升到高优先级任务的优先级,确保高优先级任务能够尽快获得资源。这对于保证实时系统的响应时间和系统稳定性至关重要。

        

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

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

相关文章

七款公司常用的加密软件推荐|2024年公司办公加密软件推荐

在现代企业中,加密软件是保护敏感信息、防止数据泄露和确保通信安全的关键工具。加密软件能够对数据进行加密,使其在未经授权的情况下无法被读取或篡改,本文分享七款加密软件,它们各具特色,能够满足不同的安全需求。 1…

狂赚又吸金 身心灵赛道AI玩法全解析

想必很多初入AI的小白们,小白的不能在小白了,因为在他们眼中,确实对AI一无所知。 基于他们平时刷抖音、刷视频号的习惯,有的时候会发一些传统剪辑的作品,问AI怎么做?很多人认为AI所见的视频,AI…

GeoServer发布MongoDB中的shp数据全流程梳理

目录 前言1.shp转geojson2.shp导入MongoDB3.创建空间索引4.GeoServer安装MongoDB插件5.发布6.注意事项6.1 geojson要去掉头尾6.2 MongoDB4.4以上的mongoimport工具需要额外安装6.3 空间索引是必须项 7.总结 前言 网上搜到的GeoServer发布MongoDB中的矢量数据或shp数据的文章比较…

http协议与nginx

动态页面与静态页面的差别: (1)URL不同 静态⻚⾯链接⾥没有“?” 动态⻚⾯链接⾥包含“?” (2)后缀不同 (开发语⾔不同) 静态⻚⾯⼀般以 .html .htm .xml 为后缀 动态⻚⾯⼀般以 .php .jsp .py等为后…

我国工业大模型发展中的四个反差现象

以大模型为代表的新一代人工智能技术正加速推进新型工业化的变革进程。2024年1月,国务院常务会议研究部署推动人工智能赋能新型工业化有关工作,强调以人工智能和制造业深度融合为主线,以智能制造为主攻方向,以场景应用为牵引&…

【Git从入门到精通】——知识概述及Git安装

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

Google Test的使用

Google Test支持的操作系统包含下面这些: 1、Linux 2、Mac OS X 3、Windows 4、Cygwin 5、MinGW 6、Windows Mobile 7、Symbian一、google test的基本使用步骤 1、包含gtest/gtest.h头文件 2、使用TEST()宏定义测试case 3、在测试体中使用gooletest断言进行值检查…

Java从入门到精通(十四) ~ 多线程

晚上好,愿这深深的夜色给你带来安宁,让温馨的夜晚抚平你一天的疲惫,美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 一、多线程是什么? Java中的多线程 二、使用步骤 1.创建方式 1.1 Thread 线程 1.2 Runnable 任务 1.…

视创云展:重塑线上会议体验,六大核心引领数字空间新纪元

视创云展以其革命性的“数字活动”解决方案为核心,精心构建了一个超越想象的未来数字世界。通过整合六大前沿技术模块,它不仅为参会者打造了一个身临其境的线上会议环境,更让每一位参与者都能跨越物理界限,深刻感受会议的每一个瞬…

2024经济师考试报名『注册流程』图解!

⏰报名时间:8月12日—9月11日 ☑️报名注册流程 1、经济师考试报名注册网站:中国人事考试网. 2、点击考生登录栏目中的【新用户注册】按钮,进行注册。 3、进入用户注册界面,填写注册信息。 4、填写完毕确认无误后点击【提交】&…

CMS61850客户端

近一年都比较忙,很久没有更新文档了。这次抽了点时间,把CMS61850的客户端再补上。方便大家进一步的学习。当然61850相关的文档已经写的快吐了。不出意外,这应该是最后一篇关于61850的文章了。 本次提供的demo,可直接在windows上运…

【React】WeChat微信网站应用登录之wxLogin.js

以下基于wxLogin.js在React应用中使用案例 实验环境 antd:^5.14.1next:14.1.0react:^18 组件调用示例 "use client";import { useEffect, useState } from "react"; import { WechatChannel } from "./channel&qu…

【论文阅读笔记】DeepCAD: A Deep Generative Network for Computer-Aided Design Models

1 引言 现有3D生成模型: 3D点云:大量离散的3D点组成的数据表示形式; 多边形网格:一系列相连的多边形组成的3D模型; 水平集场:使用数值函数来表示物体的边界,并根据函数值的正负来确定物体内部…

示波器显示屏5个名词解释(峰峰值、平均值、频率、占空率、上升时间)

一般在使用示波器时,需要找到示波器测量的一些数据,包括峰峰值、频率等,但所显示出的所有名词可能不是很能理解,小编今天就具体介绍一下。下图是一般我们调节过后的示波器显示屏的数据显示: 1、峰-峰值 (Pe…

Clickhouse 生产集群部署(Centos 环境)

文章目录 机器环境配置安装 JDK 8安装 zookeeperClickhouse 集群安装rpm 包离线安装修改全局配置zookeeper配置Shard和Replica设置image.png添加macros配置启动 clickhouse启动 10.82.46.135 clickhouse server启动 10.82.46.163 clickhouse server启动 10.82.46.218 clickhous…

Python中的类型注解和静态类型检查使用详解

概要 Python作为一种动态类型语言,其灵活性和易用性使其广受欢迎。然而,动态类型也带来了一些问题,如代码可读性差和运行时错误等。为了提高代码质量和可维护性,Python从3.5版本开始引入了类型注解(Type Hints),并且借助第三方工具可以实现静态类型检查。本文将详细介绍…

熊猫乳品再创新高:超高温灭菌稀奶油,驱动餐饮品质升级

随着餐饮行业的蓬勃发展,乳制品在餐饮端的应用日益广泛且需求多样化。中华老字号品牌企业熊猫乳品,在近期推出了专为餐饮定制的高品质产品-熊猫乳品超高温灭菌稀奶油,凭借其卓越性能,在多项测试中脱颖而出,成为餐饮制作…

Docker入门指南:基础命令、操作容器与镜像管理,附存储、网络及Compose应用

Docker命令 下载镜像 命令命令示例docker search 镜像名检索镜像docker search nginxdocker pull 镜像名下载镜像docker pull nginxdocker images / docker image ls查看镜像列表/docker rmi 镜像名/IMAGE ID删除指定镜像docker rmi nginx / docker rmi e784f4560448 镜像名&…

【计算机网络】TCP和UDP的封装以及案例

TCP和UDP的封装以及案例 背景知识TCP实现UDP实现封装Network用NetWork再次实现TCP和UDP小知识点 背景知识 TCP:传输控制协议(Transmission Control Protocol) UDP:用户数据报协议 (User Datagram Protocol&#xff09…

二叉树--堆(上卷)

二叉树–堆(上卷) 树 树的概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽…