UCOS-III 互斥锁接口详解

        在实时操作系统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.mzph.cn/bicheng/51861.shtml

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

相关文章

2024杭电多校第三场

目录 1001-深度自同构 1003-游走 1007-单峰数列 1008-比特跳跃 1011-抓拍 1012-死亡之组 1001-深度自同构 每个数的答案其实与它的各个因数有关&#xff0c;正向递推一下 #include <bits/stdc.h> using namespace std; #define int long long const int N1e65; co…

51 单片机的Keil5软件

1. KEIL C51 软件获取 博主网盘下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1YBfrRh2L7SIehS5xLQkAow?pwd4211 提取码&#xff1a;4211 也可以在 KEIL 的官网上下载&#xff1a;http:// https://www.keil.com/download/product/ 打开界面如下图所示&#xff1…

读零信任网络:在不可信网络中构建安全系统04最小特权

1. 公钥基础设施 1.1. PKI 1.2. 数字证书本身并不能解决身份认证问题 1.2.1. 需要一种方法来验证获得的公钥的确属于某人 1.2.2. 公钥基础设施&#xff08;PKI&#xff09;解决了这个问题 1.3. PKI定义了一组角色及其职责&#xff0c;能够在不可信的网络中安全地分发和验证…

AMQP-核心概念-终章

本文参考以下链接摘录翻译&#xff1a; https://www.rabbitmq.com/tutorials/amqp-concepts 连接&#xff08;Connections&#xff09; AMQP 0-9-1连接通常是长期保持的。AMQP 0-9-1是一个应用级别的协议&#xff0c;它使用TCP来实现可靠传输。连接使用认证且可以使用TLS保护…

观远BI经验总结

观远BI经验总结 观远BI&#xff08;Galaxy platform&#xff09;简介 ​ 观远数据是一站式智能分析平台&#xff0c;为企业提供数据分析可视化与智能决策服务&#xff0c;打通数据采集-数据接入-数据管理-数据开发-数据分析-AI建模-AI模型运行-数据应用全流程&#xff0c;全方…

Golang | Leetcode Golang题解之第300题最长递增子序列

题目&#xff1a; 题解&#xff1a; func lengthOfLIS(nums []int) int {if len(nums)<1{return len(nums)}dp : make([]int,len(nums))for i:0;i<len(nums);i{dp[i]1}res : 1for i:1;i<len(nums);i{for j:0;j<i;j{if nums[i] > nums[j]{dp[i] max(dp[i],dp[j…

录制创意无限的视频:2024年热门免费录屏软件精选

录屏会帮助我们捕捉屏幕上每一帧的精彩瞬间&#xff0c;不论是直播还是学习甚至是工作的会议都能用到这个功能。如果找到一款好用的免费录屏软件&#xff0c;那我们录屏时候会更随意&#xff0c;更愉悦一些吧。 1.福昕录屏大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 这款…

【扒代码】X = output[:,:,y1:y2,x1:x2].sum()

假设我们有以下输入&#xff1a; output 是一个形状为 (1【batch size】, 1【channel】, 10, 10) 的张量&#xff0c;表示一个 10x10 的输出图像。boxes 是一个形状为 (1【index】, 2, 5) 的张量&#xff0c;表示两个边界框&#xff0c;每个边界框包含 5 个值 [index, y1, x1,…

AttributeError: ‘str‘ object has no attribute ‘decode‘

AttributeError: ‘str‘ object has no attribute ‘decode‘ 目录 AttributeError: ‘str‘ object has no attribute ‘decode‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#x…

springBoot 3.X整合camunda

camunDa camunDa 是2013年从Activiti5 中分离出来的一个新的工作流引擎。Camunda 官方提供了 Camunda Platform、Camunda Modeler&#xff0c;其中 Camunda Platform 以 Camunda engine 为基础为用户提供可视化界面&#xff0c;Camunda Modeler 是流程文件建模平台&#xff0c…

虚拟换装的一个项目:IMAGDressing-v1

虚拟换装的一个项目&#xff1a;IMAGDressing-v1 IMAGDressing-v1是一个可定制虚拟着装系统&#xff0c;可以生成逼真的服装并支持场景编辑 特点&#xff1a; 1、支持服装生成&#xff0c;可根据&#xff0c;例如文本提示、图像、姿势等&#xff0c;生成逼真的服装图像&…

GuLi商城-商品服务-API-平台属性-规格参数新增与VO

重写保存方法: @Transactional(rollbackFor = Exception.class) @Ove

Linux驱动编程 - 字符设备驱动

目录 简介&#xff1a; 一、字符设备驱动框架 1、字符设备驱动入口 2、字符设备驱动加载过程 2.1 申请设备号 2.1.1 分配设备号函数 (1) 静态分配函数 (2) 动态分配函数 (3) 注销设备号 2.1.2 设备号中的主/次设备号 2.1.3 申请设备号示例 2.2 注册字符设备 2.2.1 cd…

手摸手教你撕碎西门子S7通讯协议06--S7Read读取short数据

1、S7通讯回顾 - &#xff08;1&#xff09;建立TCP连接 Socket.Connect-》已实现 - &#xff08;2&#xff09;发送访问请求 COTP-》已实现 - &#xff08;3&#xff09;交换通信信息 Setup Communication-》已实现 - &#xff08;4&#xff09;执行相关操作 …

如何使用rdma-core来实现RDMA操作

rdma-core 是一个开源项目&#xff0c;为远程直接内存访问&#xff08;RDMA&#xff09;提供用户空间的支持。它包括 RDMA 设备的驱动程序、库和工具&#xff0c;旨在简化 RDMA 应用的开发和部署。 基础知识参考博文&#xff1a; 一文带你了解什么是RDMA RDMA 高性能架构基本…

Langchain--如何使用大模型 2.0

【&#x1f34a;易编橙终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官、CSDN人工智能领域优质创作者 。 Langch…

【已解决】嵌入式linux mobaxterm unable to open connection to comx 串口正常连接,但终端无法输入

1.点击Session重新选择串口&#xff0c;注意看看串口是不是连接到虚拟机&#xff0c;导致串口被占用。 2.选择PC机与开发板连接的串口&#xff0c;不知道的话可以打开设备管理器看看&#xff0c;选择正确的波特率&#xff0c;一般是115200。 3.关键一步&#xff1a;选择后别急…

【计算机网络原理】网络层IP协议的总结和数据链路层以太网协议的总结.

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

MobaXterm tmux 配置妥当

一、事出有因 缘由&#xff1a;接上篇文章&#xff0c;用Docker搭建pwn环境后&#xff0c;用之前学过的多窗口tmux进行调试程序&#xff0c;但是鼠标滚动的效果不按预期上下翻屏。全网搜索很难找到有效解决办法&#xff0c;最后还是找到了一篇英文文章&#xff0c;解决了&…

正点原子imx6ull-mini-Linux设备树下的LED驱动实验(4)

1&#xff1a;修改设备树文件 在根节点“/”下创建一个名为“alphaled”的子节点&#xff0c;打开 imx6ull-alientek-emmc.dts 文件&#xff0c; 在根节点“/”最后面输入如下所示内容 alphaled {#address-cells <1>;#size-cells <1>;compatible "atkalp…