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错误信息的情况执行相应的语句。

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

相关文章
|
开发框架 算法 安全
RFID 卡片型号及卡号获取 | 学习笔记
快速学习 RFID 卡片型号及卡号获取
RFID 卡片型号及卡号获取 | 学习笔记
|
网络协议
移远EC600N 4G模块连接步骤
移远EC600N 4G模块连接步骤
825 0
|
机器学习/深度学习 数据可视化 算法
机器学习-可解释性机器学习:随机森林与fastshap的可视化模型解析
机器学习-可解释性机器学习:随机森林与fastshap的可视化模型解析
1126 1
|
开发框架 Ubuntu 应用服务中间件
FastCGI与spawn-fcgi安装与配置
FastCGI与spawn-fcgi安装与配置
1041 0
FastCGI与spawn-fcgi安装与配置
|
11月前
|
数据处理 Apache 数据库
将 Python UDF 部署到 Apache IoTDB 的详细步骤与注意事项
【10月更文挑战第21天】将 Python UDF 部署到 Apache IoTDB 中需要一系列的步骤和注意事项。通过仔细的准备、正确的部署和测试,你可以成功地将自定义的 Python UDF 应用到 Apache IoTDB 中,为数据处理和分析提供更灵活和强大的支持。在实际操作过程中,要根据具体情况进行调整和优化,以确保实现最佳的效果。还可以结合具体的代码示例和实际部署经验,进一步深入了解和掌握这一过程。
132 2
|
12月前
|
关系型数据库 MySQL Nacos
nacos启动报错 load derby-schema.sql error
这篇文章描述了作者在使用Nacos时遇到的启动错误,错误提示为加载derby-schema.sql失败,作者通过将数据库从Derby更换为MySQL解决了问题。
nacos启动报错 load derby-schema.sql error
|
消息中间件 Linux 开发者
Linux进程间通信秘籍:管道、消息队列、信号量,一文让你彻底解锁!
【8月更文挑战第25天】本文概述了Linux系统中常用的五种进程间通信(IPC)模式:管道、消息队列、信号量、共享内存与套接字。通过示例代码展示了每种模式的应用场景。了解这些IPC机制及其特点有助于开发者根据具体需求选择合适的通信方式,促进多进程间的高效协作。
463 3
|
数据安全/隐私保护 开发者 索引
Python 简易图形界面库easygui 对话框大全(续)
Python 简易图形界面库easygui 对话框大全(续)
274 1
Python 简易图形界面库easygui 对话框大全(续)
|
存储 缓存 安全
经验大分享:stm32ITCM和ICache
经验大分享:stm32ITCM和ICache
213 0
经验大分享:stm32ITCM和ICache