1.总结二进制信号量和计数型信号量的区别,以及他们的使用场景。
二进制信号量:信号量的数值只有0和1(用于共享资源的访问)
计数性信号量:计数型信号量的值一般是大于或者等于2(生产者和消费者模型)
2.使用技术型信号量完成生产者和消费者模型实验。
/* creation of myCountingSem01 */
myCountingSem01Handle = osSemaphoreNew(2, 2, &myCountingSem01_attributes);
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
osSemaphoreAcquire(myCountingSem01Handle, 0);
printf("生产一辆车\r\n");
osDelay(500);
}
/* USER CODE END StartDefaultTask */
}
/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
osSemaphoreRelease(myCountingSem01Handle);
printf("消费两辆\r\n");
osDelay(1000);
}
/* USER CODE END StartTask02 */
}
3.总结FreeRTOS中同步和互斥的五种方法的使用方法
队列、信号量、互斥量、事件组、任务通知
队列是用于任务之间的通信,遵循先进先出的规则。
信号量是一个长度为1的特殊队列,长度为1的空间用于存储信号量的计数值。
互斥量主要就是用于保护共享资源,FreeRTOS中互斥量没有实现谁上锁就由谁解锁。
在FreeRTOS中,事件组是一种同步机制,用于任务之间的通信和同步。它允许任务等待多个事件的状态,并且可以在任何事件被设置时唤醒等待的任务。
事件组其实就是一个整数,一个整数中有很多个位,每一位都可以表示为一个事件。事件具体表示什么含义可以由我们自己决定,当事件发生后对应的位会被设置为1。
以上需要创建后才能使用。
任务通知通过TCB控制块来完成,不需要创建。
4.总结任务通知和其他任务通信机制的区别
队列、信号量、互斥量、事件组在使用之前都需要先创建,才能使用,任务通知无需创建即可使用。
队列、信号量、互斥量、事件组 多对多通信。任务通知是多对一通信。
队列、信号量、互斥量、事件组需要被创建所以消耗的资源比较多、任务通知不需要被创建消耗的资源少。
5.根据文档和录屏学习一下软件定时器,了解软件定时器的作用和软件定时器和硬件定时器的区别
软件定时器用于控制任务的执行时间。通过设置定时器,可以让某个任务在指定的时间后执行,实现任务的延时启动或周期性执行。
硬件定时器是基于硬件的,通常集成在微控制器或其他处理器中。它们利用硬件计数器进行计时,能够提供高精度的时间测量。硬件定时器直接由硬件支持,对系统资源的消耗相对较小。
软件定时器是通过软件算法实现的,依赖于操作系统的调度机制。它们的精度受到系统调度策略和当前系统负载的影响。软件定时器需要操作系统参与调度,可能会消耗更多的CPU资源,特别是在大量定时器活跃时。