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

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

相关文章
|
芯片 异构计算 内存技术
关于SPI协议,看这一篇文章就够了!
关于SPI协议,看这一篇文章就够了!
2892 0
关于SPI协议,看这一篇文章就够了!
|
6月前
|
IDE 数据可视化 开发工具
2026最新Thonny(Python IDE)使用全攻略教程(附安装包+图文步骤)
Thonny是爱沙尼亚塔尔图大学开发的Python初学者专用IDE,界面极简、内置Python解释器,无需配置即可开写;其可视化调试功能可直观查看变量变化,大幅降低学习门槛。支持Win/macOS/Linux,最新版为5.x。
|
Linux 网络安全 Android开发
高级 ping 命令及技巧
Ping命令是一种常用的网络诊断工具,用于测试网络连接的可达性和延迟等信息
5311 57
|
数据格式 Python
【嵌入式】波特率9600,发送8个字节需要多少时间,如何计算?
波特率9600,发送 `01 03 00 00 00 04 44 09` (8字节) 需要多少时间,如何计算?
1956 7
|
前端开发 JavaScript 安全
深入解析 http 协议
HTTP(超文本传输协议)不仅用于传输文本,还支持图片、音频和视频等多种类型的数据。当前广泛使用的版本为 HTTP/1.1。HTTPS 可视为 HTTP 的安全增强版,主要区别在于添加了加密层。HTTP 请求和响应均遵循固定格式,包括请求行/状态行、请求/响应头、空行及消息主体。URL(统一资源定位符)用于标识网络上的资源,其格式包含协议、域名、路径等信息。此外,HTTP 报头提供了附加信息,帮助客户端和服务端更好地处理请求与响应。状态码则用于指示请求结果,如 200 表示成功,404 表示未找到,500 表示服务器内部错误等。
1393 0
深入解析 http 协议
|
Rust 监控 网络协议
EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文
本文介绍了IgH EtherCAT Master整体运行原理
3577 0
EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文
|
测试技术 Linux Android开发
i2c总线及设备测试工具i2ctools:i2cdetect、i2cdump、i2cget、i2cset
本文介绍了i2ctools工具集的使用,包括i2cdetect、i2cdump、i2cget和i2cset,这些工具有助于I2C设备的开发和调试,通过检测设备、读写寄存器和数据块来提高开发效率。
5780 1
|
开发工具 git
git大小写规则造成的问题
git大小写规则造成的问题
git大小写规则造成的问题
|
机器学习/深度学习 人工智能 自然语言处理
【大模型】什么是大型语言模型(LLM)?
【5月更文挑战第4天】【大模型】什么是大型语言模型(LLM)?
STM32 ST-LINK Utility程序烧录方法
STM32 ST-LINK Utility程序烧录方法
7117 0