ucos2 事件 任务的通讯和同步 信号量 互斥量 消息邮箱 消息队列

这会想了想,在复习资料后,最后再做个核心代码分析

ucos中使用信号量、消息邮箱、消息队列,这些数据结构来作为通信中间媒介。这些数据结构会影响任务的程序流程,因此也叫做事件。

一、信号量

是进行任务通信的最基本事件

二值信号可以实现共享资源的独占,也叫互斥信号量。

注意:使用信号量的时候要,高优先级的任务等待接受信号量的时候,高优先级的任务在等待接受信号量的时候,如果低优先级的任务没有释放信号量,那就会一直等待下去,那低优先级的任务就没有机会运行了,系统就出现死机的状况了。   解决方法:加个超时等待.

在使用信号量同步时:一个任务能否运行取决于2个条件-----1是优先级  2是是否获得信号量。相当于串联关系。这也引起了一个优先级反转的问题。

二、消息邮箱:

多任务进行通信的时候,消息邮箱是用来传递消息缓冲区指针的数据结构。

三、消息队列

多任务进行通信的时候,消息队列是用来传递多个消息邮箱的数据结构。

四、事件的等待任务列表

对于正在等待的多个任务、需要对其进行记录和按照优先级排序;还要制定任务等待的最大时间,避免低优先级的任务永远无法运行。

下面对等待任务的记录和排序的处理:

一个 INT8U 类型的数组 OSEventTbl
[],作为记录等待事件任务的记录表。

一个 INT8U 类型的变量 OSEventGrp 来表示组。

其实和就绪表原理一样,这个等待任务表中仍然是以任务的优先级别为顺序, 令系统中的每个任务都在表中占据一位, 并用该位为
1 来表示这一位对应的任务为事件的等待任务, 否则不是等待任务。

下面是等待任务的等待时限的处理:

记录在等待任务的任务控制块TCB的成员OSTCBDly中,并在每个时钟节拍中断服务程序中对该数据进行维护。每当有任务的等待时限已到时,则将该任务从事件等待任务表中删除,并使它进入就绪状态。

五、事件控制块

为了把事件的数据结构统一起来,就定了了事件控制块ECB,专门用来描述消息邮箱、消息队列、信号量这些事件的。

OSEventType 可取的值

OS_EVENT_TYPE_MUTEX 表明事件是互斥型信号量

OS_EVENT_TYPE_MBOX 表明事件是消息邮箱

OS_EVENT_TYPE_Q 表明事件是消息队列

OS_EVENT_TYPE_UNUSED 空事件控制块(未被使用的事件控制块)

六、事件控制块的几个操作函数

EventWaitListInit    () 事件控制块初始化函数:清楚表中的数据为0
在创建事件时被调用

OS_EventTaskWait() 请求事件不能成功 ,使一任务进入等待状态,在等待列表登记任务,并在任务控制块中设置为
                                                          等待状态,最后还要在就绪表中,设置为非就绪状态。

OS_EventTaskRdy ()使一个等待的任务进入就绪状态,

OS_EventTO()    使一个等待超时的任务进入就绪状态

事件控制块链表也有空和工作中的2种区分,类似于任务控制块,就不多说了

七、信号量详细

重要组成:类型    cnt     信号量指针为空     控制块

1.创建信号量

OSSemCreat(cnt)------------设置类型 设置初始化计数 设置指向缓冲区为空 初始化事件控制块  返回信号量指针

2.请求信号量

OSSemPend(信号量指针  时限   错误信息) 信号量无效时,任务会等待

OSsemAccept(信号量) 信号量无效时,任务直接继续运行

3.释放信号量

OSSemPost(信号量指针)

4.删除信号量

OSSemDel(信号量名、条件选项、错误信息)

5.查询信号量状态

OSSemQuery()

八、优先级反转和互斥量

优先级反转:ab等待状态,c运行;c最低优先级,在c没有释放信号量的情况下,a运行了,那a会等待,然后c运行了在释放信号量之前有个任务b运行了,那b只得在a之前运行了。好像b的优先级比a高了。

出现这种情况是因为低优先级的任务使用信号量的过程中被打断,不能释放信号量。

解决方法就是c使用信号量的时候提高优先级(因为在使用信号量比a的优先级要高),释放信号量再恢复原来的优先级。

九、互斥量

任务可用互斥量,来实现对资源的独占

数据类型要为互斥量类型     cnt分为高8字节和低8字节,低8位0xff表示信号有效,高8位记录了临时的提升的优先级。

1.创建互斥量

OSMutexCreat(提升的优先级 错误信息)

2.请求互斥量

OSMutexPend(互斥量指针  超时    错误信息)

OSMutexAccept(互斥量指针  错误信息)  互斥量无效任务会继续运行

3.释放互斥量

OSMutexPost(互斥量指针)

4.获取互斥量的当前状态

OSMutexQuery(互斥量指针  存储的数据结构)

5.删除互斥量

OSMutexDel(互斥量指针 直接删除还是等待任务执行完删    错误信息)

十、消息邮箱

1.OSMboxCreat(msg)

消息邮箱 :设置类型为消息邮箱类型;设置指针为空,或指向缓冲区;设置cnt为0;初始化ECB

2.OSMboxPost(消息邮箱的指针, 消息缓冲区指针)

发送消息邮箱

时间: 2024-10-13 15:49:28

ucos2 事件 任务的通讯和同步 信号量 互斥量 消息邮箱 消息队列的相关文章

一起talk C栗子吧(第一百一十六回:C语言实例--线程同步之互斥量二)

各位看官们,大家好,上一回中咱们说的是线程同步之信号量的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 我们在上一回中详细介绍了互斥量相关函数的用法,这一回中,我们介绍如何使用这些函数来操作互斥量. 下面是详细的操作步骤: 1.定义一个互斥量A,用来同步线程: 2.在创建线程的进程中使用pthread_mutex_init函数初始化互斥量,互斥量的属性使用默认值: 3.在读取数据的线程中读取数据,首先使用pthread_mutex_lock函数对互斥量A进行加锁

C#学习笔记---线程同步:互斥量、信号量、读写锁、条件变量

http://www.cnblogs.com/maxupeng/archive/2011/07/21/2112282.html 一.互斥量(mutex) 互斥量本质上是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁. 对互斥量进行加锁以后,任何其它试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁.如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为运行状态的线程可以对互斥量加锁,其它线程将会看到互斥锁依然被锁住,只能回去再次

Linux 多线程同步机制:互斥量、信号量、条件变量

互斥量:互斥量提供对共享资源的保护访问,它的两种状态:lock和unlock,用来保证某段时间内只有一个线程使用共享资源,互斥量的数据类型是pthread_mutex_t主要涉及函数:pthread_mutex_lock() pthread_mutex_trylock() pthread_mutex_unlock()Pthreaf_mutex_init() pthread_mutex_destroy()lock与unlock之间所锁定的区域为临界区域(如果只加锁不解锁程序会阻塞等待)信号量:信号

线程同步之——互斥量及死锁问题

互斥量:多个线程同时访问共享数据时可能会冲突,这跟信号的可重性是同样的问题.如 果两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 1. 从内存读变量值到寄存器 2. 寄存器的值加1 3. 将寄存器的值写回内存 先举个例子:创建两个线程,各把counter增加5000次,正常情况下最后counter应该等于10000. 代码实现如下: 结果: 可以看到,每次运行程序的结果都不一样.说明在调用过程中发生了互斥现象. 解决办法:加互斥锁 实现多线程同步可以引互斥锁(Mutex,M

线程同步与互斥量

线程同步: 当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图.如果每个线程使用的变量都是其他线程不会读取和修改的,那么就不存在一致性问题.同样,如果变量是只读的,多个线程同时读取该变量也不会有一致性的问题.但是,当一个线程可以修改的变量,其他线程也可以读取和修改的时候,我们就需要对这些线程进行同步,确保它们在访问变量的存储内容时不会访问到无效的值. 为了解决这个问题,线程不得不使用锁,同一时间只允许一个线程访问该变量. 两个或多个线程在同一时间修改同一变量,也需要进行同步.考虑变量

1线程同步:互斥量,死锁

 1线程为什么要同步 A:共享资源,多个线程都可对共享资源操作. B:线程操作共享资源的先后顺序不确定. C:处理器对存储器的操作一般不是原子操作. 2互斥量 mutex操作原语 pthread_mutex_t pthread_mutex_init pthread_mutex_destroy pthread_mutex_lock pthread_mutex_trylock pthread_mutex_unlock 3 临界区(Critical Section) 保证在某一时刻只有一个线程能访

Linux多线程同步之互斥量和条件变量

1. 什么是互斥量 互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁.对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁.如果释放互斥锁时有多个线程阻塞,所以在该互斥锁上的阻塞线程都会变成可进行状态,第一个变成运行状态的线程可以对互斥量加锁,其他线程在次被阻塞,等待下次运行状态. pthread_mutex_t 就是POSIX对于mutex的实现. 函数名 参数 说明 pthread_mutex_init pthre

线程的同步之互斥量

互斥量: 当多个线程共享相同的内存时,需要每一个线程看到相同的视图.当一个线程修改变量时,而其他线程也可以读取或者修改这个变量,就需要对这些线程同步,确保他们不会访问到无效的变量 在变量修改时间多于一个存储器访问周期的处理器结构中,当存储器的读和写这两个周期交叉时,这种潜在的不一致性就会出现.当然这与处理器相关,但是在可移植的程序中并不能对处理器做出任何假设 为了让线程访问数据不产生冲突,这要就需要对变量加锁,使得同一时刻只有一个线程可以访问变量.互斥量本质就是锁,访问共享资源前对互斥量加锁,访

LinuxC线程pthread线程同步进程同步-互斥量、信号量、条件变量、读写锁、文件锁

1. 同步概念 2. 线程同步 3. 进程同步 4. 生产者消费者模型 5. 哲学家问题 原文地址:https://www.cnblogs.com/yongfengnice/p/12116954.html