当前位置: 首页 > wzjs >正文

网站内链工作做足好的seo公司营销网

网站内链工作做足,好的seo公司营销网,电子商务营销手段,做微信的微网站费用多少合适目录 一、互斥量的工作原理 1、优先级继承 2、互斥量相关函数详解 (1)创建互斥量 (2)获取和释放互斥量 二、互斥量使用示例 1、示例功能和CubeMX项目设置 (1)RCC、SYS、Code Generator、USART3、TI…

目录

一、互斥量的工作原理

1、优先级继承

2、互斥量相关函数详解

(1)创建互斥量

(2)获取和释放互斥量

二、互斥量使用示例

1、示例功能和CubeMX项目设置

(1)RCC、SYS、Code Generator、USART3、TIM6、NVIC

(2)RTOS

2、程序功能实现

(1)主程序

(2)FreeRTOS对象初始化

(3)3个任务的功能实现

3、运行与测试


        使用信号量进行互斥型资源访问控制时,容易出现优先级翻转(priority inversion)现象。其现象展示可以参考本文作者的其他文章:

        参考文章:细说STM32单片机FreeRTOS优先级翻转及其展示实例-CSDN博客  https://wenchm.blog.csdn.net/article/details/147580660?spm=1011.2415.3001.5331

        互斥量是对信号量的一种改进,增加了优先级继承机制,虽不能完全消除优先级翻转问题,但是可以缓减该问题

一、互斥量的工作原理

1、优先级继承

        事实上,并不希望在TaskHP等待TaskLP释放信号量的过程中,被一个比TaskHP优先级低的任务抢占了CPU的使用权。也就是说,不希望在参考文章图中t4时就出现TaskMP抢占CPU使用权的情况。 

        为此,FreeRTOS在二值信号量的功能基础上引入了优先级继承(priority inheritance)机制,这就是互斥量。使用了互斥量后,3个任务运行过程变为上图所示的时序图。

 

  • 在t1时刻,低优先级任务TaskLP处于运行状态,并且获取了一个互斥量mutex。
  • 在t2时刻,高优先级任务TaskHP进入运行状态,它申请互斥量mutex,但是互斥量被任务TaskLP占用,所以,TaskHP在t3时刻进入阻塞等待状态,TaskLP进入运行状态。但是在t3时刻,FreeRTOS将TaskLP的优先级临时提高到与TaskHP相同的级别,这就是优先级继承。
  • 在t4时刻,中等优先级任务TaskMP进入就绪状态,发生任务调度,但是因为TaskLP的临时优先级高于TaskMP,所以TaskMP无法获得CPU的使用权,只能继续处于就绪状态。
  • 在t5时刻,任务TaskLP释放互斥量,任务TaskHP立刻抢占CPU的使用权,并恢复TaskLP原来的优先级。
  • 在t6时刻,TaskHP进入阻塞状态后,TaskMP才进入运行状态。

        互斥量引入了优先级继承机制,临时提升了占用互斥量的长优先级任务TaskLP的优先级,与申请互斥量的高优先级任务TaskHP的优先级相同,这样就避免了被中间优先级的任务TaskMP抢占CPU的使用权,保证了高优先级任务运行的实时性。斥量特别适用于互斥型资源访问控制

        使用互斥量可以减缓优先级翻转的影响,但是不能完全消除优先级翻转的问题。例如,在上图中,若TaskMP在t2时刻之前抢占了CPU,在TaskMP运行期间TaskHP可以抢占CPU,但是因为要等待TaskLP释放占用的互斥量,还是要进入阻塞状态等待,还是会让TaskMP占用CPU运行。

2、互斥量相关函数详解

(1)创建互斥量

        函数xSemaphoreCreateMutex()以动态分配内存方式创建互斥量,xSemaphoreCreateMutexStatic()以静态分配内存方式创建互斥量。其中,函数xSemaphoreCreateMutex()的原型定义如下:

* \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex
* \ingroup Semaphores
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
#define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX )
#endif

        它调用了文件queue.c中的函数xQueueCreateMutex(),这个函数的原型定义如下:

#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType )
{QueueHandle_t xNewQueue;const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0;xNewQueue = xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType );prvInitialiseMutex( ( Queue_t * ) xNewQueue );return xNewQueue;
}#endif /* configUSE_MUTEXES */

        其中,参数ucQueueType表示要创建的对象类型,常量queueQUEUE_TYPE_MUTEX用于创建互斥量,常量queueQUEUE_TYPE_RECURSIVE_MUTEX用于创建递归互斥量。

        函数xSemaphoreCreateMutex(的返回数据类型是QueueHandle_t,是所创建互斥量的句柄。

(2)获取和释放互斥量

        获取互斥量使用函数xSemaphoreTake(),释放信号量使用函数xSemaphoreGive(),这两函数的用法与获取和释放二值信号量一样。

        互斥量不能在ISR中使用,因为互斥量具有针对任务的优先级继承机制,而ISR不是任务。所以,函数xSemaphoreGiveFromISR()和xSemaphoreTakeFromISR()不能应用于互斥量。

二、互斥量使用示例

1、示例功能和CubeMX项目设置

        设计一个示例演示使用互斥量时避免出现优先级翻转现象。本示例的主要功能与参考文章的示例相同,只是将其中的二值信号量换成了互斥量。

        继续使用旺宝红龙开发板STM32F407ZGT6 KIT V1.0。

(1)RCC、SYS、Code Generator、USART3、TIM6、NVIC

        与参考文章相同。

(2)RTOS

         删除FreeRTOS中原来的二值信号量token,创建一个互斥量token。其他内容的设置与参考文章相同。

        在FreeRTOS参数配置的Mutex页面,创建一个名称为token的互斥量:

2程序功能实现

(1)主程序

        在CubeMX里,生成代码,在CubeIDE里打开项目。自动生成绝大多数的代码。

        私有代码是需要手动添加的。

 

(2)FreeRTOS对象初始化

        函数MX_FREERTOS_Init()用于创建在CubeMX中设计的互斥量token和3个任务,相关代码如下:

 

        与互斥量token相关的句柄变量和属性变量的定义代码如下:

 

        osMutexId_t是在文件cmsis_os2.h中定义的类型,就是一个void指针类型。

        osMutexAttr_t是在文件cmsis_os2.h中定义的结构体类型,用于描述互斥量的属性,其定义如下:

        在使用动态分配内存方式创建互斥量时,只需设置互斥量名称即可,控制块由FreeRTOS自动创建和分配内存。

        在函数MX_FREERTOS_Init()中使用函数osMutexNew()创建互斥量,这是在sis_os2.h中定义的CMSIS-RTOS标准接口函数。根据传递的互斥量属性,osMutexNew()自动判别是创建互斥量,还是创建递归互斥量。在创建互斥量时,函数会根据属性设置,自动调用SmaphoreCreateMutex()以动态分配内存方式创建互斥量,或调用xSemaphoreCreateMutexStatic()以静态分配内存方式创建互斥量。

(3)3个任务的功能实现

        在这个示例中,由于使用了互斥量,在高优先级任务Task_High试图获取互斥量时,如果互斥量被Task_Low占用着,FreeRTOS会将Task_Low的优先级临时提高到Task_High的优先级。这样,在Task_Low占用互斥量运行期间,Task_Middle就无法抢占CPU运行,在Task_Low释放互斥量后,Task_High就能抢占CPU立刻运行。所以,使用互斥量,就避免了高优先级任务被中等优先级任务插队运行的情况。

3、运行与测试

        互斥量并不能在所有情况下彻底解决优先级翻转问题,但是至少可以减缓优先级翻转问题的出现。另外,因为互斥量使用了优先级继承机制,所以不能在ISR中使用互斥量。

http://www.dtcms.com/wzjs/340879.html

相关文章:

  • 国办政府网站建设杭州网站建设书生商友
  • 丹灶网站建设常见的网络推广方式包括
  • 设计品牌网站免费软文网站
  • wordpress frbr济南seo优化
  • 做网站都需要什么步骤如何建立自己的网站
  • 怎样做商城手机网站企业网站推广注意事项
  • 做网站_你的出路在哪里无锡百度竞价推广
  • 特色的佛山网站建设全网营销课程
  • 上传文档到网站上怎么做品牌推广策略与方式
  • 如何将软件上传到公开网站广告投放平台排名
  • 中国建设银行官网首页 网站爱网站
  • 美观网站建设物美价廉市场调研怎么做
  • 网站开发设计招聘泉州百度开户
  • 网站建设的关键seo是什么的
  • 做百度推广一定要有网站吗关键词挖掘长尾词
  • 汕头百度公司郑州搜索引擎优化公司
  • 做网站至少要花多少钱东莞网络营销推广公司
  • 集团门户网站建设费用科目培训机构哪家最好
  • 做网站的会淘宝美工么aso搜索排名优化
  • 昆明做网站建设公司优化措施最新回应
  • 温州手机网站建设优化seo公司哪家好
  • 网站建设和维护采购协议出词
  • 中国建设银行网站会员登录百度网盘电脑版官网
  • 毕业季网站如何做网页临沂今日头条新闻最新
  • 江苏省建设工程网站磁力引擎
  • 手机网页怎么做出来的天津seo博客
  • 网站建设模块方案徐州百度搜索网站排名
  • 做网站推广的销售发的朋友圈杭州网站seo外包
  • 重庆电子商务网站seoseo快速排名软件推荐
  • 电子相册在线制作网站360浏览器网页版入口