#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "sys.h"
#include "queue.h"
/****************************************************
STM32F103C8T6单片机freertos移植实验
作者:KJX
时间:2023-12-22
*****************************************************/
//优先级
#define START_TASK_PRIO 1
//堆栈大小
#define START_STK_SIZE 128
//任务函数
void start_task(void * pvParameters);
//任务句柄
TaskHandle_t StartTask_Handler;
//task1优先级
#define TASK1_TASK_PRIO 3
//task1堆栈大小
#define TASK1_STK_SIZE 128
//task1函数声明
void task1_task(void * pvParameters);
//task1任务句柄
TaskHandle_t Task1Task_Handler;
//task2优先级
#define TASK2_TASK_PRIO 2
//task2堆栈大小
#define TASK2_STK_SIZE 128
//task2函数声明
void task2_task(void * pvParameters);
//task2任务句柄
TaskHandle_t Task2Task_Handler;
//数据定义(队列操作)
QueueHandle_t key_queue;
QueueHandle_t bigData_queue;
char buff[100]={"我是大数组,不能超过100,okokok,20231222,kjx"};
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
delay_init();
uart_init(9600);
LED_Init();
LED0=0;
//创建队列
key_queue = xQueueCreate(2,sizeof(uint8_t));
if(key_queue!=NULL)
{
printf("key_queue队列创建成功!\r\n");
}
else{
printf("key_queue队列创建失败!\r\n");
}
//创建队列
bigData_queue = xQueueCreate(1,sizeof(char *));
if(bigData_queue!=NULL)
{
printf("bigData_queue队列创建成功!\r\n");
}
else{
printf("bigData_queue队列创建失败!\r\n");
}
xTaskCreate((TaskFunction_t ) start_task, //指向任务函数的指针,必须为第一个
(char * ) "start_task", //任务名字
(uint16_t ) START_STK_SIZE, //任务堆栈大小,字为单位
(void * ) NULL, //传递给任务函数的参数
(UBaseType_t ) START_TASK_PRIO,//任务优先级,数值大,则优先级大
(TaskHandle_t * ) &StartTask_Handler);//任务句柄(控制块)
vTaskStartScheduler();//开启任务调度
}
//开始任务
//返回值为pdPASS则创建任务成功
void start_task(void * pvParameters)
{
taskENTER_CRITICAL();//进入临界区,创建任务完成后,才开始执行优先级任务
//创建Task1
xTaskCreate((TaskFunction_t ) task1_task,
(char * ) "task1_task",
(uint16_t ) TASK1_STK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK1_TASK_PRIO,
(TaskHandle_t * ) &Task1Task_Handler);
//创建Task2
xTaskCreate((TaskFunction_t ) task2_task,
(char * ) "task2_task",
(uint16_t ) TASK2_STK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK2_TASK_PRIO,
(TaskHandle_t * ) &Task2Task_Handler);
vTaskDelete(StartTask_Handler);//删除开始任务,删除自身用NULL
taskEXIT_CRITICAL();//退出临界区
}
//key_queue、bigData_queue入队
//任务一
void task1_task(void * pvParameters)
{
uint8_t key=2;
BaseType_t err=0;
char *buf;
buf=buff;
while(1)
{
if(key==1)
{
err = xQueueSend(key_queue,&key,portMAX_DELAY);
if(err!= pdTRUE)
{
printf("key_queue error\r\n");
}
}else if(key==2)
{
err = xQueueSend(bigData_queue,&buf,portMAX_DELAY);
if(err!= pdTRUE)
{
printf("bigData_queue error\r\n");
}
}
vTaskDelay(10);
}
}
//任务二,key_queue或bigData_queue出队
void task2_task(void * pvParameters)
{
uint8_t key=0;
BaseType_t err=0;
char *buf;
buf=buff;
// while(1)
// {
// err = xQueueReceive(key_queue,&key,portMAX_DELAY);
// if(err!= pdTRUE)
// {
// printf("key_queue读取失败\r\n");
// }
// else{
// printf("key_queue读取成功,%d\r\n",key);
// }
// vTaskDelay(1000);
// }
while(1)
{
err = xQueueReceive(bigData_queue,&buf,portMAX_DELAY);
if(err!= pdTRUE)
{
printf("bigData_queue读取失败\r\n");
}
else{
printf("bigData_queue读取成功,%s\r\n",buf);
}
vTaskDelay(1000);
}
}
?