您的位置:首页 > 其它

uC/OS-II 学习笔记:消息邮箱实验

2014-07-28 18:56 471 查看
通过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灯同时闪烁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: