μ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,一经查实,立即删除!

相关文章

智能穿戴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第四步 数据分析 …

BEVFormer 论文阅读

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

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…

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

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

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 << "日期不规范&…

一篇博客读懂单链表——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/

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

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

【工程实践】Docker使用记录

前言 服务上线经常需要将服务搬到指定的服务器上&#xff0c;经常需要用到docker&#xff0c;记录工作中使用过dcoker指令。 1.写Dockerfile 1.1 全新镜像 FROM nvidia/cuda:11.7.1-devel-ubuntu22.04ENV WORKDIR/data/Qwen-14B-Chat WORKDIR $WORKDIR ADD . $WORKDIR/RUN ap…

洗地机是智商税吗?洗地机有没有必要买?2023洗地机推荐

传统的扫地拖地方式不仅时间长&#xff0c;被毛孩子和萌娃制造的顽固污渍更是让人头痛不已&#xff0c;高效又有效的地面清洁方式成了我们最大的诉求。目前洗地机受到青睐&#xff0c;异常火爆&#xff0c;也成为一众清洁扫地的选择之一&#xff0c;那洗地机到底是不是智商税呢…

C语言从入门到精通之【printf和scanf函数】

printf()是输出函数&#xff0c;scanf()是输入函数&#xff0c;但是它们的工作原理几乎相同。两个函数都使用格式字符串和参数列表。 printf()函数的格式 printf( 格式字符串, 待打印项1, 待打印项2,…);待打印项1、待打印项2等都是要打印的项。它们可以是变量、常量&#xff…

业务出海之服务器探秘

这几年随着国内互联网市场的逐渐饱和&#xff0c;越来越多的公司加入到出海的行列&#xff0c;很多领域都取得了很不错的成就。虽然出海可以获得更加广阔的市场&#xff0c;但也需要面对很多之前在国内可能没有重视的一些问题。集中在海外服务器的选择维度上就有很大的变化。例…

使用validator实现枚举类型校验

使用validator实现枚举类型校验 前言&#xff1a; 在前端调用后端接口传递参数的过程中&#xff0c;我们往往需要对前端传递过来的参数进行校验&#xff0c;比如说我们此时需要对用户的状态进行更新&#xff0c;而用户的状态只有正常和已删除&#xff0c;并且是在代码中通过枚…

【华为云IaaS基础三件套之----计算ECS、网络EIP、存储EVS】

MD[华为云IaaS基础三件套----计算、网络、存储] 华为云IaaS基础三件套之----计算ECS、网络EIP、存储EVS 说明: 这里只是简单从计算/网络/存储&#xff0c;进行介绍&#xff0c;阐明云上对于云下的优势&#xff1b;因ECS是三者综合&#xff0c;故最后说明。 1.网络----弹性公…

Day02_《MySQL索引与性能优化》

文章目录 一、SQL执行顺序二、索引简介1、关于索引2、索引的类型Btree 索引Btree 索引 三、Explain简介四、Explain 详解1、id2、select_type3、table4、type5、possible_keys6、key7、key_len8、ref9、rows10、Extra11、小案例 五、索引优化1、单表索引优化2、两表索引优化3、…

安装 Lua 的 HTTP 库

首先&#xff0c;你需要安装 Lua 的 HTTP 库。可以使用 LuaRocks 来安装。以下是安装命令&#xff1a; luarocks install http然后&#xff0c;你可以使用以下代码来爬取网页内容&#xff1a; local http require http-- 设置代理信息 http.set_proxy(jshk.com.cn)-- 网页UR…

灵活运用Vue指令:探究v-if和v-for的使用技巧和注意事项

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、作…

为什么打开idea时,没有启动页面,如何解决?

更新idea2021.2后&#xff0c;当双击idea打开时&#xff0c;发现没有启动界面&#xff0c;直接进入IDEA界面&#xff0c;中间等待时间&#xff0c;让人误以为没有打开idea成功&#xff0c;使得多次点击idea图标。 解决方案就是 在idea界面菜单栏中找到帮助&#xff08;Help)&a…

全域全自主建设,亚信科技AntDB数据库助力广电5G业务上线运行

自2019年6月&#xff0c;中国广电成功获得5G牌照以来&#xff0c;迅速推进网络建设目标&#xff0c;成为5G网络覆盖广、应用场景多、用户体验出色的第四大运营商。其依托全球独有的700MHz频谱资源&#xff0c;具备覆盖能力强、容量足、速率高的优势。通过不断深化和中国移动的共…