网站开发前期工作,苏州企业网站seo,网站开发前端招聘,米拓建站教程1.使用互斥信号量解决信号量导致的优先级反转#xff0c; 2.使用递归互斥信号量解决互斥信号量导致的死锁。 3.高优先级主函数中多次使用同一信号量的使用#xff0c;使用递归互斥信号量#xff0c;但要注意每个信号量的使用要对应一个释放 优先级翻转问题
优先级翻转功能需… 1.使用互斥信号量解决信号量导致的优先级反转 2.使用递归互斥信号量解决互斥信号量导致的死锁。 3.高优先级主函数中多次使用同一信号量的使用使用递归互斥信号量但要注意每个信号量的使用要对应一个释放 优先级翻转问题
优先级翻转功能需求
优先级翻转功能实现
一。实验优先级翻转问题 1.优先级翻转的解释 1有三个任务一个任务L优先级最低一个任务M优先级为中间一个任务H优先级为最高。 2刚开始任务L在运行并且L占用信号量 3H任务突然开始运行抢占L任务但是由于信号量由L占有所以进入堵塞状态CPU继续运行L任务。
4M任务突然开始运行抢占M任务M任务不需要信号量所以需要等运行完毕CPU才会分配给L。
5L不需要占用临界资源后释放信号量。H任务由堵塞态变为就绪态抢占L运行H。
2.功能需求 - 新建三个任务优先级分别为中高低 - 新建二值信号量用于模拟优先级翻转 - 低优先级任务获取信号量后被中优先级打断中优先级任务执行时间较长因为低优先级任务还未释放信号量高优先级任务就无法获取信号量继续 实现方法 1.低优先级 1获取二值信号量2循环释放CPU使用权3释放二值信号量4系统延时500ms 2.高优先级业务流程 1获取二值信号量2释放二值信号量3系统延迟500ms APItaskYIELD 3.cubemx创建工程
1创建一个高优先级的任务 2建一个二值信号量 3.步骤
1低优先级 使用二值信号量与高优先级使用的二值信号量是同一个。与高优先级相比多了一个释放CPU权限的函数taskYIELD。 printf(Low Task Take sem\n);//二值信号量的使用if(xSemaphoreTake(PrBinarySemHandle,portMAX_DELAY)pdPASS){printf(Low Task is Running\n);}for(i0;i2000000;i){//释放cputaskYIELD();}//二值信号量的释放printf(Low Task Give Sem\n);xSemaphoreGive(PrBinarySemHandle);osDelay(500);
2中优先级 不做特殊处理就是直接打印 3高优先级 与低优先级一起使用一个二值信号量 printf(High Task Take sem\n);if(xSemaphoreTake(PrBinarySemHandle,portMAX_DELAY)pdPASS){printf(High Task is running\n);}xSemaphoreGive(PrBinarySemHandle);printf(High Task Give Sem\n);osDelay(500);
结果 二。互斥信号量概念及其应用《解决上述出现的问题优先级反转问题》
互斥信号量定义
FreeRTOS互斥信号量介绍
FreeRTOS互斥信号量工作原理
1.互斥信号量的定义 短暂提升低优先级的优先级让他优先完成。 任务都有一个互斥锁 2.FreeRTOS互斥信号量介绍 Mutex包括Mutex与RecursiveMutex递归信号量解决普通信号量的死锁问题 3.FreeRTOS互斥信号量工作原理 短暂提升低优先级的优先级让他优先完成。
3.递归互斥信号量解决死锁问题 多次使用foo函数会导致死锁信号量重复使用任务把自己挂起。 解决方法递归互斥信号量 三。实验互斥信号量函数应用
1.功能需求 1、修改优先级翻转实验优化代码 2、使用互斥信号量解决优先级翻转问题 2.API
1xSemaphoreCreateMutex()创建互斥信号量 2xSemaphoreGetMutexHolder()获取当前信号量任务句柄 3.cubemx创建工程
1使能互斥信号量 2创建互斥信号量 3.步骤 把优先级反转的二值信号量改为互斥信号量就可以解决优先级反转的问题 替代地方 1低优先级信号量使用与释放处 2高优先级信号量使用与释放处 1低优先级二值信号量句柄的使用与释放修改为互斥信号量的使用与释放。 修改为 2高优先级一样
结果大量时间用来运行高优先级的任务正确。 四。实验递归互斥信号量函数应用
1.死锁现象 上述的互斥信号量如果在同一个任务的主函数中运行两次互斥信号量的使用会导致任务把自身挂起即死锁。 为了解决死锁的问题使用递归互斥信号量。 2.API
1xSemaphoreCreateRecursiveMutex() 2 xSemaphoreTakeRecursive() 3xSemaphoreGiveRecursive() 3.实验验证
需求 1、模拟死锁现象 2、使用递归互斥信号量解决死锁问题 4.cubemx创建工程
1递归互斥信号量的使能 2创建递归互斥信号量 5.步骤 1.使用上述的API接口创建与释放的递归信号量接口FREERTOS的参考手册有详细讲解函数的使用不过是英文 2.使用自己创建的递归信号量 1创建出来的递归互斥信号量 2高优先级如果直接使用互斥信号量这样使用两次会导致死锁使用递归互斥信号量就会解决此类问题。 //递归互斥信号量改为自己设置的信号量printf(High Task Take sem1\n);if(xSemaphoreTakeRecursive(myRecursiveMutexHandle,portMAX_DELAY)pdPASS){printf(High Task is running1\n);}printf(High Task Take sem2\n);if(xSemaphoreTakeRecursive(myRecursiveMutexHandle,portMAX_DELAY)pdPASS){printf(High Task is running2\n);}xSemaphoreGiveRecursive(myRecursiveMutexHandle);printf(High Task Give Sem1\n);xSemaphoreGiveRecursive(myRecursiveMutexHandle);printf(High Task Give Sem2\n);osDelay(500); 3低优先级注意使用与高优先级一样的信号量 结果高优先级占用CPU比率大正确 五。互斥信号量实现原理