1. 信号量基本概念
信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问, 常用于协助一组相互竞争的任务来访问临界资源。二值信号量:在 uCOS 中我们用信号量用于同步,任务与任务的同步,中断与任务的同步,可以大大提高效率。计数信号量:在实际的使用中,我们常将计数信号量用于事件计数与资源管理。
2. 信号量应用场景
因为信号量资源被获取了,信号量值就是 0,信号量资源被释放,信号量值就是 1,把这种只有 0 和 1 两种情况的信号量称之为二值信号量。二值信号量在任务与任务中同步的应用场景;二值信号量在任务与中断同步的应用场景;
3. 二值信号量运作机制
创建信号量时,系统会为创建的信号量对象分配内存,并把可用信号量初始化为用户自定义的个数, 二值信号量的最大可用信号量个数为 1。
二值信号量获取,任何任务都可以从创建的二值信号量资源中获取一个二值信号量,获取成功则返回正确,否则任务会根据用户指定的阻塞超时时间来等待其它任务/中断释放信号量。在等待这段时间,系统将任务变成阻塞态,任务将被挂到该信号量的阻塞等待列表中。
4. 计数信号量运作机制
计数信号量可以用于资源管理,允许多个任务获取信号量访问共享资源,但会限制任务的最大数目。
5. 信号量控制块
uCOS 的信号量由多个元素组成,在信号量被创建时,需要由我们自己定义信号量控制块(也可以称之为信号量句柄),因为它是用于保存信号量的一些信息的,其数据结构OS_SEM 除了信号量必须的一些基本信息外,还有 PendList 链表与 Ctr,为的是方便系统来管理信号量。
6. 信号量函数接口
创建信号量函数 OSSemCreate()
信号量删除函数 OSSemDel()
信号量释放函数 OSSemPost()
信号量获取函数 OSSemPend()
7. 信号量实验
二值信号量同步实验: 信号量同步实验是在 uCOS 中创建了两个任务,一个是获取信号量任务,一个是释放信号量任务,两个任务独立运行,获取信号量任务是一直在等待信号量,释放信号量任务在检测按键是否按下,如果按下则释放信号量,此时释放信号量会唤醒获取任务,获取任务开始运行,然后形成两个任务间的同步, LED 进行翻转。
计数型信号量实验: 是模拟停车场工作运行。在创建信号量的时候初始化 5 个可用的信号量,并且创建了两个任务:一个是获取信号量任务,一个是释放信号量任务,两个任务独立运行,获取信号量任务是通过按下 KEY1 按键进行信号量的获取,模拟停车场停车操作,其等待时间是 0,在串口调试助手输出相应信息。释放信号量任务则是信号量的释放,释放信号量任务也是通过按下KEY2 按键进行信号量的释放,模拟停车场取车操作,在串口调试助手输出相应信息。