信号量
信号量基本概念
信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥
访问,常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中,各任务之间需要同步
或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。
抽象的来讲,信号量是一个非负整数,所有获取它的任务都会将该整数减一(获取它当然是为了
使用资源),当该整数值为零时,所有试图获取它的任务都将处于阻塞状态。通常一个信号量的
计数值用于对应有效的资源数,表示剩下的可被占用的互斥资源数。其值的含义分两种情况:
• 0:表示没有积累下来的释放信号量操作,且有可能有在此信号量上阻塞的任务。
• 正值,表示有一个或多个释放信号量操作。
二值信号量的应用场景
用于任务间、任务与中断间同步的重要手段
二值信号量运作机制
二值信号量获取,任何任务都可以从创建的二值信号量资源中获取一个二值信号量,获取成功则
返回正确,否则任务会根据用户指定的阻塞超时时间来等待其他任务/中断释放信号量。在等待
这段时间,系统将任务变成阻塞态,任务将被挂到该信号量的阻塞等待列表中。
计数信号量的运作机制
计数信号量可以用于资源管理,允许多个任务获取信号量访问共享资源,但会限制任务的最大数
目。访问的任务数达到可支持的最大数目时,会阻塞其他试图获取该信号量的任务,直到有任务
释放了信号量。
信号控制块
- CMSIS-RTOS 使用 osSemaphoreAttr_t 结构体来描述信号量属性
- 创建信号量函数 osSemaphoreNew()
- 信号量删除函数 osSemaphoreDelete()
- 信号量释放函数 osSemaphoreRelease()
- 信号量释放函数 osSemaphoreRelease() FreeRTOS 为我们提供两个不同的 API 函数,而 CMSIS-RTOS 为我们封装了统一的信号量释放函数
- 信号量获取函数 osSemaphoreAcquire()