UCOSIII信号量与互斥信号量

1.1、信号量简介:

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

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

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

1.2、信号量分类:

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

二进制信号量只能取0和1两个值,计数型信号量的信号量值大于1,计数型信号量的范围由OS_SEM_CTR决定,OS_SEM_CTR可以为8位,16位和32位,取值范围分别为:0~255,0~65535和0~4294967295。

二进制信号量用于那些一次只能一个任务使用的资源,比如I/O设备,打印机计,数型信号量用于某些资源可以同时被几个任务所使用,比如一个缓存池有10个缓存块,那么同时最多可以支持10个任务来使用内存池

1.3、信号量API函数:

OSSemCreate()      建立一个信号量

OSSemDel()         删除一个信号量

OSSemPend()       等待一个信号量

OSSemPendAbrot()   取消等待

OSSemPost()        释放或者发出一个信号量

OSSemSet()         强制设置一个信号量的值

2.1、优先级反转:

优先级反转在可剥夺内核中是非常常见的,在实时系统中不允许出现这种现象,这样会破坏任务的预期顺序,可能会导致严重的后果。

UCOSIII信号量与互斥信号量_第1张图片

2.2、互斥信号量:

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

UCOSIII信号量与互斥信号量_第2张图片

2.3、互斥信号量API函数:

OSMutexCreate()建立一个互斥信号量

OSMutexDel()删除一个互斥信号量

OSMutexPend()等待一个互斥信号量

OSMutexPendAbrot()取消等待

OSMutexPost()释放或者发布一个互斥信号量

3.1、UCOSIII任务内嵌信号量

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

3.2、任务信号量API函数:

OSTaskSemPend()等待一个任务信号量

OSTaskSemPendAbort()取消等待任务信号量

OSTaskSemPost()发布任务信号量

OSTaskSemSet()强行设置任务信号量计数

你可能感兴趣的:(uC/OS,III学习)