其他分享
首页 > 其他分享> > UCOSIII信号量和互斥信号量

UCOSIII信号量和互斥信号量

作者:互联网

1、UCOSIII信号量

1.1、信号量简介:

信号量像是一种上锁机制,代码必须获得对应的钥匙才能继续执行,一旦获得了钥匙,也就意味着该任务具有进入被锁部分代码的权限。一旦执行至被锁代码段,则任务一直等待,直到对应被锁部分代码的钥匙被再次释放才能继续执行。

信号量用来控制对共享资源的保护,但是现在基本用来做任务同步用

要想获取资源的任务必须执行 “等待” 操作,如果该资源对应的信号量有效值大于1,则任务可以获得该资源,任务继续运行。如果该信号量的有效值为0,则任务加入等待信号量的任务表中。如果等待时间超过某一个设定值,该信号量仍然没有被释放掉,则等待信号量的任务就进入就绪态,如果将等待时间设置为0的话任务就将一直等待该信号量

信号量通常分为两种:二进制信号量和计数型信号量

1.2、信号量API函数:

函数名作用
OSSemCreate()建立一个信号量
OSSemDel()删除一个信号量
OSSemPend()等待一个信号量
OSSemPendAbrot()取消等待
OSSemPost()释放或者发出一个信号量
OSSemSet()强制设置一个信号量的值

OSSemCreate 创建信号量:

void  OSSemCreate (OS_SEM      *p_sem,
                   CPU_CHAR    *p_name,
                   OS_SEM_CTR   cnt,
                   OS_ERR      *p_err)

OSSemPend 请求信号量:

OS_SEM_CTR  OSSemPend (OS_SEM   *p_sem,
                       OS_TICK   timeout,
                       OS_OPT    opt,
                       CPU_TS   *p_ts,
                       OS_ERR   *p_err)

2、UCOSIII互斥信号量

2.1、优先级反转:

优先级反转在可剥夺反转内核中是非常常见的,在实时系统中不允许出现这种现象,这样会破坏任务的预期顺序,可能会导致严重的后果
在这里插入图片描述
任务优先级:任务H > 任务M > 任务L

时间线从左往右

2.2、互斥信号量:

为了避免优先级反转这个问题,UCOSIII支持一种特殊的二进制信号量:互斥信号量,用它可以解决优先级反转问题。
在这里插入图片描述

2.2、互斥信号量API函数:

函数名作用
OSMutexCreate()建立一个互斥信号量
OSMutexDel()删除一个互斥信号量
OSMutexPend()等待一个互斥信号量
OSMutexPendAbrot()取消等待
OSMutexPost()释放或者发布一个互斥信号量

3、UCOSIII任务内嵌信号量

在UCOSIII中每个任务都有自己的内嵌的信号量,这种功能不仅能够简化代码,而且比使用独立的信号量更有效。任务信号量是直接内嵌在UCOSIII中的,任务信号量相关代码在 os_task.c 中

函数名作用
OSTaskSemPend()等待一个任务信号量
OSTaskSemPendAbrot()取消等待任务信号量
OSTaskSemPost()发布任务信号量
OSTaskSemSet()强行设置任务信号量计数

标签:UCOSIII,TASK,ERR,ISR,INVALID,信号量,互斥,OS
来源: https://blog.csdn.net/xuexiwd/article/details/121430451