uCOS信号量的等待机制

简介: uCOS信号量的等待机制

刚开始接触 uCOS 的同学有可能不了解信号量的意思,云里雾绕。

其实说白了,信号量就是操作系统提供的一种数据通信方式,他相当于一把钥匙,可以在不同任务之间进行通信,告诉其他任务是否可以执行了。

比如任务 A 满足一定的条件需要执行任务 B , 那么任务 A 可以在自己的任务函数中释放一个信号量,任务 B 等到这个信号量之后,便觉得有信号了,好,我可以运行了。

uCOS提供了以下几个信号量相关的函数:

OSSemCreate()
OSSemDel ()
OSSemPend ()
OSSemPost ()
OSSemAccept()
OSSemQuery()

其中,我们常用的只有三个即 OSSemCreate () OSSemPend() OSSemPost()

uCOS 中,信号量的结构为:

typedef struct os_event 
{
    INT8U    OSEventType;                  
    void    *OSEventPtr;                   
    INT16U   OSEventCnt;                   
    OS_PRIO  OSEventGrp;                   
    OS_PRIO  OSEventTbl[OS_EVENT_TBL_SIZE]; 
} OS_EVENT;

可以看到其中有个 OSEventCnt ,这是一个计数器,用来统计任务中某一资源被占用的情况。如果资源被占用,则该计数器由操作系统减一。

一般信号量可以有两种,二值互斥型以及计数型。怎么理解呢?互斥型就是说这个资源在同一时刻只能被一个任务所使用,比如用串口发送数据,这个串口在同一时刻只能发送一个任务的数据,否则会造成数据紊乱,对于这种情况,就可以创建互斥信号量:

OSSemCreate(1)

参数1表示这个资源只有一个,任何任务都必须等待这个资源空闲的时候才能使用。

还有一种计数型的信号量,比如串口接收数据,接收到一个数据,我们加 1 ,也就是 OSEventCnt++ ,这样的信号量为计数型,在串口接收完数后,可以查看该信号量的值,来判断串口接收到的数据长度。

ucos等待信号量机制

OSSemPend() 函数为等待信号量,其格式为
OSSemPend (Sem,0,&err)
Sem是我们定义的信号量,0代表无限期等待下去,如果其他任务没有释放信号量,那么本任务将暂停在这句等待信号量语句这,当然也可以自己设置超时,如等待1s,等不到信号量则根据err错误信息的情况执行相应的语句。

等待机制简单理解:程序暂停,别的任务一旦释放信号量,本任务在优先级调度后立刻执行。

相关文章
|
5月前
|
消息中间件
共享内存和信号量的配合机制
【9月更文挑战第16天】本文介绍了进程间通过共享内存通信的机制及其同步保护方法。共享内存可让多个进程像访问本地内存一样进行数据交换,但需解决并发读写问题,通常借助信号量实现同步。文章详细描述了共享内存的创建、映射、解除映射等操作,并展示了如何利用信号量保护共享数据,确保其正确访问。此外,还提供了具体代码示例与步骤说明。
|
7月前
CubeMXST32 FreeRTOS 信号量
CubeMXST32 FreeRTOS 信号量
90 11
|
9月前
|
存储 安全 Linux
【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念
【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念
|
9月前
|
安全 算法 Linux
【Linux 系统】多线程(线程控制、线程互斥与同步、互斥量与条件变量)-- 详解(下)
【Linux 系统】多线程(线程控制、线程互斥与同步、互斥量与条件变量)-- 详解(下)
|
9月前
|
存储 Linux 程序员
【Linux 系统】多线程(线程控制、线程互斥与同步、互斥量与条件变量)-- 详解(中)
【Linux 系统】多线程(线程控制、线程互斥与同步、互斥量与条件变量)-- 详解(中)
|
9月前
|
缓存 Linux 调度
【Linux 系统】多线程(线程控制、线程互斥与同步、互斥量与条件变量)-- 详解(上)
【Linux 系统】多线程(线程控制、线程互斥与同步、互斥量与条件变量)-- 详解(上)
|
9月前
|
API 调度
【FreeRTOS】信号量的使用
【FreeRTOS】信号量的使用
106 0
|
9月前
|
Linux
Linux进程与线程的内核实现
task_struct称为进程描述符结构,该结构定义在文件中。进程描述符中包含一个具体进程的所有信息 进程描述符中包含的数据能完整地描述一个正在执行的程序:它打开的文件,进程的地址空间,挂起的信号,进程的状态等
81 0
Linux进程与线程的内核实现
|
存储 网络协议 API
4-FreeRTOS队列、互斥、信号量
4-FreeRTOS队列、互斥、信号量
|
算法 C++
2.4操作系统(信号量机制 进程互斥 进程同步 前驱关系)
信号量机制 1.整型信号量 2.记录型信号量 3.实现进程互斥 4.实现进程同步 5.实现进程的前驱关系
2.4操作系统(信号量机制 进程互斥 进程同步 前驱关系)

热门文章

最新文章