范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

FreeRTOSQueue队列及队列API函数

  前言
  队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列中,叫做队列项目。队列所能保存的最大数据项目数量叫做队列的长度,创建队列的时候会指定数据项目的大小和队列的长度。由于队列用来传递消息的,所以也称为消息队列。FreeRTOS 中的信号量的也是依据队列实现的!一、队列功能介绍
  1.数据存储
  数据发送到队列中会导致数据拷贝,也就是将要发送的数据拷贝到队列中,这就意味着在队列中存储的是数据的原始值,而不是原数据的引用(即只传递数据的指针),这个也叫做值传递。
  因为队列中存储的是原始值,任务将数据发送到队列中,就可以随意修改原始缓冲区。
  2.多任务访问
  队列不是属于某个特别指定的任务的,任何任务都可以向队列发送消息或者提取消息。
  3.出队阻塞
  当任务尝试从一个队列中读取消息的时候可以指定一个阻塞时间,这个阻塞时间就是当任务从队列中读取消息无效的时候任务阻塞的时间。
  如果阻塞时间为0就是不阻塞,没有数据的话会马上返回任务继续执行接下来的代码。
  如果阻塞时间为 0~ portMAX_DELAY,当任务没有从队列中获
  取到消息的话就进入阻塞态,阻塞时间指定了任务进入阻塞态的时间,当阻塞时间到了以后还没有接收到数据的话就退出阻塞态,返回任务接着运行下面的代码,如果在阻塞时间内接收到了数据就立即返回,执行任务中下面的代码
  当阻塞时间设置为portMAX_DELAY 的话,任务就会一直进入阻塞态等待,直到接收到数据为止!
  4.入队阻塞
  入队阻塞过程和出队阻塞相类似二、队列工作过程
  任务 A 要向任务 B 发送消息,这个消息是 x 变量的值。首先创建一个队列,并且指定队列的长度和每条消息的长度。这里我们创建了一个长度为 4 的队列,因为要传递的是x 值,而 x 是个 int 类型的变量,所以每条消息的长度就是 int 类型的长度,在 STM32 中就是 4
  字节,即每条消息是 4 个字节的。
  任务 A 的变量 x 值为 10,将这个值发送到消息队列中。此时队列剩余长度就是3 了。前面说了向队列中发送消息是采用拷贝的方式,所以一旦消息发送完成变量 x 就可以再次被使用,赋其他的值
  任务 A 又向队列发送了一个消息,即新的 x 的值,这里是 20。此时队列剩余长度为 2。
  中任务 B 从队列中读取消息,并将读取到的消息值赋值给 y,这样 y 就等于 10了。任务 B 从队列中读取消息完成以后可以选择清除掉这个消息或者不清除。当选择清除这个消息的话其他任务或中断就不能获取这个消息了,而且队列剩余大小就会加一,变成 3。如果
  不清除的话其他任务或中断也可以获取这个消息,而队列剩余大小依旧是 2。
  先发送的先读取1.API函数
  1.队列创建函数
  函数 xQueueCreate()QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength, UBaseType_t uxItemSize)
  参数:
  uxQueueLength:要创建的队列的队列长度,这里是队列的数量
  uxItemSize: 队列中每个项目(消息)的长度,单位为字节 队列创捷成功以后返回的队列句柄!
  NULL: 队列创建失败。2.入队函数
  中断级一般不使用
  1、函数 xQueueSend()、xQueueSendToBack()和 xQueueSendToFront()
  这三个函数都是用于向队列中发送消息的,这三个函数本质都是宏,其中函数 xQueueSend()和 xQueueSendToBack()是一样的,都是后向入队,即将新的消息插入到队列的后面。函数xQueueSendToToFront()是前向入队,即将新消息插入到队列的前面。然而!这三个函数最后都是调用的同一个函数:xQueueGenericSend()。这三个函数只能用于任务函数中,不能用于中断服务函数,中断服务函数有专用的函数,它们以"FromISR"结尾BaseType_t xQueueSend( QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait); BaseType_t xQueueSendToBack(QueueHandle_t xQueue,  const void* pvItemToQueue,  TickType_t xTicksToWait); BaseType_t xQueueSendToToFront(QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait);
  参数:
  xQueue: 队列句柄,指明要向哪个队列发送数据,创建队列成功以后会返回此队列的队列句柄。
  pvItemToQueue:指向要发送的消息,发送时候会将这个消息拷贝到队列中。
  xTicksToWait: 阻塞时间,此参数指示当队列满的时候任务进入阻塞态等待队列空闲的最大
  时间。如果为 0 的话当队列满的时候就立即返回;当为 portMAX_DELAY 的话就会一直等待,直到队列有空闲的队列 项,也就是死等,但是宏INCLUDE_vTaskSuspend 必须为 1。
  返回值:
  pdPASS: 向队列发送消息成功!
  errQUEUE_FULL: 队列已经满了,消息发送失败。
  2.队列操作实验
  具体的都在代码里备注了
  发送:void task1_task(void *pvParameters) { 	u8 key,i=0;     BaseType_t err;  //错误码 	while(1) 	{ 		key=KEY_Scan(0);            	// 扫描按键         if((Key_Queue!=NULL)&&(key))    //消息队列key_queue 创建成功,并切按下按键         {             err=xQueueSend(Key_Queue,&key,10); //发送按键值想队列发送(句柄,发送的数据(取地址),阻塞时间)             if(err==errQUEUE_FULL)   	//如果发送失败             {                 printf("队列key_queue已满,数据发送失败!r ");             }         }         i++;         if(i%10==0) check_msg_queue();         if(i==50)         {             i=0;             LED0=!LED0;         }         vTaskDelay(10);                         	} }
  接收:
  阻塞时间采用死等的方式
  //Keyprocess_task void Keyprocess_task(void *pvParameters) { 	u8 num,key; 	BaseType_t err; 	while(1) 	{         if(Key_Queue!=NULL)         { 					   					err=xQueueReceive(Key_Queue,&key,portMAX_DELAY);              if(err==pdTRUE)             {                 switch(key)                 {                     case WKUP_PRES:		                         LED1=!LED1;                         break;                     case KEY1_PRES:		                         BEEP=!BEEP;                         break;                     case KEY0_PRES:		                         num++;                         LCD_Fill(126,111,233,313,lcd_discolor[num%14]);                         break;                 }             }         }  		vTaskDelay(10);       	} }
  (串口)中断发送:
  if((USART_RX_STA&0x8000)&&(Message_Queue!=NULL)) 	{ 		xQueueSendFromISR(Message_Queue,USART_RX_BUF,&xHigherPriorityTaskWoken); 		 		USART_RX_STA=0;	 		memset(USART_RX_BUF,0,USART_REC_LEN); 	 		portYIELD_FROM_ISR(xHigherPriorityTaskWoken); 	}
  定时器接收:
  extern QueueHandle_t Message_Queue;	 extern void disp_str(u8* str);   void TIM2_IRQHandler(void) { 	u8 *buffer; 	BaseType_t xTaskWokenByReceive=pdFALSE; 	BaseType_t err; 	 	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) 	{ 		buffer=mymalloc(SRAMIN,USART_REC_LEN);         if(Message_Queue!=NULL)         {             memset(buffer,0,USART_REC_LEN);	             err=xQueueReceiveFromISR(Message_Queue,buffer,&xTaskWokenByReceive);             if(err==pdTRUE)			               {                   disp_str(buffer);	               }         } 		myfree(SRAMIN,buffer);		 		 		portYIELD_FROM_ISR(xTaskWokenByReceive); 	} 	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);   }
  总结
  队列的具体操作以及相关API函数需要会使用,在后续做项目的过程中,可以节省很多复杂的事。

洛国富新年状态火热打开进球账户在新赛季巴西甲级足球联赛开赛前,当季巴西各州联赛已相继拉开帷幕。在北京时间1月30日凌晨结束的巴西米内罗州足球锦标赛第2轮角逐中,米内罗美洲队在主场以2比1战胜维拉诺瓦竞技队,从而球二代们让人刮目相看希勒女儿歌曲超百万收听,欧文女儿参加恋综据英国媒体报道,英格兰足坛名宿阿兰希勒的女儿霍莉已经是当地名气不小的歌手。身为乡村音乐歌手的她自己创作并演唱的歌曲当即离开已经播放超过一百万次。而迈克尔欧文的女儿也成为了英国网红,3次拿下最佳第六人,4次砍下50,39岁飙下51分的克劳福德去哪了提起NBA的超级第六人,第一个映入你眼帘的球星会是谁?是妖刀吉诺比利?还是拿下三个最佳第六人的路威?又或者是半把神经半把刀的JR史密斯?也许答案无法统一,但有一个人,你一定不会忘记年近40还未婚!女排2大奥运功臣被事业耽误,小8岁师妹早早领证中国女排国家队在2016年奥运会上的表现给大家留下了非常深刻的印象,在那届奥运会上,中国女排全队上下齐心协力,最终再次拿到了奥运会冠军,中国女排也重登奥运之巅。那届奥运会让很多粉丝快船4连胜2个细节,双核满血回归背后,卢指导启用1人收奇效文水清清138100大胜马刺迎来四连胜后,卢指导直言,我感觉他们变得不太一样了!虽然我们还有很长的路要走,但情况确实不同了。我们在某些方面变得越来越好,特别是进攻方面,我们在不断改许亚军4段婚姻2个孩子,与何晴离婚后,他的婚姻状况怎样了?大器晚成的男明星不少,但53岁再度翻红的却没有几个,许亚军便是其中之一。2017年,53岁的许亚军凭借人民的名义公安厅长祁同伟这个角色再次被大众熟知,随之而来的,还有对他感情生活的鸡毛飞上天骆玉珠到死都不知道,陈江河为何会苦等她8年重温鸡毛飞上天,骆玉珠和陈江河的爱情再一次触动了我的心。放着白富美杨雪不要,偏偏选择苦苦等待,相信不少观众都费解陈江河到底图了一个什么?其实站在一个理性的角度来讲,骆玉珠可能到死都23年前瞧不起赵薇,10年前被赵薇碾压,如今51岁重获新生前段时间,知名影星郑家榆通过个人账号晒出了自己参加舞台剧演出的照片,镜头中,郑家榆手捧一束鲜花,穿着黑色礼服,样子看上去十分端庄,或许是因为刚刚演出结束,脸上的麦克风还没有摘掉,此南极洲首次被发现南极洲又称第七大陆,是是人类最后到达的大陆唯一没有土著人居住的大陆。位于地球最南端,土地几乎都在南极圈内,四周濒太平洋印度洋和大西洋。是世界上地理纬度最高的一个洲。南极大陆的总面积今天,人民日报头版点赞唐山!河北唐山港加快智慧港口建设码头上的科技范一边观察屏幕上的吊装现场实况模拟,一边推拉操作台上的手柄。在河北省唐山港京唐港区智慧码头控制中心,27岁的远程操控员王宁正在进行吊装作业。2如何使用Python检测和识别车牌?车牌检测与识别技术用途广泛,可以用于道路系统无票停车场车辆门禁等。这项技术结合了计算机视觉和人工智能。本文将使用Python创建一个车牌检测和识别程序。该程序对输入图像进行处理,检
金山云股价脚趾斩连年亏损,大股东不惜重大亏损计提60亿减值编辑导语金山软件计提减值损失也在情理之中。图百度百科前不久刚刚向港交所递交招股书的金山云,在国庆长假被揭开了伤疤。日前,金山软件公告称,因其投资的金山云股价低迷及近期财务表现等影响法媒业内人士预测油价到年底或回升到100美元据法国回声报网站9月30日报道,石油市场专业人士指出,石油到年底可能会回升到100美元左右。报道说,石油市场专业人士指出,近几个月的下跌呈锯齿状很可能即将结束。石油价格呈现出两年多中央为什么点名发展郑州?郑州,河南省省会城市,国家中心城市。国家这些年为何要重点发展郑州市?郑州这十年发展非常迅速,郑州本来就是中部的脊梁,国家中心城市,全国交通枢纽核心,华中经济最大省的龙头高校学生数量危机升级!中国经济面临四重考验!迎难而上!如何解决重重困难?最近关于中国经济的讨论很多,有人提出了一种观点国家经济形势非常复杂,而恢复经济,扭转颓势的关键其实在于信心,我们的政策需要围绕信心来做。这个说法我之前也提过,而现在的经济形势较为复A股节后将迎来重大转折?8大消息影响下周股市一国庆假期要闻汇总点评1C919大型客机项目团队代表并参观项目成果展览点评重点在于规模化和系列化发展,那将对相关上市公司构成利好,相关上市公司有博云新材森麒麟西部超导中航西飞等。2霍英东家族出手了,提供20亿后霍启山入局,何家的赌牌这次稳了这次澳门赌牌竞投,可以说是非常激烈,因为何鸿燊家族面临大妈赌王林国泰的竞争。林国泰旗下的云顶集团作为不速之客,这次给何鸿燊家族带来巨大的挑战。如果不是云顶集团出现,那么这次就是6家欧盟家用能源价格指数发布,雅典电价到底什么水平?据希腊中希时报8日报道,一份最新发布的欧盟家用能源价格指数报告显示,希腊首都雅典9月份再次成为欧盟家庭用电价格最低的城市之一,同时,其天然气价格位列欧盟成员国第4位。数据显示,在3和老板一起玩网游,合作组队偷袭爆装备,因不归还遭全服追杀投稿玩家匿名到了枸杞保温杯,自觉穿秋裤,数着头发过日子的年纪,很多名字都会模糊起来,但是有一个名字我至今记得,虽然我和那家伙从没见过面,甚至是男是女都不知道,但是我觉得就算到了我嗝10。9日小麦价格信息涨价能否持续?附全国报价表本轮小麦价格上涨,已经持续了大概半个月的时间,区间震荡许久的小麦终于扬眉吐气了一把。今日小麦现货价格依旧以涨为主,山东河南河北地区价格区间普遍在1。561。6元斤,样本点均价1。5最新油价2022年10月10日929598号汽油,0号柴油零售价格国际原油五连涨,今天晚上国内油价将调整下跌希望不大价格或搁浅今天是2022年10月10日星期一,今晚24时油价将开启调价窗口。油价和我们的生活息息相关,今天晚上的这次成品汽油,柴油富士康携手河南闯世界台企在豫这十年系列报道之二回首河南经济这十年的成就,外贸领域的突飞猛进称得上是亮点之一。作为不沿边不靠海的内陆省份,河南自2012年起外贸总量已连续10年位居中部第一。真金白银的成绩单背后,富士康的作用显而