#include "stm32f10x.h"
#include <stdio.h>
#include "led.h"
#include "oled.h"
#include "bmp.h"
#include "kkey.h"
#include "drv_usart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
//#include "figner.h"
#include "usart3.h"
#include "as608.h"
#include "malloc.h"
#include "zhiwen_open.h"
#include "queue.h"
#include "delay.h"
//任务句柄
static TaskHandle_t start_task_handle = NULL; //创建任务句柄
static TaskHandle_t Receive_Task_Handle = NULL; //Receive_Task_Handle任务句柄
static TaskHandle_t Send_Task_Handle = NULL; //Send_Task_Handle按键任务句柄
QueueHandle_t Test_Queue =NULL;
#define QUEUE_LEN 4 /* 队列的长度,最大可包含多少个消息 */
#define QUEUE_SIZE 4 /* 队列中每个消息大小(字节) */
static void start_task(void *arg);
static void Receive_Task(void *arg);
static void Send_Task(void *arg);
int flag = 1;
int main(void)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
led_init();
USART_Config();
//usart_init();
delay_init(SysTick_CLKSource_HCLK);
// SysTick_Init(72);
printf("这是一个freertos消息队列实验\n");
printf("按下KEY1或者KEY2发送队列消息\n");
printf("Receive任务接收到消息在串口回显\n\n");
//创建开始任务
xTaskCreate(start_task, "start_task", 512, NULL, 1, &start_task_handle);
/* 启动任务,开启调度 */
if(pdPASS == xReturn)
vTaskStartScheduler();
else
return -1;
while(1); //一般不会执行到这里
}
void start_task(void *arg)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
//进入临界区
taskENTER_CRITICAL();
//创建test_queue
Test_Queue = xQueueCreate(QUEUE_LEN,QUEUE_SIZE);
if(NULL != Test_Queue)
printf("创建Test_Queue消息队列成功!\r\n");
//创建任务一
xTaskCreate(Receive_Task, "Receive_Task", 512, NULL, 2, &Receive_Task_Handle);
if(pdPASS == xReturn)
printf("创建Receive_Task成功!\r\n");
//创建任务二
xTaskCreate(Send_Task, "Send_Task", 512, NULL, 3, &Send_Task_Handle);
if(pdPASS == xReturn)
printf("创建Send_Task成功!\r\n");
//删除开始任务
vTaskDelete(start_task_handle);
//退出临界区
taskEXIT_CRITICAL();
}
static void Receive_Task(void* parameter)
{
BaseType_t xReturn = pdTRUE;/* 定义一个创建信息返回值,默认为pdTRUE */
uint32_t r_queue; /* 定义一个接收消息的变量 */
UBaseType_t num = 0;
UBaseType_t num1 = 0;
while (1)
{
flag = 0;
xReturn = xQueueReceive( Test_Queue, /* 消息队列的句柄 */
&r_queue, /* 发送的消息内容 */
portMAX_DELAY); /* 等待时间 一直等 */
num = uxQueueMessagesWaiting(Test_Queue);
num1 = uxQueueSpacesAvailable(Test_Queue);
if(pdTRUE == xReturn){
printf("本次接收到的数据是%d\n\n",r_queue);
printf("队列中可用数据的个数%d\n\n",num);
printf("队列中可用用空间的个数%d\n\n",num1);
}else{
printf("数据接收出错,错误代码0x%lx\n",xReturn);
}
// xQueueReset(Test_Queue); 清除队列里面的东西
}
}
static void Send_Task(void* parameter)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
uint32_t send_data1 = 1;
uint32_t send_data2 = 2;
const TickType_t xDelay = 20 / portTICK_PERIOD_MS;
TickType_t tick = xTaskGetTickCount();
while (1)
{
flag = 1;
if( Key_get () == 1 )
{/* K1 被按下 */
printf("发送消息send_data1!\n");
xReturn = xQueueSend( Test_Queue,&send_data1,0 ); //消息队列句柄,发送消息的内容,等待时间
if(pdPASS == xReturn)
printf("消息send_data1发送成功!\n\n");
}
if( Key_get () == 2 )
{/* K2 被按下 */
printf("发送消息send_data2!\n");
xReturn = xQueueSend( Test_Queue,&send_data2,0 );
if(pdPASS == xReturn)
printf("消息send_data2发送成功!\n\n");
}
vTaskDelay(20);
}
}
调用vtaskdelay卡死怎么办 串口显示
[10:31:46.528]收←◆这是一个freertos消息队列实验
按下KEY1或者KEY2发送队列消息
Receive任务接收到消息在串口回显
创建Test_Queue消息队列成功!
创建Receive_Task成功!
创建Send_Task成功!
[10:31:49.673]收←◆发送消息send_data1!
消息send_data1发送成功!
[10:31:49.728]收←◆本次接收到的数据是1
队列中可用数据的个数0
队列中可用用空间的个数4
再按按键没反应了