ucos信号量

2024-03-31 06:38
文章标签 信号量 ucos

本文主要是介绍ucos信号量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

信号量SEMAPHORES

官方释义

信号量最初是一种机械的信号机制。铁路工业利用这种装置为多列火车共用的铁路轨道提供了一种互斥形式。在这种形式下,信号量通过关闭一组机械臂来锁定当前使用的铁轨上的火车来向火车发出信号。当轨道可用时,手臂就会向上摆动,等待的火车就会继续前进。在软件中使用信号量作为相互排斥的手段的概念是由荷兰计算机科学家Edgser Dijkstra在1959年发明的。在计算机软件中,信号量是大多数多任务内核提供的一种协议机制。信号量,最初用于控制对共享资源的访问,但现在它们被用于同步。信号量最初是一种“锁机制”,代码获得该锁的密钥以继续执行。获取密钥意味着正在执行的任务有权限进入其他锁定代码的部分。输入一段锁定代码会导致任务等待,直到密钥可用。
通常,存在两种类型的信号量:二进制信号量和计数信号量。顾名思义,二进制信号量只能取两个值:0或1。计数信号量允许0到255、65,535或4,294,967,295之间的值,这取决于信号量机制分别是使用8位、16位或32位实现的。对于HC/OS-III,信号量的最大值由数据类型Os_SEM CTR(见os_type.h)决定,可以根据需要进行修改。除了信号量的值,还会跟踪等待信号量可用性的任务。

说白了,信号量可以用于资源重用检测,同时也可以用来传递一些简单信号。
信号量的结构为

struct  os_sem {                                            /* Semaphore                                              *//* ------------------ GENERIC  MEMBERS ------------------ */OS_OBJ_TYPE          Type;                              /* Should be set to OS_OBJ_TYPE_SEM                       */CPU_CHAR            *NamePtr;                           /* Pointer to Semaphore Name (NUL terminated ASCII)       */OS_PEND_LIST         PendList;                          /* List of tasks waiting on semaphore                     */
#if OS_CFG_DBG_EN > 0uOS_SEM              *DbgPrevPtr;OS_SEM              *DbgNextPtr;CPU_CHAR            *DbgNamePtr;
#endif/* ------------------ SPECIFIC MEMBERS ------------------ */OS_SEM_CTR           Ctr;CPU_TS               TS;
};

其中最常用的是OS_SEM_CTR Ctr;,在创建信号量时,要设置信号量的初始值。

关于信号量的系统函数如下

  1. void OSSemCreate (OS_SEM *p_sem,CPU_CHAR *p_name,OS_SEM_CTR cnt,OS_ERR *p_err)
    • p_sem:信号量本体;
    • p_name:信号量的名称;
    • cnt:信号量的初始值;
    • p_err:用于传递错误信息的指针。
  2. OS_SEM_CTR OSSemPost (OS_SEM *p_sem,OS_OPT opt,OS_ERR *p_err)
    作用是增加信号量cnt的值
  3. OS_SEM_CTR OSSemPend (OS_SEM *p_sem,OS_TICK timeout,OS_OPT opt,CPU_TS *p_ts,OS_ERR *p_err)
    • timeout: 允许任务在timeout时间结束后还没有收到信号量的情况下直接执行代码,当timeout=0时则无限等待;
    • opt:用于设置当信号量未到达时是否阻塞;当opt=OS_OPT_PEND_BLOCKING时,在未获取信号量或者超时时阻塞程序。当opt=OS_OPT_PEN_NON_BLOCKING时,OSSemPend()将返回错误代码并执行后面的代码。
    • p_ts:用于记录当接受到信号量/信号量删除/信号量超时时刻的时间戳。
      函数的作用是等待并接受信号量,并自减信号量值cnt,当信号量值为0时,该函数阻塞(设置了OS_OPT_PEND_BLOCKING时)
      还有几个不常用的函数OSSemDel,OSSemSet,OSSemPendAbort

示例

  1. 在初始任务中创建信号量

    OSSemCreate ((OS_SEM*	)&MY_SEM,(CPU_CHAR*	)"MY_SEM",(OS_SEM_CTR)0,		(OS_ERR*	)&err);	
    
  2. 在LED0任务中释放信号量(设定为每3秒释放一次信号量)

     void led0_task(void *p_arg){OS_ERR err;p_arg = p_arg;while(1){OSSemPost(&MY_SEM,OS_OPT_POST_1,&err);OSTimeDlyHMSM(0,0,3,0,OS_OPT_TIME_HMSM_STRICT,&err); }}
    
  3. 在LED1任务中接受信号量(设定为接受到信号量后闪烁灯泡一次)

     void led1_task(void *p_arg){CPU_TS  ts;OS_ERR err;p_arg = p_arg;while(1){OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);  LED0=0;OSTimeDlyHMSM(0,0,0,50,OS_OPT_TIME_HMSM_STRICT,&err); LED0=1;OSTimeDlyHMSM(0,0,0,50,OS_OPT_TIME_HMSM_STRICT,&err); }}
    

运行效果是每3秒灯泡快闪一次。

这篇关于ucos信号量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/863662

相关文章

Linux多线程——POSIX信号量与环形队列版本之生产消费模型

文章目录 POSIX信号量POSIX的操作初始化销毁等待信号量(申请资源)发布信号量(放下资源) 环形队列之生产消费模型 POSIX信号量 POSIX信号量和System V信号量是不同的标准 但是实现的功能是一样的,都是为了解决同步的问题 我们说信号量指的就是资源的数量 在生产者与消费者模型里面,生产者与消费者所认为的资源是不同的 生产者认为空间是资源,因为每次都要

信号与信号量的区别[转]

信号量(Semaphore),有时被称为信号灯,是在多环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Se

使用信号量实现一个限流器:C++实战指南

使用信号量实现一个限流器:C++实战指南 在现代软件开发中,限流器(Rate Limiter)是一种常用的技术,用于控制系统的请求速率,防止系统过载。信号量(Semaphore)是一种强大的同步原语,可以用于实现限流器。本文将详细介绍如何在C++中使用信号量实现一个限流器,并提供完整的代码示例和详细的解释。 什么是限流器? 限流器是一种控制系统请求速率的机制,确保在单位时间内处理的请求数量不

C++ 信号量

信号量: 在生产者消费者模型中,对任务数量的记录就可以使用信号量来做。当信号量的值小于0时,工作进程或者线程就会阻塞,等待物品到来。当生产者生产一个物品,会将信号量值加1操作 sem_post(&sem)。 这是会唤醒在信号量上阻塞的进程或者线程sem_wait(&sem),它们去争抢物品。 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是⼀个非负的整数计数器,它被用来控制对公共资源的访

【嵌入式】内存未对齐导致程序崩溃(铺获信号量SIGBUS,数值7)

背景 嵌入式平台上,和A组配合,需要把A组提供的二进制文件在调用A组提供接口时传入,因为有多个bin文件,自测的时候选择了其中一个,运行正常。递交给qa测试了。然后qa反馈必现崩溃。懵了。复现的时候还用的之前的bin文件,无法复现。最后看信号量数值和打印日志判断是在调用接口的地方,然后对了下长度,发现奇数。而自己用的偶数大小的bin文件。然后修改4字节对齐后正常了。 问题现象 日志打印提示:

【Linux】消息队列信号量

目录 消息队列 原理 接口 指令 信号量 概念 对于信号量理论的理解 信号量的操作  信号量的指令 消息队列 原理 消息队列提供了一个从一个进程向另外一个进程发送一个数据块的方法,每个数据块都有一个类型。对消息队列的的管理也是先描述,再组织! 接口 我们发现,消息队列和共享内存的接口极其相似,消息队列的属性也保存在ipc_perm结构体中,这个结构以中的第一

FreeRTOS线程同步1---信号量

目录 二值信号量 二值信号量相关API函数 一般使用方法为 1.创建二值信号量 2.在一个任务中置为二值释放信号 3.在另一个任务中获取信号 计数信号量 计数型信号量相关 API 函数 使用方法 1.创建计数信号量 2.释放计数信号量 3.获得信号量的当前值 4.释放信号量 互斥信号量 互斥信号量常用API函数 使用方法         信号量是一种解决同

java 信号量Semaphore的使用

java 信号量Semaphore的使用 信号量是一种计数器,用来保护一个或者多个共享资源的访问。 信号量的使用: (1)如果一个线程要访问一个共享资源,他必须先获得信号量。如果信号量的内部计数器大于0,信号量将减1,然后允许访问这个共享资源。计数器大于0意味着又可以使用的资源,因此线程讲被允许使用其中一个资源。 (2)如果信号量等于0,信号将将会把线程植入休眠直到计数器大于0.计数器等于

【Linux修行路】进程通信——消息队列、信号量

目录 ⛳️推荐 一、消息队列 1.1 实现原理 1.2 消息队列接口 1.2.1 msgget——创建、获取一个消息队列 1.2.2 msgctl——释放消息队列、获取消息队列属性 1.2.3 msgsnd——发送数据 1.2.4 msgrcv——从消息队列中检索数据块 1.3 消息队列的指令操作 二、信号量 2.1 数据不一致问题、互斥、临界资源、临界区 2.2 理解

【ESP-IDF FreeRTOS】信号量

下一个内容,信号量。 先包含头文件。 #include "freertos/semphr.h" 我们通过队列可以进行任务间的数据传递,也可以通过队列来控制任务间的同步。如果我只需要控制任务而不需要传递数据,那么我们完全可以用信号量来代替队列。 简单介绍一下信号量,它约等于是没有容量的队列,或者把它当成是一个计数器。我们对信号量的操作有加一和减一。 如果信号量当前的值为0并且我需要进行减一