#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "lcd.h"
#include "key.h"
//#include "timer.h"
//#include "malloc.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
/************************************************
************************************************/
//LCD刷屏时使用的颜色
int lcd_discolor[14]={ WHITE, BLACK, BLUE, BRED,
GRED, GBLUE, RED, MAGENTA,
GREEN, CYAN, YELLOW,BROWN,
BRRED, GRAY };
#define START_TASK_PRIO 1 //任务优先级
#define START_STK_SIZE 256 //任务堆栈大小
TaskHandle_t StartTask_Handler; //任务句柄
void start_task(void *pvParameters); //任务函数
#define TASK1_TASK_PRIO 2 //任务优先级
#define TASK1_STK_SIZE 256 //任务堆栈大小
TaskHandle_t TASK1Task_Handler; //任务句柄
void task1_task(void *pvParameters); //任务函数
#define KEYPROCESS_TASK_PRIO 3 //任务优先级
#define KEYPROCESS_STK_SIZE 256 //任务堆栈大小
TaskHandle_t Keyprocess_Handler; //任务句柄
void keyprocess_task(void *pvParameters); //任务函数
//按键消息队列数量
#define KEYMSG_Q_NUM 1 //按键消息队列数量
#define MESSAGE_Q_NUM 4 //发送数据的消息队列的数量
QueueHandle_t Key_Queue; //按键消息队列句柄
QueueHandle_t Message_Queue; //消息队列句柄
//用于在LCD上显示接收到的队列消息
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,"STM32F407");
LCD_ShowString(10,30,200,16,16,"FREERTOS 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,200,16,16,"KEY1:SENDmsg KEY2:BEEP");
POINT_COLOR=BLACK;
LCD_DrawLine(0,110,120,110);
LCD_DrawLine(120,110,120,315);
LCD_DrawRectangle(125,110,234,315);
POINT_COLOR=RED;
LCD_ShowString(0,130,120,16,16,"Data_Msg Size:");
LCD_ShowString(0,170,120,16,16,"Data_Msg rema:");
LCD_ShowString(0,210,100,16,16,"Data_Msg:");
POINT_COLOR=BLUE;
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口
LED_Init(); //初始化LED端口
KEY_Init();
BEEP_Init();
LCD_Init();
//TIM9_Int_Init(5000,16800-1);//周期500ms
//my_mem_init(SRAMIN); //初始化内部内存池
freertos_load_main_ui();
//创建开始任务
xTaskCreate((TaskFunction_t )start_task, //任务函数
(const char* )"start_task", //任务名称
(uint16_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(TaskHandle_t* )&StartTask_Handler); //任务句柄
vTaskStartScheduler(); //开启任务调度
}
//开始任务任务函数
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //进入临界区
Key_Queue=xQueueCreate(KEYMSG_Q_NUM,sizeof(u8));//创建队列
Message_Queue=xQueueCreate(MESSAGE_Q_NUM,USART_REC_LEN);//创建队列
//创建TASK1任务
xTaskCreate((TaskFunction_t )task1_task,
(const char* )"task1_task",
(uint16_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_TASK_PRIO,
(TaskHandle_t* )&TASK1Task_Handler);
//创建KEYPROCESS任务
xTaskCreate((TaskFunction_t )keyprocess_task,
(const char* )"keyprocess_task",
(uint16_t )KEYPROCESS_STK_SIZE,
(void* )NULL,
(UBaseType_t )KEYPROCESS_TASK_PRIO,
(TaskHandle_t* )&Keyprocess_Handler);
vTaskDelete(StartTask_Handler); //删除开始任务
taskEXIT_CRITICAL(); //退出临界区
}
//TASK1任务函数
void task1_task(void *pvParameters)
{
u8 key,i=0;
BaseType_t err;
while(1)
{
key=KEY_Scan(0);
if((Key_Queue!=0)&&key)//如果队列创建成功,并且有按键被按下
{
err=xQueueSend(Key_Queue,&key,10);
if(err==errQUEUE_FULL) //
{
printf("队列key_Queue已满,数据发送失败!\r\n");
}
}
i++;
//if(i%10==0)check_msg_queue(); //检查Message_Queue队列的容量
if(i==50)
{
i=0;
LED0=~LED0;
}
vTaskDelay(10);
}
}
//keyprocess任务函数
//此函数只在Key_Queue队列创建成功以后,就在死等队列消息
//只要读到数据就会有相应操作
void keyprocess_task(void *pvParameters)
{
u8 num,key;
while(1)
{
if(Key_Queue !=0)
{
//请求消息
if(xQueueReceive(Key_Queue,&key,portMAX_DELAY))//收到消息后会删除队列中消息
{
switch(key)
{
case WKUP_PRES:
LED1=!LED1;
break;
case KEY2_PRES:
BEEP=!BEEP;
break;
case KEY0_PRES:
num++;
LCD_Fill(126,111,233,313,lcd_discolor[num%14]);
break;
}
}
}
vTaskDelay(10);
}
}
FreeRTOS 队列测试 keyprocess是正常的
最新推荐文章于 2024-12-15 18:18:30 发布
本文介绍了一个基于STM32F407的FreeRTOS应用实例,详细展示了如何通过FreeRTOS实现任务管理和消息队列通信。文中通过具体的代码实现了按键控制LED、蜂鸣器以及LCD屏幕刷新等功能。

1353

被折叠的 条评论
为什么被折叠?



