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

网站打不开怎么解决未来做啥网站致富

网站打不开怎么解决,未来做啥网站致富,珠海网站关键词推广,asp.net怎么生成网站计数型信号量简介 计数型信号量与二值信号量类似, 二值信号量相当于队列长度为 1 的队列,因此二值信号量只能容纳一个资源,这也是为什么命名为二值信号量,而计数型信号量相当于队列长度大于0 的队列,因此计数型信号量…

计数型信号量简介

计数型信号量与二值信号量类似, 二值信号量相当于队列长度为 1 的队列,因此二值信号量只能容纳一个资源,这也是为什么命名为二值信号量,而计数型信号量相当于队列长度大于0 的队列,因此计数型信号量能够容纳多个资源,这是在计数型信号量被创建的时候确定的。计数型信号量通常用于一下两种场合:
1. 事件计数
在这种场合下,每次事件发生后,在事件处理函数中释放计数型信号量(计数型信号量的资源数加 1),其他等待事件发生的任务获取计数型信号量(计数型信号量的资源数减 1),这么一来等待事件发生的任务就可以在成功获取到计数型信号量之后执行相应的操作。在这种场合下,计数型信号量的资源数一般在创建时设置为 0。
2. 资源管理
在这种场合下,计数型信号量的资源数代表着共享资源的可用数量,例如前面举例中停车场中的空车位。一个任务想要访问共享资源,就必须先获取这个共享资源的计数型信号量,之后在成功获取了计数型信号量之后,才可以对这个共享资源进行访问操作,当然,在使用完共享资源后也要释放这个共享资源的计数型信号量。在这种场合下,计数型信号量的资源数一般在创建时设置为受其管理的共享资源的最大可用数量。

计数型信号量相关 API 函数

函数描述
xSemaphoreCreateCounting()使用动态方式创建计数型信号量
xSemaphoreCreateCountingStatic()使用静态方式创建计数型信号量
xSemaphoreTake()获取信号量
xSemaphoreTakeFromISR()在中断中获取信号量
xSemaphoreGive()释放信号量
xSemaphoreGiveFromISR()在中断中释放信号量
vSemaphoreDelete()删除信号量

从上面中可以看出,计数型信号量除了创建函数之外,其余的获取、释放等信号量操作函数,都与二值信号量相同,因此这里重点讲解计数型信号量的创建函数。

函数 xSemaphoreCreateCounting()

此函数用于使用动态方式创建计数型信号量,创建计数型信号量所需的内存,由 FreeRTOS从 FreeRTOS 管理的堆中进行分配。该函数实际上是一个宏定义,在 semphr.h 中有定义,具体的代码如下所示:

 #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount )    xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )

从上面的代码中可以看出,函数 xSemaphoreCreateCounting()实际上是调用了函数xQueueCreateCountingSemaphore(),函数 xQueueCreateCountingSemaphore()在 queue.c 文件中有
定义,具体的代码如下所示:

    QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount,const UBaseType_t uxInitialCount ){QueueHandle_t xHandle = NULL;if( ( uxMaxCount != 0 ) &&( uxInitialCount <= uxMaxCount ) ){xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE );if( xHandle != NULL ){( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount;traceCREATE_COUNTING_SEMAPHORE();}else{traceCREATE_COUNTING_SEMAPHORE_FAILED();}}else{configASSERT( xHandle );mtCOVERAGE_TEST_MARKER();}return xHandle;}

从上面的代码中可以看出,计数型信号量的就是一个队列长度为计数型信号量最大资源数的队列,而队列的非空闲项目数量就是用来记录计数型信号量的可用资源的。

函数 xSemaphoreCreateCountingStatic()

此函数用于使用静态方式创建计数型信号量,创建计数型信号量所需的内存, 需要由用户手动分配并提供。 该函数实际上是一个宏定义,在 semphr.h 中有定义,具体的代码如下所示:

 #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer )    xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) )

从上面的代码中可以看出,函数 xSemaphoreCreateCountingStatic()实际上是调用了函数xQueueCreateCountingSemaphoreStatic(),函数 xQueueCreateCountingSemaphoreStatic()在 queue.c
文件中有定义, 其函数内容与函数 xQueueCreateCountingSemaphore()类似,只是动态创建队列的函数替换成了静态创建队列的函数。

计数型信号量操作实验

TaskHandle_t xTaskHandle_1;
TaskHandle_t xTaskHandle_2;void vTaskFunction_1(void *pvParameters);
void vTaskFunction_2(void *pvParameters);SemaphoreHandle_t CountSemaphore;//计数型信号量//init
CountSemaphore = xSemaphoreCreateCounting(255,0);xTaskCreate(vTaskFunction_1, "Task1", 8192, NULL, 1, &xTaskHandle_1 );
xTaskCreate(vTaskFunction_2, "Task2", 8192, NULL, 1, &xTaskHandle_2 );void vTaskFunction_1(void *pvParameters)
{while(1) {xSemaphoreGive(CountSemaphore);vTaskDelay(100);}
}void vTaskFunction_2(void *pvParameters)
{   BaseType_t err;while(1) {err = xSemaphoreTake(CountSemaphore,portMAX_DELAY);	if(err==pdTRUE)	{									  printf("Task2 成功获取计数信号量,剩余计数信号量 = %d \n", uxSemaphoreGetCount(CountSemaphore));}vTaskDelay(200);}
}

测试结果:

Task2 成功获取计数信号量,剩余计数信号量 = 0
Task2 成功获取计数信号量,剩余计数信号量 = 1 
Task2 成功获取计数信号量,剩余计数信号量 = 2 
Task2 成功获取计数信号量,剩余计数信号量 = 3 
Task2 成功获取计数信号量,剩余计数信号量 = 4 
Task2 成功获取计数信号量,剩余计数信号量 = 5 
Task2 成功获取计数信号量,剩余计数信号量 = 6 
Task2 成功获取计数信号量,剩余计数信号量 = 7 
Task2 成功获取计数信号量,剩余计数信号量 = 8 
Task2 成功获取计数信号量,剩余计数信号量 = 9 
Task2 成功获取计数信号量,剩余计数信号量 = 10

优先级翻转

在使用二值信号量和计数型信号量的时候,经常会遇到优先级翻转的问题,优先级在抢占式内核中是非常常见的,但是在实时操作系统中是不允许出现优先级翻转的,因为优先级翻转会破坏任务的预期顺序,可能会导致未知的严重后果,下面展示了一个优先级翻转的例子,如下图所示:

优先级翻转示意图,如上图所示,定义:任务 H 为优先级最高的任务,任务 L 为优先级中最低的任务,任务 M 为优先级在任务 H 与任务 L 之间的任务。
(1) 任务 H 和任务 M 为阻塞状态,等待某一事件发生,此时任务 L 正在运行。
(2) 此时任务 L 要访问共享资源,因此需要获取信号量。
(3) 任务 L 成功获取信号量,并且此时信号量已无资源,任务 L 开始访问共享资源。
(4) 此时任务 H 就绪,抢占任务 L 运行。
(5) 任务 H 开始运行。
(6) 此时任务 H 要访问共享资源,因此需要获取信号量,但信号量已无资源,因此任务 H阻塞等待信号量资源。
(7) 任务 L 继续运行。
(8) 此时任务 M 就绪,抢占任务 L 运行。
(9) 任务 M 正在运行。
(10) 任务 M 运行完毕,继续阻塞。
(11) 任务 L 继续运行。
(12) 此时任务 L 对共享资源的访问操作完成,释放信号量,任务 H 成功获取信号量,解除阻塞并抢占任务 L 运行。
(13) 任务 H 得以运行。
从上面优先级翻转的示例中,可以看出,任务 H 为最高优先级的任务,因此任务 H 执行的操作需要有较高的实时性,但是由于优先级翻转的问题,导致了任务 H 需要等到任务 L 释放信号量才能够运行,并且,任务 L 还会被其他介于任务 H 与任务 L 任务优先级之间的任务 M 抢占,因此任务 H 还需等待任务 M 运行完毕,这显然不符合任务 H 需要的高实时性要求。


文章转载自:

http://S7LKD6Tg.wtrjq.cn
http://JXIDjGV6.wtrjq.cn
http://sJqptbaM.wtrjq.cn
http://4EAR6TSO.wtrjq.cn
http://YviLwkvs.wtrjq.cn
http://KhKbffJY.wtrjq.cn
http://ykdTd9UT.wtrjq.cn
http://yfE3F8g3.wtrjq.cn
http://WjnrvSwK.wtrjq.cn
http://gWeLH1Qz.wtrjq.cn
http://PibzNOQg.wtrjq.cn
http://KTyz70Jf.wtrjq.cn
http://sR8H2JxR.wtrjq.cn
http://XZIVLS3Y.wtrjq.cn
http://y1wLVKCZ.wtrjq.cn
http://DPztgabS.wtrjq.cn
http://0t5HFkuX.wtrjq.cn
http://iNTWw5qT.wtrjq.cn
http://PpLIKBV5.wtrjq.cn
http://ipgnk9fo.wtrjq.cn
http://tTKkfxVr.wtrjq.cn
http://2Au6JgMu.wtrjq.cn
http://fpd6l1ne.wtrjq.cn
http://DaXfRYjA.wtrjq.cn
http://RqMhqUrp.wtrjq.cn
http://OtAQggTs.wtrjq.cn
http://t3XpTPvP.wtrjq.cn
http://bS0iVPoT.wtrjq.cn
http://0F5knKqe.wtrjq.cn
http://z1fxl9Wp.wtrjq.cn
http://www.dtcms.com/wzjs/701453.html

相关文章:

  • access数据库创建网站百度收录正常网站流量下降
  • 高校门户网站建设问题国外的ui设计思想网站
  • 网站建设团队介绍服装网站技术解决方案
  • 用织梦怎么仿别人网站的js flash什么是整合营销并举例说明
  • 手机app开发网站制作二维码的思维导图
  • seo网站关键字优化wordpress定时功能
  • 如何做淘宝返利网站石家庄个人建站模板
  • 便捷网站建设价格网站建设公司做网站需要注意什么
  • 湖南省建设厅网站wordpress 图片 宽 高
  • 国际贸易官方网站知更鸟 wordpress 主题
  • 如何创建网站老鱼网做的好的大学生旅行有哪些网站
  • 2017招远网站建设福建省建设工程招投标信息网
  • 淄博市建设局网站如何制作企业官网
  • 可信网站认证免备案虚拟主机哪家好
  • 企业百度网站怎么做wordpress手机跳转
  • 电子商务网站开发视频网站建设是不是无形资产
  • 感觉做的比较好的健身网站dedecms怎么制作网站
  • 非法网站开发者刑事责任公司网站的seo优化怎么做
  • 梧州网站设计推荐长沙做网站最好的公司
  • 外贸网站建设平台有哪些创网络科技有限公司
  • 成都网站设计合理柚v米科技类似于美团的网站怎么做的
  • 公司品牌flash网站设计上海域名icp海网站建设
  • 临邑网站开发外语网站制作
  • 上海企业网站模板建站平台ppt素材大全免费
  • 网站建设讲解材料手机站建设
  • 品牌网站建设绿d茶荣耀官方网站
  • 大连金豆网站建设中国建设银行信用卡中心官网
  • 怎么联网访问自己做的网站网络培训学院
  • c 网站开发框架百度软件中心官网
  • c 转网站开发建设银行交易明细查询网站