资讯动态

Freertos中的信号量

发布时间:2026/8/31 5:10:20 来源:尧图企业网站定制
一、信号量的简介FreeRTOS中的信号量是一种用于任务间同步和资源管理的机制。信号量可以是二进制的只能取0或1也可以是计数型的可以是任意正整数。信号量的基本操作包括“获取”和“释放”。信号量队列主要用于管理对共享资源的访问确保在同一时刻只有一个任务可以访问共享资源用于任务之间的数据通信通过在任务之间传递消息实现信息的传递和同步。可以是二进制信号量Binary Semaphore或计数信号量Counting Semaphore存储和传递消息的数据结构任务可以发送消息到队列也可以从队列接收消息。适用于对资源的互斥访问控制任务的执行顺序或者限制同时访问某一资源的任务数量。适用于在任务之间传递数据实现解耦和通信。信号量是一种特殊的队列元素只有一个二、二值信号量二值信号量Binary Semaphore是一种特殊类型的信号量它只有两个可能的值0和1。这种信号量主要用于实现对共享资源的互斥访问或者任务之间的同步。两个状态 二值信号量只能处于两个状态之一通常用0和1表示。当信号量的值为0时表示资源不可用当值为1时表示资源可用。互斥访问 常用于控制对共享资源的互斥访问确保在同一时刻只有一个任务可以访问共享资源。任务在访问资源之前会尝试获取信号量成功则继续执行失败则等待。任务同步 也可以用于任务之间的同步例如一个任务等待另一个任务完成某个操作。如果多个任务在同一个信号量上阻塞那么具有最高优先级的任务将在下次信号量可用时最先解除阻塞。二值信号量相关函数函数描述xSemaphoreCreateBinary()使用动态方式创建二值信号量xSemaphoreCreateBinaryStatic()使用静态方式创建二值信号量xSemaphoreGive()释放信号量xSemaphoreGiveFromISR()在中断中释放信号量xSemaphoreTake()获取信号量xSemaphoreTakeFromISR()在中断中获取信号量三、二值信号量实验1、实验目标学习使用 FreeRTOS 的二值信号量相关函数start_task用来创建其他的2个任务。task1用于按键扫描当检测到按键KEY1被按下时释放二值信号量。task2获取二值信号量当成功获取后打印提示信息。2、freertos_demo.c代码3、实验结果四、计数型信号量计数信号量通常用于两种情况事件计数在此使用方案中每次事件发生时事件处理程序将“给出”一个信号量信号量计数值递增 并且 处理程序任务每次处理事件信号量计数值递减时“获取”一个信号量。因此计数值是 已发生的事件数与已处理的事件数之间的差值。在这种情况下 创建信号量时计数值可以为零。资源管理在此使用情景中计数值表示可用资源的数量。要获得对资源的控制权任务必须首先获取 一个信号量——同时递减信号量计数值。当计数值达到零时表示没有空闲资源可用。当任务使用完资源时 “返还”一个信号量——同时递增信号量计数值。在这种情况下 创建信号量时计数值可以等于最大计数值。计数型信号量相关函数函数描述xSemaphoreCreateCounting()使用动态方法创建计数型信号量。xSemaphoreCreateCountingStatic()使用静态方法创建计数型信号量uxSemaphoreGetCount()获取信号量的计数值五、计数型信号量实验1、实验目标学习使用 FreeRTOS 的计数型信号量相关函数start_task用来创建其他的2个任务。task1用于按键扫描当检测到按键KEY1被按下时释放计数型信号量。task2每过一秒获取一次计数型信号量当成功获取后打印信号量计数值。2、​​​​​​​FreeRTOSConfig.h代码清单#defineconfigUSE_COUNTING_SEMAPHORES13、freertos_demo.c代码六、优先级翻转优先级翻转是一个在实时系统中可能出现的问题特别是在多任务环境中。该问题指的是一个较低优先级的任务阻塞了一个较高优先级任务的执行从而导致高优先级任务无法及时完成。七、​​​​​​​优先级翻转实验1、实验目标模拟优先级翻转观察对抢占式内核的影响start_task用来创建其他的3个任务。task1低优先级任务同高优先级一样的操作不同的是低优先级任务占用信号量的时间久一点。task2中等优先级任务简单的应用任务。task3高优先级任务会获取二值信号量获取成功以后打印提示信息处理完后释放信号量。2、freertos_demo.c代码3、实验结果八、​​​​​​​互斥信号量互斥信号量是包含优先级继承机制的二进制信号量。优先级继承是一种解决实时系统中任务调度引起的优先级翻转问题的机制。在具体的任务调度中当一个高优先级任务等待一个低优先级任务所持有的资源时系统会提升低优先级任务的优先级以避免高优先级任务长时间等待的情况。互斥信号量相关函数函数描述xSemaphoreCreateMutex()使用动态方法创建互斥信号量。xSemaphoreCreateMutexStatic()使用静态方法创建互斥信号量。互斥信号量的获取和释放函数与二值信号量的相应函数相似但有一个重要的区别互斥信号量不支持在中断服务程序中直接调用。注意当创建互斥信号量时系统会自动进行一次信号量的释放操作。九、​​​​​​​互斥信号量实验1、实验目标在前面优先级翻转实验的案例中通过互斥信号量来解决优先级翻转问题信号量函数改成互斥信号量通过串口打印提示信息。2、​​​​​​​FreeRTOSConfig.h代码清单#defineconfigUSE_MUTEXES13、freertos_demo.c代码4、实验结果

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价