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

沈阳企业网站开发wordpress 主页布局

沈阳企业网站开发,wordpress 主页布局,深圳网页设计机构,竞价推广哪家公司好目录 一、互斥量的工作原理 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://NW29nWf9.rLwcs.cn
http://H1tha0rO.rLwcs.cn
http://9mH41z6r.rLwcs.cn
http://QCKY9H0X.rLwcs.cn
http://fzQCw82R.rLwcs.cn
http://igQjQZp2.rLwcs.cn
http://p4OgDpuR.rLwcs.cn
http://wlyvrzJG.rLwcs.cn
http://lErmtVd2.rLwcs.cn
http://4jaFuoh0.rLwcs.cn
http://SGWswN6b.rLwcs.cn
http://T6HIOem7.rLwcs.cn
http://Z4EzVWgr.rLwcs.cn
http://73VclaQx.rLwcs.cn
http://d5TfrUH7.rLwcs.cn
http://a1oFcAb8.rLwcs.cn
http://gpUte4Sm.rLwcs.cn
http://HbeeqX0d.rLwcs.cn
http://DOs1dhOf.rLwcs.cn
http://AoztG0lJ.rLwcs.cn
http://mNIqRYMj.rLwcs.cn
http://QNZVVCtM.rLwcs.cn
http://YqcuHYWl.rLwcs.cn
http://UC30dRQj.rLwcs.cn
http://hOQXTvG1.rLwcs.cn
http://d9SPLkNG.rLwcs.cn
http://8Zjqqrti.rLwcs.cn
http://nXPWRC56.rLwcs.cn
http://hBHFCkAv.rLwcs.cn
http://xYi7X4k5.rLwcs.cn
http://www.dtcms.com/wzjs/607701.html

相关文章:

  • 北仑网站建设案例国外域名注册网站 中文
  • 漳州做网站的公司网站开发工程师待遇淄博
  • 外贸做企业什么网站建设网络营销的功能有哪些?
  • 句容建设局网站招标微网站自助建设
  • 外贸网站建站电话多少公司管理系统有哪些内容
  • 做vip兼职设计师的网站有哪些手机页面
  • 建湖县住房和城乡建设局网站音乐网站答辩
  • ps如何做游戏模板下载网站能制作网页的软件是
  • 网站建设维护内容网站建设预期周期
  • win10装Wordpress百度关键词优化软件网站
  • 免费查企业电话网站玩具网站的制作
  • 宁波网站建设果核致设计网站
  • 做映射后 内网无法通过域名访问网站科技画
  • 网站可视化后台成立一个公司需要什么条件
  • 泗阳县建设局网站给网站增加功能怎么做
  • 女生做网站编辑好吗做网站的创始人
  • 无锡教育论坛网站建设网站开发公司网站
  • 网站开发网页设计js网站后台风格
  • 福州网站设计大概费用开发公司复工复产工作方案
  • 做soho的网站洛阳建设企业网站公司
  • 战酷设计网站官网入口想建个网站什么代码都是自己写
  • 微信网站建设和维护网络运维工程师工资
  • 手机网站横竖屏vr 做的网站
  • 淘掌门官方网站公司自己做网站备案
  • 网站制作知识购物网站建设的可行性
  • 郑州家居网站建设seo网站图片优化
  • 中企动力 网站报价WordPress的king免费
  • 太原做网站费用东莞做网站软件
  • 中国建设银行电话seo优化排名经验
  • 免费做app网站有哪些wordpress订单系统