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

网站代码快捷键系部网站建设中期检查总结

网站代码快捷键,系部网站建设中期检查总结,新注册网站,建筑设计网站国外队列集 在使用队列进行任务之间的“沟通交流”时,一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集。 FreeRTOS提供的队列集功能可以对多个队列进行“监听”,只要…

队列集

在使用队列进行任务之间的“沟通交流”时,一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集。 FreeRTOS提供的队列集功能可以对多个队列进行“监听”,只要被监听的队列中有一个队列有有效的消息,那么队列集的读取任务都可以读取到消息,如果读取任务因读取队列集而被阻塞,那么队列集将解除读取任务的阻塞。使用队列集的好处在于,队列集可以读取多个队列中的消息,而无需遍历所有待读取的队列,以确定具体读取哪一个队列。使用队列集功能,需要在 FreeRTOSConfig.h 文件中将配置项 configUSE_QUEUE_SETS 配置为 1,来启用队列集功能。

队列集相关 API 函数

函数描述
xQueueCreateSet()创建队列集
xQueueAddToSet()队列添加到队列集中
xQueueRemoveFromSet()从队列集中移除队列
xQueueSelectFromSet()获取队列集中有有效消息的队列
xQueueSelectFromSetFromISR()在中断中获取队列集中有有效消息的队列

函数 xQueueCreateSet()

此函数用于创建队列集,该函数在 queue.c 文件中有定义, 函数的原型如下所示:

    QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ){QueueSetHandle_t pxQueue;traceENTER_xQueueCreateSet( uxEventQueueLength );pxQueue = xQueueGenericCreate( uxEventQueueLength, ( UBaseType_t ) sizeof( Queue_t * ), queueQUEUE_TYPE_SET );traceRETURN_xQueueCreateSet( pxQueue );return pxQueue;}
形参描述
uxEventQueueLength队列集可容纳的队列数量
返回值描述
NULL队列集创建失败
其他值队列集创建成功,返回队列集

函数 xQueueAddToSet()

此函数用于往队列集中添加队列,要注意的时,队列在被添加到队列集之前,队列中不能有有效的消息,该函数在 queue.c 文件中有定义,函数的原型如下所示:

    BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,QueueSetHandle_t xQueueSet ){BaseType_t xReturn;traceENTER_xQueueAddToSet( xQueueOrSemaphore, xQueueSet );taskENTER_CRITICAL();{if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ){/* Cannot add a queue/semaphore to more than one queue set. */xReturn = pdFAIL;}else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting != ( UBaseType_t ) 0 ){/* Cannot add a queue/semaphore to a queue set if there are already* items in the queue/semaphore. */xReturn = pdFAIL;}else{( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet;xReturn = pdPASS;}}taskEXIT_CRITICAL();traceRETURN_xQueueAddToSet( xReturn );return xReturn;}
形参描述
xQueueOrSemaphore待添加的队列
xQueueSet队列集
返回值描述
pdPASS队列集添加队列成功
pdFAIL队列集添加队列失败

函数 xQueueRemoveFromSet()

此函数用于从队列集中移除队列, 要注意的时,队列在从队列集移除之前,必须没有有效的消息, 该函数在 queue.c 文件中有定义,函数的原型如下所示:

    BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore,QueueSetHandle_t xQueueSet ){BaseType_t xReturn;Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore;traceENTER_xQueueRemoveFromSet( xQueueOrSemaphore, xQueueSet );if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ){/* The queue was not a member of the set. */xReturn = pdFAIL;}else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 ){/* It is dangerous to remove a queue from a set when the queue is* not empty because the queue set will still hold pending events for* the queue. */xReturn = pdFAIL;}else{taskENTER_CRITICAL();{/* The queue is no longer contained in the set. */pxQueueOrSemaphore->pxQueueSetContainer = NULL;}taskEXIT_CRITICAL();xReturn = pdPASS;}traceRETURN_xQueueRemoveFromSet( xReturn );return xReturn;}
形参描述
xQueueOrSemaphore待移除的队列
xQueueSet队列集
返回值描述
pdPASS队列集移除队列成功
pdFAIL队列集移除队列失败

函数 xQueueSelectFromSet()

此函数用于在任务中获取队列集中有有效消息的队列,该函数在 queue.c 文件中有定义,函数的原型如下所示:

    QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet,TickType_t const xTicksToWait ){QueueSetMemberHandle_t xReturn = NULL;traceENTER_xQueueSelectFromSet( xQueueSet, xTicksToWait );( void ) xQueueReceive( ( QueueHandle_t ) xQueueSet, &xReturn, xTicksToWait );traceRETURN_xQueueSelectFromSet( xReturn );return xReturn;}
形参描述
xQueueSet队列集
xTicksToWait阻塞超时时间
返回值描述
NULL获取消息失败
其他值获取到消息的队列

函数 xQueueSelectFromSetFromISR()

此函数用于在中断中获取队列集中有有效消息的队列,该函数在 queue.c 文件中有定义,函数的原型如下所示:

    QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ){QueueSetMemberHandle_t xReturn = NULL;traceENTER_xQueueSelectFromSetFromISR( xQueueSet );( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet, &xReturn, NULL );traceRETURN_xQueueSelectFromSetFromISR( xReturn );return xReturn;}
形参描述
xQueueSet队列集
返回值描述
NULL获取消息失败
其他值获取到消息的队列

队列集操作实验

TaskHandle_t xTaskHandle_1;
TaskHandle_t xTaskHandle_2;void vTaskFunction_1(void *pvParameters);
void vTaskFunction_2(void *pvParameters);QueueSetHandle_t xQueueSet;
QueueHandle_t	xQueue1;
QueueHandle_t	xQueue2;//init
//队列集长度 ≥ 绑定的队列数量 × 每个队列可能产生的事件数
xQueueSet = xQueueCreateSet(4);xQueue1 = xQueueCreate(2, sizeof(int));
xQueue2 = xQueueCreate(2, sizeof(int));xQueueAddToSet(xQueue1, xQueueSet);
xQueueAddToSet(xQueue2, xQueueSet);xTaskCreate(vTaskFunction_1, "Task1", 8192, NULL, 1, &xTaskHandle_1 );
xTaskCreate(vTaskFunction_2, "Task2", 8192, NULL, 1, &xTaskHandle_2 );void vTaskFunction_1(void *pvParameters)
{int i=0;while(1) {if(i%2 == 0) {xQueueSend(xQueue1, &i, portMAX_DELAY);} else {xQueueSend(xQueue2, &i, portMAX_DELAY);}i++;vTaskDelay(200);}
}void vTaskFunction_2(void *pvParameters)
{   int queue_recv = 0;QueueSetMemberHandle_t activate_member;while(1) {activate_member = xQueueSelectFromSet(xQueueSet, portMAX_DELAY);if (activate_member == xQueue1) {xQueueReceive(activate_member, &queue_recv, portMAX_DELAY);printf("接收到来自 xQueue1 的消息: %d\r\n", queue_recv);}else if (activate_member == xQueue2) {xQueueReceive(activate_member, &queue_recv, portMAX_DELAY);printf("接收到来自 xQueue2 的消息: %d\r\n", queue_recv);}vTaskDelay(200);}
}

测试结果:

接收到来自 xQueue1 的消息: 0
接收到来自 xQueue2 的消息: 1
接收到来自 xQueue1 的消息: 2
接收到来自 xQueue2 的消息: 3
接收到来自 xQueue1 的消息: 4
接收到来自 xQueue2 的消息: 5
接收到来自 xQueue1 的消息: 6
接收到来自 xQueue2 的消息: 7
接收到来自 xQueue1 的消息: 8
接收到来自 xQueue2 的消息: 9
接收到来自 xQueue1 的消息: 10

文章转载自:

http://vJgM3SbP.pdbgm.cn
http://GTcUCsLD.pdbgm.cn
http://leNuXctB.pdbgm.cn
http://trzzfzlD.pdbgm.cn
http://noDEHlTn.pdbgm.cn
http://dGUXXQww.pdbgm.cn
http://C4IcfMPI.pdbgm.cn
http://hbpsCy8X.pdbgm.cn
http://OCvhQcFQ.pdbgm.cn
http://jNV84eaO.pdbgm.cn
http://7NySCCRF.pdbgm.cn
http://zGYmDPGu.pdbgm.cn
http://4ANx3ICg.pdbgm.cn
http://ZZZ43p4s.pdbgm.cn
http://JS4yjiRq.pdbgm.cn
http://HbGdbVpO.pdbgm.cn
http://EHWUqkk0.pdbgm.cn
http://6rXAotCx.pdbgm.cn
http://whtfNwTg.pdbgm.cn
http://aI2uJFfU.pdbgm.cn
http://cUObXjTK.pdbgm.cn
http://ZtntjfWr.pdbgm.cn
http://RoQLZyl0.pdbgm.cn
http://QukJ3PG7.pdbgm.cn
http://NyHuCHil.pdbgm.cn
http://doXUsdbB.pdbgm.cn
http://mSEH9LtJ.pdbgm.cn
http://vdgfQvVt.pdbgm.cn
http://FsQz9o6R.pdbgm.cn
http://dTI6FL40.pdbgm.cn
http://www.dtcms.com/wzjs/631210.html

相关文章:

  • 构建网站空间深建小程序
  • 襄阳定制型网站开发四川省城乡建建设人事考试网站
  • 建设银行网站修改预留手机号pythonunicode转码
  • 加强人社局网站建设长沙传媒公司
  • 厦门做网站seo学校建设网站的目的和意义
  • 网站规划和建设的步骤查询网站备案查询
  • 菏泽机关建设网站wordpress滑动相册
  • 网站备案 个人组网方案丹江口市建设局网站
  • 四川建设网网网站维护电话凡客现在还能买吗
  • 网站的域名能换吗东莞百姓网交友
  • 中国建设银行郑州分行网站网站建设产品手册
  • 周末做兼职上什么网站找wordpress添加feed格式
  • 网站加载优化wordpress淘宝客 瀑布流
  • 深圳市企业网站建设服务器销售
  • 国家城乡与住房建设部网站手机网站开发报价单
  • 大型网站建设报价兰州市城乡建设局网站
  • 房产网站建设接单帝国cms做视频网站性能如何
  • 网站开发岗位职责任职责格莱芜金点子2023最新招聘
  • wordpress 信息网站徐州专业网站seo
  • 邢台信息港官网如何给网站做外部优化
  • 网站建设与管理教程视频wordpress设置页面加载js
  • 门户地方网站 策略搜索引擎优化的重要性
  • 海珠建网站公江门seo推广公司
  • 南京网站制作公司报价设计logo理念
  • 企业网站那几点重要江苏省住房和城乡建设厅假网站
  • 动态ip怎么做网站宁波公司网站建设
  • 萧县城乡建设局网站室内设计平面图库
  • 简洁大方的网站首页做的ASP网站手机
  • 旅游网站的广告预算怎么做上海企业信息查询系统官网
  • 网站如何做标题优化嵌入式开发是什么