事件组 信号量的区分和定义 信号量的分类

发布时间:2026/9/30 2:21:01
事件组 信号量的区分和定义 信号量的分类 一、核心定义一句话说清信号量Semaphore是一个计数器。它通过一个数值0到N来管理资源数量或传递单一事件。操作是“拿走Take减1释放Give加1”。事件组Event Group是一个位图Bit Map。它用一个整数的每一位代表一个独立的事件如Bit0按键Bit1数据到达。操作是“置位Set”和“清除Clear”。二、事件组 vs 信号量最本质的5点区分对比维度信号量 (Semaphore)事件组 (Event Group)管理对象“数量”还剩几份资源/几次信号“状态”哪些条件当前成立了等待逻辑线性只要计数值 0就唤醒任务组合逻辑支持“与AND”和“或OR”可同时等待多个事件事件消费消耗性Take 一次计数值减 1状态保持位被置 1 后会一直保持直到任务主动清除唤醒方式单播释放一次通常只唤醒等待队列中优先级最高的一个任务广播事件满足条件时可同时唤醒所有等待该组合的任务中断适用性极优有轻量级FromISR版本受限FromISR版本耗时较长不适合高频中断事件组是可以挂起这个事件的所有任务和唤醒这个事件挂起的所有任务。三、信号量的完整分类4种信号量根据计数能力和所有权机制又分为以下4种它们同属“信号量”家族分类计数值范围所有权优先级继承核心用途FreeRTOS 创建函数1. 二进制信号量0 ~ 1❌ 无❌ 无任务同步中断发信号任务处理xSemaphoreCreateBinary()2. 计数信号量0 ~ N❌ 无❌ 无管理多个相同资源如5个缓冲区或“生产-消费”计数xSemaphoreCreateCounting()3. 互斥锁Mutex0 ~ 1✅有谁拿谁放✅支持保护共享资源独占访问外设/全局变量xSemaphoreCreateMutex()4. 递归互斥锁0 ~ 1✅有允许嵌套✅支持函数嵌套保护同一资源防止自己挂起自己xSemaphoreCreateRecursiveMutex()特别注意互斥锁和递归互斥锁虽然有“优先级继承”但严禁在中断ISR中使用因为涉及任务挂起和优先级变更。