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

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函数需要会使用,在后续做项目的过程中,可以节省很多复杂的事。

林心如的痛隐退5年,网友仍对她骂声一片,她到底做错了啥?林心如可谓是风波不断,她人虽然不在内娱,但内娱从来不缺她的瓜。前不久,网上突然爆出林心如今年会亮相内地某综艺,不是中餐厅,就是向往的生活,虽然消息还不确定,但网上却掀起了探讨的热潮不要随意给未婚女性扣帽子?关键在于抵制住亲友们催婚逼婚的杂音代表的建议和希望有代表接受媒体采访时表示,随着我国经济社会的不断发展,女性地位前所未有地提高了,不过还需追求更多实质性的男女平等,包括为女性营造更加友好的职场环境。并且关于部分女性周扬青晒辣妹泳装照,峰腰翘臀太吸睛,网友吐槽全是科技与狠活文小然近日罗志祥前女友周扬青通过个人社交账号晒出自己的旅行美照,而此次她穿着火辣性感的泳装出镜,纤腰长腿美翻众人。周扬青坐在泳池边戏水配文中她表示早在自己年轻漂亮的时候多留点辣妹照一张211毕业生工资表流出,网友炸了天啊!真没想到最近,一段视频在网上引起轩然大波。视频的主人公是一位今年6月即将毕业的研究生。毕业于知名学府的他,信心满满地来到上海某招聘会求职,来自知名国企和外企的HR都对他十分热情,尤其听说他花滑世青赛中国小将安香怡自由滑刷新赛季最佳获得女单第六名!2023年花样滑冰世青赛女单比赛全部结束,中国16岁小将安香怡自由滑得分120。03分刷新赛季最佳,总分183。94分获得本届世青赛女单第六名。日本选手岛田麻央以总分224。54分一宇道破如何理解中国式现代化道路创造了人类文明新形态?视频加载中有些人试图把现代化等同于西方化宣称西方模式是谋求发展的唯一路径但事实真的是这样吗?中国踏上新征程中国式现代化将会成为今年两会最受关注话题之一中国走出一条中国式现代化道路创专访全国人大代表蔡继明深化土地资源配置改革健全城乡统一土地大市场加快建设土地大市场是建设全国统一大市场的重要内容。随着人口形势变化和城市化发展,人和地如何匹配城和乡如何协同需要深层次改革。清华大学社会科学学院教授政治经济学研究中心主任蔡继明长期深夜风暴!美联储重磅发声,美股惊魂一跳!泽连斯基下令增援,什么情况?朝鲜这将被视为ampampquot宣战ampampquot又是一个不眠夜!美东时间3月7日周二,美联储主席鲍威尔称,若整体数据暗示有必要加快紧缩,联储将准备加快加息步伐恢复价格稳定可能需要一段时间保持限制性政策。受此影响,互换合约显示,交春日里的中国福建建宁樱花盛开引蜂来盛开的樱花吸引蜜蜂前往采蜜(央广网发游海飞摄)福建省建宁县黄坊乡武调村,樱花沿街盛开(央广网发游海飞摄)盛开的樱花(央广网发游海飞摄)樱花盛开春色美(央广网发游海飞摄)勤劳的蜜蜂在终结柯洁86个月霸榜28岁李轩豪何以成中国围棋第一人?李轩豪图视觉中国2日,中国围棋协会公布了最新一期等级分排名,李轩豪九段以2714。2分首次登顶,柯洁九段以2709。6分位居次席。这也宣告柯洁长达86个月的霸榜历史终结。出生于19越位手球?记者深夜怒斥日本队胜之不武,中国球迷在现场竖中指U20亚洲杯第一轮,中国队在10领先的情况下惨遭日本队21逆转,遭遇开门黑。记者马德兴在凌晨2点发文怒斥日本队胜之不武。马德兴指出,日本队打进的第一个进球时,熊田直纪越位的嫌疑很大
带着孙女去旅行(48)丽江晒太阳(一)2023年的春节,阳康之后咳嗽厉害,快一个月了,也不见好,女儿说到云南丽江去,那里暖和一点,看看还咳嗽不?说走就走,初一出发,驾车上雅西高速,一路向西,过泥巴山隧道时,东面山上白雪可以推荐好用的水乳吗?平价大牌都有推荐一些,价格仅仅是参考价哦一平价推荐春雨蜂蜜水乳参考价179rmb敏感肌痘痘肌孕妇都可以使用,无添加温和安全不紧绷滋润营养肌肤,虽说这款是蜜蜂配方,不用担心油腻问题芙我爸信用卡欠款10万并且逾期,我现在收到经侦大队短信,我该怎么办?你爸欠信用卡账十万元,最好主动去和发卡行信用卡中心的银行工作人员(催收部或法务)进行沟通,达成解决共识,如果一直回避,拒接银行的电话,也不还款,且你爸所拖欠的银行信用卡款项已超过人治疗糖尿病,能报销吗?该怎么办?治疗糖尿病,能报销吗?该怎么办?首先谢谢你的邀请,我也是2型糖尿病2型高血压患者,血糖每天2232之间,奉劝您不要一发现自己是糖尿病,就问国家该怎么办?先要问你子女该怎么办,至少问假如全国普及社区食堂,你会赞成吗?社区办食堂,民生大文章普及社区办食堂我相信90的家庭都会赞成,不但解决了老龄人吃饭难题,同时也能减轻上班族的家务负担,这是个双赢的举措好处多多,也免得家家户户为了一日三餐奔波发愁,铸铁发动机性能更好,为什么全铝发动机却越来越多?铝的发动机更轻,同体积下比铸铁的发动机轻20公斤,节油效果更好铝散热比铁快,可以提高发动机效率生产环节上铝制发动机要比铸铁有优势。但是铝制发动机的最大功率比铸铁要小,但是一般家用车20余家媒体代表组团打卡徐闻菠萝的海3月的菠萝的海,充满了阳光海风热浪菠萝的风情和气息。一群扛着单反相机摄像机的人,迫不及待地冲到菠萝摊位前。随着按键的起落,菠萝的海与这里的人景,一同定格在影像中。广东省湛江市徐闻县贵州桐梓花开成海春意盎然来源人民网贵州频道原创稿盛开的油菜花。人民网记者涂敏摄油菜花桃花李花竞相盛开。人民网记者涂敏摄盛开的李花。人民网记者涂敏摄盛开的李花。人民网记者涂敏摄油菜花桃花李花竞相盛开。人民网今起珠海新开这些高速专线,开往横琴3月27日,珠海金湾横琴开通全新高速专线!相比现状常规线路提速约40,分别会途径哪些站点?以及如何购票?琴T87路高速专线运行路线三灶总站琴石路伟民路金海岸大道西机场北路湖滨路双湖桃你欢喜!嘉定这片桃花盛放桃之夭夭,灼灼其华这几日,外冈镇锦绣桃园内的桃花已吐露花蕊,跟着小嘉一起去看看走进这片50亩的桃花林,犹如闯入一片世外桃源,一朵朵桃花娇艳绽放。深深浅浅的各色桃花,花影摇曳,妩媚动到前湾去看古民居到前湾去看古民居徐青很早就听说前湾古民居,最早的房子是建于明朝初年的,距今已有600年的历史。两次计划去前湾看看,都没成行。今早,和多位朋友相约,我们三辆车分别从襄阳城和枣阳城出发