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

做抽奖网站违法吗外贸网站建设设计方案

做抽奖网站违法吗,外贸网站建设设计方案,响水做网站哪家好,简洁文章类网站1.简介 在使用队列进行任务之间的“沟通交流”时,一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集。FreeRTOS提供的队列集功能可以对多个队列进行“监听”,只要…

1.简介

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

使用队列集功能,需要在 FreeRTOSConfig.h 文件中将配置项 configUSE_QUEUE_SETS 配
置为 1,来启用队列集功能。
在这里插入图片描述

2.相关API函数

在这里插入图片描述

1. 函数 xQueueCreateSet()

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

QueueSetHandle_t xQueueCreateSet(const UBaseType_t uxEventQueueLength);

在这里插入图片描述

QueueSetHandle_t xQueueCreateSet(const UBaseType_t uxEventQueueLength)
{QueueSetHandle_t pxQueue;/* 创建一个队列作为队列集* 队列长度为队列集可容纳的队列数量* 队列项目的大小为队列控制块的大小* 队列的类型为队列集*/pxQueue = xQueueGenericCreate( uxEventQueueLength,( UBaseType_t ) sizeof( Queue_t * ),queueQUEUE_TYPE_SET );return pxQueue;
}

2. 函数 xQueueAddToSet()

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

BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,QueueSetHandle_t xQueueSet);

在这里插入图片描述
函数 xQueueAddToSet()的具体代码如下所示:

BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,
QueueSetHandle_t xQueueSet)
{BaseType_t xReturn;/* 进入临界区 */taskENTER_CRITICAL();{if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ){xReturn = pdFAIL;}/* 队列中要求没有有效消息 */else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting !=( UBaseType_t ) 0 ){xReturn = pdFAIL;}else{/* 将队列所在队列集设为队列集 */( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer =xQueueSet;xReturn = pdPASS;}}/* 退出临界区 */taskEXIT_CRITICAL();return xReturn;
}

3. 函数 xQueueRemoveFromSet()

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

BaseType_t xQueueRemoveFromSet(QueueSetMemberHandle_t xQueueOrSemaphore,QueueSetHandle_t xQueueSet);

在这里插入图片描述
在这里插入图片描述
函数 xQueueRemoveFromSet()的具体代码如下所示:

BaseType_t xQueueRemoveFromSet(QueueSetMemberHandle_t xQueueOrSemaphore,QueueSetHandle_t xQueueSet)
{BaseType_t xReturn;Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore;/* 队列需在队列集中,才能移除 */if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ){xReturn = pdFAIL;}/* 队列中没有有效消息时,才能移除 */else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 ){xReturn = pdFAIL;}else{/* 进入临界区 */taskENTER_CRITICAL();{/* 将队列所在队列集设为空 */pxQueueOrSemaphore->pxQueueSetContainer = NULL;}/* 退出临界区 */taskEXIT_CRITICAL();xReturn = pdPASS;}return xReturn;
}

4. 函数 xQueueSelectFromSet()

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

QueueSetMemberHandle_t xQueueSelectFromSet(QueueSetHandle_t xQueueSet,TickType_t const xTicksToWait);

在这里插入图片描述
在这里插入图片描述
函数 xQueueSelectFromSet()的具体代码如下所示:

QueueSetMemberHandle_t xQueueSelectFromSet(QueueSetHandle_t xQueueSet,TickType_t const xTicksToWait)
{QueueSetMemberHandle_t xReturn = NULL;/* 读取队列集的消息* 读取到的消息,* 即为队列集中有空闲消息的队列*/( void ) xQueueReceive( ( QueueHandle_t ) xQueueSet,&xReturn,xTicksToWait);return xReturn;
}

5. 函数 xQueueSelectFromSetFromISR()

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

QueueSetMemberHandle_t xQueueSelectFromSetFromISR(QueueSetHandle_t xQueueSet );

在这里插入图片描述

QueueSetMemberHandle_t xQueueSelectFromSetFromISR(QueueSetHandle_t xQueueSet )
{QueueSetMemberHandle_t xReturn = NULL;/* 在中断中读取队列集的消息* 读取到的消息,* 即为队列集中有空闲消息的队列*/( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet,&xReturn,NULL);return xReturn;
}

3.相关实验

在这里插入图片描述

#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
#include "./MALLOC/malloc.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );/* TASK1 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t    task1_handler;
void task1( void * pvParameters );/* TASK2 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t    task2_handler;
void task2( void * pvParameters );/******************************************************************************************************/
QueueSetHandle_t queueset_handle;
QueueHandle_t    queue_handle;
QueueHandle_t    semphr_handle;
/*** @brief       FreeRTOS例程入口函数* @param       无* @retval      无*/
void freertos_demo(void)
{    xTaskCreate((TaskFunction_t         )   start_task,(char *                 )   "start_task",(configSTACK_DEPTH_TYPE )   START_TASK_STACK_SIZE,(void *                 )   NULL,(UBaseType_t            )   START_TASK_PRIO,(TaskHandle_t *         )   &start_task_handler );vTaskStartScheduler();
}void start_task( void * pvParameters )
{taskENTER_CRITICAL();                               /* 进入临界区 */queueset_handle = xQueueCreateSet( 2 );             /* 创建队列集,可以存放2个队列 */if(queueset_handle != NULL){printf("队列集创建成功!!\r\n");}queue_handle = xQueueCreate( 1, sizeof(uint8_t) );  /* 创建队列 */ semphr_handle = xSemaphoreCreateBinary();           /* 创建二值信号量 */xQueueAddToSet( queue_handle,queueset_handle);xQueueAddToSet( semphr_handle,queueset_handle);xTaskCreate((TaskFunction_t         )   task1,(char *                 )   "task1",(configSTACK_DEPTH_TYPE )   TASK1_STACK_SIZE,(void *                 )   NULL,(UBaseType_t            )   TASK1_PRIO,(TaskHandle_t *         )   &task1_handler );xTaskCreate((TaskFunction_t         )   task2,(char *                 )   "task2",(configSTACK_DEPTH_TYPE )   TASK2_STACK_SIZE,(void *                 )   NULL,(UBaseType_t            )   TASK2_PRIO,(TaskHandle_t *         )   &task2_handler );vTaskDelete(NULL);taskEXIT_CRITICAL();                /* 退出临界区 */
}/* 任务一,实现队列发送以及信号量释放 */
void task1( void * pvParameters )
{uint8_t key = 0;BaseType_t err = 0;while(1) {key = key_scan(0);if(key == KEY0_PRES){err = xQueueSend( queue_handle, &key, portMAX_DELAY );if(err == pdPASS){printf("往队列queue_handle写入数据成功!!\r\n");}}else if(key == KEY1_PRES){err = xSemaphoreGive(semphr_handle);if(err == pdPASS){printf("释放信号量成功!!\r\n");}}vTaskDelay(10);}
}/* 任务二,获取队列集的消息 */
void task2( void * pvParameters )
{QueueSetMemberHandle_t member_handle;uint8_t key;while(1){member_handle = xQueueSelectFromSet( queueset_handle,portMAX_DELAY);if(member_handle == queue_handle){xQueueReceive( member_handle,&key,portMAX_DELAY);printf("获取到的队列数据为:%d\r\n",key);}else if(member_handle == semphr_handle){xSemaphoreTake( member_handle, portMAX_DELAY );printf("获取信号量成功!!\r\n");}}
}
http://www.hrbkazy.com/news/27560.html

相关文章:

  • 荆州网站推广怎么做收录优美的图片app
  • 汽车网站开发背景广告联盟下载app
  • 界面设计分析seo营销技巧培训班
  • 徐州手机网站营销公司哪家好南宁seo排名外包
  • 新建网站怎么做关键词百度网址安全中心
  • 青岛微网站制作百度极速版app下载安装
  • 江门网站建设推广平台二级域名分发平台
  • nas可以做网站服务器百度网站大全首页
  • 专门给别人做网站关键词快速排名seo怎么优化
  • 一元秒杀网络推广方案seo网站seo
  • 外边做一个网站要多少钱搜索词排行榜
  • 美术网站建设方案百度贴吧首页
  • 网站建设有利点seo优化文章网站
  • 网站空间指的是什么百度词条优化工作
  • 腾讯云 建网站百度权重工具
  • 网站上怎么做浮标sem是什么意思?
  • 比较好的购物网站网站维护一般怎么做
  • 四川建设网有限责任公司官网乐云seo官网
  • 广州牌具做网站的公司百度词条官网入口
  • 聊城手机网站建设app制作公司
  • 临邑县建设局网站推广app赚佣金平台
  • 白酒招商网站大全下载百度网盘app
  • 亲 怎么给一个网站做备份注册网站流程和费用
  • 陕西建设厅网站人才库互联网网站
  • 在哪找做网站的google搜索
  • vps 256 wordpress产品seo标题是什么
  • 手机制作网站开发长沙网站优化方法
  • 大淘客网站logo怎么做万网域名管理入口
  • 多种成都网站建设网络推广好做吗多少钱
  • 佛山网站建设怎样做荆州seo推广