μC/OS-II---信号量管理1(os_sem.c)

目录

  • 信号量管理
    • 信号量创建
    • 信号量删除
    • 获取/等待信号量
    • 发出信号量

信号量管理

在这里插入图片描述

信号量创建

OS_EVENT  *OSSemCreate (INT16U cnt)
{OS_EVENT  *pevent;
#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */OS_CPU_SR  cpu_sr = 0u;
#endif
#ifdef OS_SAFETY_CRITICAL_IEC61508if (OSSafetyCriticalStartFlag == OS_TRUE){OS_SAFETY_CRITICAL_EXCEPTION();return ((OS_EVENT *)0);}#endifif (OSIntNesting > 0u)                                 /* See if called from ISR ...               */{return ((OS_EVENT *)0);                            /* ... can't CREATE from an ISR             */}OS_ENTER_CRITICAL();pevent = OSEventFreeList;                              /* Get next free event control block        */if (OSEventFreeList != (OS_EVENT *)0)                  /* See if pool of free ECB pool was empty   */{OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;}OS_EXIT_CRITICAL();if (pevent != (OS_EVENT *)0)                           /* Get an event control block               */{pevent->OSEventType    = OS_EVENT_TYPE_SEM;pevent->OSEventCnt     = cnt;                      /* Set semaphore value                      */pevent->OSEventPtr     = (void *)0;                /* Unlink from ECB free list                */
#if OS_EVENT_NAME_EN > 0upevent->OSEventName    = (INT8U *) (void *)"?";
#endifOS_EventWaitListInit (pevent);                     /* Initialize to 'nobody waiting' on sem.   */}return (pevent);
}

信号量删除

#if OS_SEM_DEL_EN > 0u
OS_EVENT  *OSSemDel (OS_EVENT  *pevent,INT8U      opt,INT8U     *perr)
{BOOLEAN    tasks_waiting;OS_EVENT  *pevent_return;
#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */OS_CPU_SR  cpu_sr = 0u;
#endif
#ifdef OS_SAFETY_CRITICALif (perr == (INT8U *)0){OS_SAFETY_CRITICAL_EXCEPTION();return ((OS_EVENT *)0);}#endif
#if OS_ARG_CHK_EN > 0uif (pevent == (OS_EVENT *)0)                           /* Validate 'pevent'                        */{*perr = OS_ERR_PEVENT_NULL;return (pevent);}#endifif (pevent->OSEventType != OS_EVENT_TYPE_SEM)          /* Validate event block type                */{*perr = OS_ERR_EVENT_TYPE;return (pevent);}if (OSIntNesting > 0u)                                 /* See if called from ISR ...               */{*perr = OS_ERR_DEL_ISR;                            /* ... can't DELETE from an ISR             */return (pevent);}OS_ENTER_CRITICAL();if (pevent->OSEventGrp != 0u)                          /* See if any tasks waiting on semaphore    */{tasks_waiting = OS_TRUE;                           /* Yes                                      */}else{tasks_waiting = OS_FALSE;                          /* No                                       */}switch (opt){case OS_DEL_NO_PEND:                               /* Delete semaphore only if no task waiting */if (tasks_waiting == OS_FALSE){
#if OS_EVENT_NAME_EN > 0upevent->OSEventName    = (INT8U *) (void *)"?";
#endifpevent->OSEventType    = OS_EVENT_TYPE_UNUSED;pevent->OSEventPtr     = OSEventFreeList; /* Return Event Control Block to free list  */pevent->OSEventCnt     = 0u;OSEventFreeList        = pevent;          /* Get next free event control block        */OS_EXIT_CRITICAL();*perr                  = OS_ERR_NONE;pevent_return          = (OS_EVENT *)0;   /* Semaphore has been deleted               */}else{OS_EXIT_CRITICAL();*perr                  = OS_ERR_TASK_WAITING;pevent_return          = pevent;}break;case OS_DEL_ALWAYS:                                /* Always delete the semaphore              */while (pevent->OSEventGrp != 0u)              /* Ready ALL tasks waiting for semaphore    */{(void)OS_EventTaskRdy (pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);}#if OS_EVENT_NAME_EN > 0upevent->OSEventName    = (INT8U *) (void *)"?";
#endifpevent->OSEventType    = OS_EVENT_TYPE_UNUSED;pevent->OSEventPtr     = OSEventFreeList;     /* Return Event Control Block to free list  */pevent->OSEventCnt     = 0u;OSEventFreeList        = pevent;              /* Get next free event control block        */OS_EXIT_CRITICAL();if (tasks_waiting == OS_TRUE)                 /* Reschedule only if task(s) were waiting  */{OS_Sched();                               /* Find highest priority task ready to run  */}*perr                  = OS_ERR_NONE;pevent_return          = (OS_EVENT *)0;       /* Semaphore has been deleted               */break;default:OS_EXIT_CRITICAL();*perr                  = OS_ERR_INVALID_OPT;pevent_return          = pevent;break;}return (pevent_return);
}
#endif

获取/等待信号量

void  OSSemPend (OS_EVENT  *pevent,INT32U     timeout,INT8U     *perr)
{
#if OS_CRITICAL_METHOD == 3u                          /* Allocate storage for CPU status register      */OS_CPU_SR  cpu_sr = 0u;
#endif
#ifdef OS_SAFETY_CRITICALif (perr == (INT8U *)0){OS_SAFETY_CRITICAL_EXCEPTION();return;}#endif
#if OS_ARG_CHK_EN > 0uif (pevent == (OS_EVENT *)0)                      /* Validate 'pevent'                             */{*perr = OS_ERR_PEVENT_NULL;return;}#endifif (pevent->OSEventType != OS_EVENT_TYPE_SEM)     /* Validate event block type                     */{*perr = OS_ERR_EVENT_TYPE;return;}if (OSIntNesting > 0u)                            /* See if called from ISR ...                    */{*perr = OS_ERR_PEND_ISR;                      /* ... can't PEND from an ISR                    */return;}if (OSLockNesting > 0u)                           /* See if called with scheduler locked ...       */{*perr = OS_ERR_PEND_LOCKED;                   /* ... can't PEND when locked                    */return;}OS_ENTER_CRITICAL();if (pevent->OSEventCnt > 0u)                      /* If sem. is positive, resource available ...   */{pevent->OSEventCnt--;                         /* ... decrement semaphore only if positive.     */OS_EXIT_CRITICAL();*perr = OS_ERR_NONE;return;}/* Otherwise, must wait until event occurs       */OSTCBCur->OSTCBStat     |= OS_STAT_SEM;           /* Resource not available, pend on semaphore     */OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;OSTCBCur->OSTCBDly       = timeout;               /* Store pend timeout in TCB                     */OS_EventTaskWait (pevent);                        /* Suspend task until event or timeout occurs    */OS_EXIT_CRITICAL();OS_Sched();                                       /* Find next highest priority task ready         */OS_ENTER_CRITICAL();switch (OSTCBCur->OSTCBStatPend)                  /* See if we timed-out or aborted                */{case OS_STAT_PEND_OK:*perr = OS_ERR_NONE;break;case OS_STAT_PEND_ABORT:*perr = OS_ERR_PEND_ABORT;               /* Indicate that we aborted                      */break;case OS_STAT_PEND_TO:default:OS_EventTaskRemove (OSTCBCur, pevent);*perr = OS_ERR_TIMEOUT;                  /* Indicate that we didn't get event within TO   */break;}OSTCBCur->OSTCBStat          =  OS_STAT_RDY;      /* Set   task  status to ready                   */OSTCBCur->OSTCBStatPend      =  OS_STAT_PEND_OK;  /* Clear pend  status                            */OSTCBCur->OSTCBEventPtr      = (OS_EVENT  *)0;    /* Clear event pointers                          */
#if (OS_EVENT_MULTI_EN > 0u)OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;
#endifOS_EXIT_CRITICAL();
}

发出信号量

INT8U  OSSemPost (OS_EVENT *pevent)
{
#if OS_CRITICAL_METHOD == 3u                          /* Allocate storage for CPU status register      */OS_CPU_SR  cpu_sr = 0u;
#endif
#if OS_ARG_CHK_EN > 0uif (pevent == (OS_EVENT *)0)                      /* Validate 'pevent'                             */{return (OS_ERR_PEVENT_NULL);}#endifif (pevent->OSEventType != OS_EVENT_TYPE_SEM)     /* Validate event block type                     */{return (OS_ERR_EVENT_TYPE);}OS_ENTER_CRITICAL();if (pevent->OSEventGrp != 0u)                     /* See if any task waiting for semaphore         */{/* Ready HPT waiting on event                    */(void)OS_EventTaskRdy (pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);OS_EXIT_CRITICAL();OS_Sched();                                   /* Find HPT ready to run                         */return (OS_ERR_NONE);}if (pevent->OSEventCnt < 65535u)                  /* Make sure semaphore will not overflow         */{pevent->OSEventCnt++;                         /* Increment semaphore count to register event   */OS_EXIT_CRITICAL();return (OS_ERR_NONE);}OS_EXIT_CRITICAL();                               /* Semaphore value has reached its maximum       */return (OS_ERR_SEM_OVF);
}

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

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

相关文章

【SA8295P 源码分析 (三)】123 - MAX96712 解串器 sensor_detect_device_channels() 探测 Camera Sensor加串器 过程详细解析

【SA8295P 源码分析】123 - MAX96712 解串器 sensor_detect_device_channels 探测 Camera Sensor加串器 过程详细解析 一、sensor_detect_device():MAX96712 检测解串器芯片是否存在,获取chip_id、device_revision二、sensor_detect_device_channels() :MAX96712 解串器 寄存…

mysql子查询

1、概念 子查询就是将一个查询&#xff08;子查询&#xff09;的结果作为另一个查询&#xff08;主查询&#xff09;的数据来源或判断条件的查询。 2、分类 按查询结果的行列数 标量子查询&#xff1a;结果只有一行一列列子查询&#xff1a;结果只有一列多行&#xff0c;也称…

vue通过span-method合并列之后,合并列显示在中间位置,根据鼠标滑动跟随展示

当vue通过span-method合并列之后&#xff0c;出现的合并列显示在中间位置&#xff0c;但是如果页面没有分页&#xff0c;如何进行展示呢&#xff0c;难道要滑到最下面去看吗&#xff0c;下面我们来根据鼠标滑动跟随展示 没有处理的合并页面 <template> <el-table:dat…

智能穿戴AR眼镜主板方案定制_MTK平台AR智能眼镜PCB板开发

AR智能眼镜&#xff0c;是采用了多种技术实现增强现实效果&#xff0c;是将虚拟信息和现实场景相结合的智能设备。 AR智能眼镜硬件上&#xff0c;包括多个传感器、显示装置和处理器等。其中&#xff0c;传感器用于捕捉用户的动作和环境信息&#xff0c;如摄像头、陀螺仪、加速…

Hadoop入门——数据分析基本步骤

文章目录 1.概述2.分析步骤2.1第一步 明确分析目的和思路2.2第二步 数据收集2.3第三步 数据处理2.4第四步 数据分析2.5第五步 数据展现2.6第六步 报告撰写 3.总结 1.概述 2.分析步骤 2.1第一步 明确分析目的和思路 2.2第二步 数据收集 2.3第三步 数据处理 2.4第四步 数据分析 …

Phar 文件上传以及反序列化

1.phar反序列化 触发条件&#xff1a; 1、能将phar文件上传 2、可利用函数 stat、fileatime、filectime、file_exists、file_get_contents、file_put_contents、file、filegroup、fopen、fileinode、filemtime、fileowner、fileperms、is_dir、is_executable、is_file、is_link…

BEVFormer 论文阅读

论文链接 BEVFormer BEVFormer&#xff0c;这是一个将Transformer和时间结构应用于自动驾驶的范式&#xff0c;用于从多相机输入中生成鸟瞰&#xff08;BEV&#xff09;特征利用查询来查找空间/时间&#xff0c;并相应地聚合时空信息&#xff0c;从而为感知任务提供更强的表示…

【ROS】RViz2源码下载、编译、运行

【ROS】郭老二博文之:ROS目录 1、源码下载 1.1 源码地址 ROS1对应的RViz源码:https://github.com/ros-visualization/rviz ROS2对应的RViz2源码:https://github.com/ros2/rviz 注意:在搜索RViz2源码时,使用傻度搜索的结果是对应ROS1的RViz,使用谷歌的搜索结果是正确的…

c++之json的创建,解析,增加,删除

c之json的创建&#xff0c;解析&#xff0c;增加,删除 1.存储方式,类型2.宏3.创建,保存json4.解析5.删除6.修改 1.存储方式,类型 typedef struct cJSON { struct cJSON *next,prev; / next是获取下一个元素数据&#xff0c;prev是获取前一个元素数据 */ struct cJSON child…

【华为OD机试高分必刷题目】生理周期(C++-模拟迭代实现)

🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,高分通过! 文章目录 【华为OD机试高分必刷题目】生理周期(C++-模拟迭代实现)题目描述解题思路java题解代码代码OJ评判结果代码讲解寄语【华为OD机试高分必刷题目…

NLP---文本前期预处理的几个步骤

1、读取文本 text1 """ Football is a family of team sports that involve, to varying degrees, kicking a ball to score a goal. Unqualified, the word football is understood to refer to whichever form of football is the most popular in the reg…

13.利用辗转相除法求两个整数的最大公约数和最小公倍数。如96,36

文章目录 前言一、题目描述 二、题目分析 三、解题 前言 本系列为循环结构编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 利用辗转相除法求两个整数的最大公约数和最小公倍数,如96,36 二、题目分析 最小公倍数(输入的两个数之积)除(它们的最大公约数) 三…

大模型应用--prompt工程实践

在使用大模型进行prompt 训练时&#xff0c;自己做的相关笔记。 本文以openai<1.0版为例。 1.调用大模型 定义调用openai大模型的函数 get_completion() def get_completion(prompt, model"gpt-3.5-turbo"):messages [{"role": "user", …

C++——友元函数

如下是一个日期类&#xff1a; class Date { public:Date(int year 2023, int month 10, int day 1){_year year;_month month;_day day;if (_month < 1 || month > 12 || _day < 1 || _day > GetMonthDay(_year, _month)){cout << "日期不规范&…

解决鸿蒙系统打开系统相机

AndroidManifest.xml添加 <queries><package android:name"com.huawei.camera" /></queries>

一篇博客读懂单链表——Single-List

目录 一、初识单链表 单链表是如何构造的&#xff1a; 单链表如何解决顺序表中的问题&#xff1a; 二、单链表的初始定义 三、尾插和头插 3.1 新建结点CreateNode 3.2 打印SLTPrint 3.3 尾插SLTPushBack 3.4 头插SLTPushFront 四、尾删和头删 4.1 尾删SLTPopBack…

hub.docker访问不了的问题(一步解决)

暂时我也不清楚&#xff0c;但是下面这个网址可以用(可以先用着)Docker Hub Container Image Library | App Containerization (axlinux.top)https://hub.axlinux.top/

Testng XML文件

目录 概述 XML各部分介绍 概述 当你使用TestNG测试框架时&#xff0c;你可以使用XML文件来配置和运行测试套件。XML文件中包含了测试类、测试方法、测试参数等配置信息&#xff0c;使你能够更灵活地组织和管理测试。 以下是一个简单的TestNG XML文件的例子&#xff1a; &l…

设计模式中的静态工厂,到底解决了什么问题?

设计模式中的静态工厂&#xff0c;到底解决了什么问题&#xff1f; 文章目录 设计模式中的静态工厂&#xff0c;到底解决了什么问题&#xff1f;一、基本说明二、代码演示1、名称更明确2、不必每次调用都创建新对象3、返回接口类型4、降低客户端和具体实现之间的耦合5、参数化实…

Maya 2024 for Mac(3D建模软件)

Maya 2024是一款三维计算机图形软件&#xff0c;具有强大的建模、动画、渲染、特效等功能&#xff0c;广泛应用于影视、游戏、广告等行业。以下是Maya 2024软件的主要功能介绍&#xff1a; 建模&#xff1a;Maya 2024具有强大的建模工具&#xff0c;包括多边形建模、曲面建模、…