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

通过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灯同时闪烁。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值