一、总结二进制信号量和计数型信号量的区别,以及他们的使用场景。
二进制信号量和计数型信号量都是用于任务同步和资源管理的机制。
区别:
1.二进制信号量的值只有0和1;计数型信号量的值可以是任意非负整数(一般大于等于2)。
2.二进制信号量主要用于实现互斥,确保任何时候只有一个任务能够访问特定的临界区或资源;计数型信号量则可以管理有限数量的同类资源,允许多个任务同时访问,但受限于信号量的初始计数值。
3.二进制信号量一般用于保护共享资源;计数型信号量一般用于解决生产者和消费者模型。
应用场景:
二进制信号量:1.用于互斥访问,保护单一资源,防止多任务同时访问;2.任务间的简单同步,当一个任务需要等待另一个任务完成特定操作后才能继续执行时,可以使用二进制信号量。
计数型信号量:1.资源池管理,控制对 一组可复用资源(如内存块)的访问,允许多个任务同时使用但不超过最大限制;2.多任务间的批量同步,当需要协调多任务同时进入或离开某一状态时,计数型信号量可以跟踪 等待的或已经完成任务的数量。
二、使用计数型信号量完成生产者和消费者模型实验。
代码:
三、总结FreeRTOS中同步和互斥的五种方法的使用方法。
1.队列:FreeRTOS中的队列是用于任务之间的通信,遵循先进先出的规则。
第一步:创建队列,分为动态创建和静态创建,动态创建使用xQueueCreate函数进行创建,静态创建使用xQueueCreateStatic函数进行创建。
第二步:写操作,队列写操作也分为两种:一种是在中断中使用的一个函数:xQueueSendToBackFromISR,另一种是在任务中使用的:xQueueSendToBack。
第三步:读操作,读函数也分为两种:一种是在中断中进行队列的读取(xQueueReceiveFromISR),另一种是在任务中进行队列的读取。(xQueueReceive)
2.信号量:FreeRTOS中信号量主要被用于实现任务之间同步和互斥,也可以用于访问共享资源的时候使用。分为两种,分别为二进制信号量和计数型信号量。
第一步:创建信号量,分为创建二进制信号量xSemaphoreCreateBinary,创建计数型信号量xSemaphoreCreateCounting。
第二步:获取信号量(信号量值大于零才能被获取),根据创建时返回的id 获取二进制/计数型信号量信号量xSemaphoreTake。
第三步:释放信号量,根据创建时返回的id 释放二进制/计数型信号量信号量xSemaphoreGive。
第四步:销毁信号量vSemaphoreDelete。
3.互斥量:FreeRTOS中互斥量主要就是用于保护共享资源,保证数据访问的一致性和正确性。
第一步:创建互斥量 xSemaphoreCreateMutex
第二步:获取/锁定互斥量 (同获取信号量)xSemaphoreTake。
第三步:释放/解锁互斥量 (同释放信号量)xSemaphoreGive。
第四步:销毁互斥量 (同销毁信号量)xSemaphoreDelete。
4.事件组:在FreeRTOS中,事件组是一种同步机制,用于任务之间的通信和同步。它允许任务等待多个事件的状态,并且可以在任何事件被设置时唤醒等待的任务。
第一步:创建事件组 xEventGroupCreate。
第二步:设置事件 xEventGroupSetBits 设置完成对应的等待程序将被唤醒。
第三步:清除事件 xEventGroupClearBits 清除事件组中的一个或者多个事件标志。
第四步:等待事件xEventGroupWaitBits 让任务等待一个或者多个事件的发生。
第五步:销毁事件组 xEventGroupDelete
5.任务通知:在FreeRTOS中,任务通知是一种直接的任务间通信能力 在创建任务时即存在。
第一步:发送通知 xTaskNotifyGive。
第二步:接收通知xTaskNotifyWait。
四、总结任务通知和其他任务通信机制的区别。
1.直接通信和间接通信:任务通知提供了直接任务间通信的能力,无需通过中间通信对象,不需要再去创建可以直接使用。 相反的信号量、互斥量、事件组、队列则是间接通信,需要创建一个独立的通信对象。
2.目标任务的唯一性:任务通知通常直接发送给特定的任务,这意味着机制通常只允许一个任务作为接受者,发送者明确知道通知将被哪个任务接收和处理。 而信号量、互斥量、事件组、队列则是可以被多个任务同时访问,允许多对多的通信关系。
3.通信内容:任务通知通常不携带复杂数据,主要用于触发事件或者状态变化的通知。而信号量、互斥量、事件组、队列则可以承载更丰富和复杂的数据。
4.资源占用和效率:任务通知基于直接通信,设计简洁,通常具有较低的内存占用和较高的执行效率。信号量、互斥量、事件组、队列则需要消耗较多的资源,相应的他们也提供了更丰富的同步互斥和通信选项。