1.总结二进制信号量和计数型信号量的区别,以及他们的使用场景。
二进制信号量:信号量的数值只能是0和1,用于共享资源的访问
计数型信号量:信号量的值都是大于或者等于2,实现生产者和消费者模型
2.使用技术型信号量完成生产者和消费者模型实验。
void StartDefaultTask(void *argument)
{
for(;;)
{
osSemaphoreRelease(myCountingSem01Handle);
printf("生产1\r\n");
osSemaphoreRelease(myCountingSem01Handle);
printf("生产2\r\n");
osDelay(500);
}
}
void StartTask02(void *argument)
{
for(;;)
{
osSemaphoreAcquire(myCountingSem01Handle,osWaitForever);
printf("消费者1\r\n");
osSemaphoreAcquire(myCountingSem01Handle,osWaitForever);
printf("消费者2\r\n");
osSemaphoreAcquire(myCountingSem01Handle,osWaitForever);
printf("消费者3\r\n");
osDelay(500);
}
3.总结FreeRTOS中同步和互斥的五种方法的使用方法
//创建队列函数
osMessageQueueId_t osMessageQueueNew (uint32_t msg_count,
uint32_t msg_size,
const osMessageQueueAttr_t *attr
)
//队列写函数
osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id,
const void *msg_ptr,
uint8_t msg_prio, uint32_t timeout
)
//队列读函数
osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id,
void *msg_ptr,
uint8_t *msg_prio,
uint32_t timeout
)
2)信号量
//创建信号量的函数:
osSemaphoreId_t osSemaphoreNew (uint32_t max_count,
uint32_t initial_count,
const osSemaphoreAttr_t *attr
)
互斥量:用于保护共享资源
4)事件组:允许任务等待多个事件的状态,并且可以在任何事件被设置时唤醒等待的任务
5)任务通知:通知任务,用来实现任务之间的同步和互斥
4.总结任务通知和其他任务通信机制的区别
1)任务通知无需创建,可以直接使用,通过任务控制块来实现(TCB),队列、信号量、互斥量、事件组都需要创建后才能使用。
2)任务通知所需的资源比队列、信号量、互斥量、事件组要少。
3)队列、信号量、互斥量、事件组主要用于多对多之间的通信,任务通知是一对一之间的通信。
5.根据文档和录屏学习一下软件定时器,了解软件定时器的作用和软件定时器和硬件定时器的区别
软件定时器的作用:在指定的时间到来时执行指定的函数,或者以某个频率周期性地执行某个函数。被执行的函数叫做软件定时器回调函数。
区别:
1)硬件定时器精度比软件定时器高
2)软件定时器消耗的资源比较多
3)软件定时器的数量理论上没有限制,硬件定时器的数量和硬件相关