1.什么是队列
队列也称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务之间,中断和任务之间传递信息
2.传递信息为什么不用全局变量呢?
确实全局变量依然可以传递信息,但是如果全局变量改变的很频繁,某一任务处理数据比较缓慢,某一任务在处理数据的过程中改变了全局变量的值,就可能会导致某一任务获取的数据不正确,消息队列就像一条生产线似的,将数据放入队列中,任务从队列中读取数据,这样的话就算改变了数据的值,任务根据队列中的值来获取数据也能获取到正确的值
3.队列的几个名词
队列项目:队列中每一个数据
队列长度:队列能够存储项目(数据)的最大数量(创建队列时需要指定队列长度和队列项目大小)
队列的特点
1.数据的出入方式:
通常采用先入先出的数据缓冲方式(FIFO)也可以配置成后入先出的方式(LIFO)
2.数据的传输方式
通常采用实际值传递,也就是将数据拷贝到队列中传递,也可以通过指针,通常传递较大的数据时采用指针传递
3.多任务访问
队列不属于任何一个任务,任何中断和任务都可以向队列发送/接收数据
4.出队/入队阻塞
当任务向队列中发送数据时,如果队列已满,可以指定一个堵塞时间:
0:不堵塞直接返回
0----port_MAX_Delay:等待设定的时间,如果超时还未能入队,就返回
port_MAX_Delay:死等,一直等到能够入队为止
与队列相关的API函数
1.创建队列
QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength,UBaseType_t uxItemSize);
参数1:UBaseType_t uxQueueLength:队列中最大可存放的项目数
参数2:UBaseType_t uxItemSize:每个项目的大小
返回值如果创建成功就返回创建队列的句柄,如果创建队列所需内存无法分配就返回NULL
在cubeMX中配置好后会自动封装新的函数创建队列
声明定义两个任务和一个队列的句柄