通过LED0任务函数实现times计数,通过LED1任务函数实现TFT液晶屏显示times数值。
已知:start_task创建消息邮箱;LED0向消息邮箱发送消息函数;LED1请求消息邮箱函数;
变量定义: OS_EVENT *pMsgBox; //定义事件控制块
u32 times; //类似于实参;
u32 pStr;//
u8 err;
对应函数:创建消息邮箱函数:pMsgBox = OSMboxCreate((void *)0);
向消息邮箱发送消息函数:OSMboxPost(pMsgBox, (void*)(times++));
请求消息邮箱函数:pStr = (u32)OSMboxPend(pMsgBox, 10, &err);
实验主要代码:
void start_task(void *pdata) //开始任务
{
pMsgBox = OSMboxCreate((void *)0);//创建邮箱
}
void led0_task(void *pdata)//向邮箱发送数据任务
{
OSMboxPost(pMsgBox, (void*)(times++));//向邮箱发送消息
delay_ms(500);
}
void led1_task(void *pdata) //显示部分任务
{
pStr = (u32)OSMboxPend(pMsgBox, 10, &err);//从邮箱取值
delay_ms(500);
}
附:完整代码(不含库函数)
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "includes.h"
#include "lcd.h"
//START
#define START_TASK_PRIO 10
#define START_STK_SIZE 64
OS_STK START_TASK_STK[START_STK_SIZE];
void start_task(void *pdata);
//LED0
#define LED0_TASK_PRIO 6
#define LED0_STK_SIZE 64
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
void led0_task(void *pdata);
//LED1
#define LED1_TASK_PRIO 7
#define LED1_STK_SIZE 64
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
void led1_task(void *pdata);
OS_EVENT *pMsgBox;
int main(void)
{
Stm32_Clock_Init(9); //系统时钟定义
uart_init(72,9600);//TFT部分串口定义(缺少TFT不好使)
delay_init(72); //初始化延时
LCD_Init(); //TFT初始化
LED_Init(); //LED初始化
//LCD_Clear(BLUE); //TFT蓝色清屏
POINT_COLOR=RED; //TFT字体为红色
LCD_ShowString(30,80,200,16,16,"success");//TFT显示success
OSInit(); //系统初始化
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//起始任务创建
OSStart(); //系统开始
}
//起始任务
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
pMsgBox = OSMboxCreate((void *)0);//(1)创建
OS_ENTER_CRITICAL();//
OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);
OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO);//
OS_EXIT_CRITICAL();//
}
//LED0
void led0_task(void *pdata)
{ u32 times;
while(1)
{
//sprintf(pMsg, "%d", times);
OSMboxPost(pMsgBox, (void*)(times++));//(2)发送消息
LED0=!LED0;
if(times>999)
times=0;
delay_ms(500);
};
}
//LED1
void led1_task(void *pdata)
{
u8 err;
u32 pStr;
//LCD_Clear(WHITE);
while(1)
{
pStr = (u32)OSMboxPend(pMsgBox, 10, &err);//(3)请求消息
POINT_COLOR=BLUE;
//LCD_ShowString(30,110,200,16,16,pStr);//
LCD_ShowxNum(80,130,pStr,4,16,0);//显示消息数值(即times数值大小)
LCD_ShowString(30,130,200,16,16,"times: ");//
LED1=!LED1;
delay_ms(500);
};
}
效果:TFT显示 success,TFT屏显示times数值从000到999循环,LED0和LED1灯同时闪烁。