一、声明
这个程序执行的任务就是在一个函数里面可以执行几个不同的任务(好吧,我到现在也没学会怎么添加自己的视频)
我们这个程序使用到的外设只有OLED屏幕
二、CubeMx的配置
注意要选一下TIM4
挂一个I2C,用来放OLED的屏幕
再开一个FreeRTOS
8 72Mhz
记得这里选1.8.5
三、keil5的代码编写
首先我们要添加头文件
我们使用到的外设有OLED,同时程序里面也使用到了延时函数
#include "driver_lcd.h"//OLED显示的头文件只需要包含这个
#include "driver_timer.h"//这个里面使用了延时函数
我们要定义创建函数需要的结构体,定义任务需要的全局变量,定义保护LCD打印的标志位,相当于是写程序的准备工作
我们要编写这个函数
/* 定义函数需要的结构体 */
struct TaskPrintInfo{
uint8_t x;
uint8_t y;
char name[16];
};
/* 给下面三个任务设置三个全局变量 */
static struct TaskPrintInfo g_Task1Info ={0,0,"Task1"};
static struct TaskPrintInfo g_Task2Info ={0,3,"Task2"};
static struct TaskPrintInfo g_Task3Info ={0,6,"Task3"};
/* 保护LCD打印的时候不被打断 */
static int g_LCDCanUse =1;
/* 创建这个函数 */
void LcdPrintTask(void *params)
{
struct TaskPrintInfo *pInfo=params;
uint32_t cnt=0;
int len;
while(1)
{
/* 打印信息 */
if(g_LCDCanUse)
{
g_LCDCanUse=0;
len =LCD_PrintString(pInfo->x,pInfo->y,pInfo->name);
len +=LCD_PrintString(len,pInfo->y,":");
LCD_PrintSignedVal(len,pInfo->y,cnt++);
g_LCDCanUse=1;
}
mdelay(500);
//如果不添加mdelay()这一句,那么就只有Task3在OLED上面显示
}
}
然后我们要创建这三个任务
/* 使用同一个函数创建不同的任务 */
xTaskCreate(LcdPrintTask,"task1",128,&g_Task1Info,osPriorityNormal,NULL);
xTaskCreate(LcdPrintTask,"task2",128,&g_Task2Info,osPriorityNormal,NULL);
xTaskCreate(LcdPrintTask,"task3",128,&g_Task3Info,osPriorityNormal,NULL);
最重要的是我们要启动OLDE并且清屏
// 在创建任务这里添加初始化aOLED和清屏的指令
LCD_Init();
LCD_Clear();
至于默认任务都屏蔽掉
这个图是我们OLED屏幕上要显示的东西,也是我们需要写入的x,y的参数