FreeRTOS队列和相关函数
FreeRTOS队列
什么是队列
队列是为了任务与任务、任务与中断之间的通信而准备的,他可以任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存到队列中,叫做队列项目。队列所能保存的最大数据项目的数量叫做队列长度,创建队列时会指定数据项目的大小和队列长度。由于队列是用来传递消息的,也称为消息队列。FreeRTOS中信号量依靠队列实现的。队列不属于莫个任务,任何任务都可以向队列发送消息,或者从队列中提取消息。
1.出队阻塞
2.入队阻塞
3.队列结构体
有一个结构体用来描述队列,叫做Queue_t,这个结构体在queue.c文件中。
队列函数
创建队列函数
发送消息函数
读取消息函数
实验
要求
程序
1.主程序
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "lcd.h"
#include "key.h"
#include "beep.h"
#include "string.h"
#include "malloc.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
//任务优先级
#define START_TASK_PRIO 1
#define TASK1_TASK_PRIO 2
#define KEYPROCESS_TASK_PRIO 3
//任务堆栈大小
#define START_STK_SIZE 256
#define TASK1_STK_SIZE 256
#define KEYPROCESS_STK_SIZE 256
//任务句柄
TaskHandle_t StartTask_Handler;
TaskHandle_t Task1Task_Handler;
TaskHandle_t Keyprocess_Handler;
//任务函数
void start_task(void *pvParameters);
void task1_task(void *pvParameters);
void Keyprocess_task(void *pvParameters);
#define KEYMSG_Q_NUM 1 //按键消息队列的数量
#define MESSAGE_Q_NUM 4 //发送数据的消息队列的数量
QueueHandle_t Key_Queue; //按键消息队列的句柄
QueueHandle_t Message_Queue; //信息队列句柄
//LCD刷屏颜色
int lcd_discolor[14]={
WHITE, BLACK, BLUE, BRED,
GRED, GBLUE, RED, MAGENTA,
GREEN, CYAN, YELLOW,BROWN,
BRRED, GRAY };
//显示接收队列的消息
void disp_str(u8* str)
{
LCD_Fill(5,230,110,245,WHITE); //先清除显示区
LCD_ShowString(5,230,100,16,16,str);
}
//加载主页面
void freertos_load_main_ui(void)
{
POINT_COLOR = RED;
LCD_ShowString(10,10,200,16,16,"STM32F103/407");
LCD_ShowString(10,30,200,16,16,"FreeRTOS Examp 13-1");
LCD_ShowString(10,50,200,16,16,"Message Queue");
LCD_ShowString(10,70,220,16,16,"KEY_UP:LED1 KEY0:Refresh LCD");
LCD_ShowString(10,90,