ucos-ii学习笔记——消息邮箱的原理及使用

发布者:真诚友爱最新更新时间:2015-08-18 来源: eefocus关键字:cos-ii  学习笔记  消息邮箱 手机看文章 扫描二维码
随时随地手机看文章
Created on: 2012-10-7

      Author: zhang bin

 

学习笔记

for ucos-ii  PC

redesigned by zhang bin

2012-10-7

versions:V-0.1

All Rights Reserved

 

 

 

#include "INCLUDES.h"

 

#define  TASK_STK_SIZE        512                    

char *s; //MyTask发送消息的指针

char *ss; //YouTask接受到的消息的指针

INT8U err;

INT8U y=0;

INT32U  Times=0;

 

OS_EVENT *Str_Box;    //定义事件控制块指针 定义消息邮箱的指针 

//比较和上例中定义信号量的区别 OS_EVENT *Fun_Semp;    //声明信号量  是事件控制块ECB类型的

//其实没有什么区别,定义的类型都是OS_EVENT的指针,都是事件控制块的指针

 

OS_STK        StartTaskStk[TASK_STK_SIZE];   //定义任务堆栈区

OS_STK        MyTaskStk[TASK_STK_SIZE];

OS_STK        YouTaskStk[TASK_STK_SIZE];

 

void  StartTask(void *data);

void  MyTask(void *data);                  

void  YouTask(void *data);

 

 

void  main (void)

{

    OSInit();                                              

    PC_DOSSaveReturn();                                    

    PC_VectSet(uCOS, OSCtxSw);                             

    

    Str_Box=OSMboxCreate((void *)0);  //创建消息邮箱  返回值是指向创建消息邮箱的指针 

    //该函数的参数为void *msg 是消息指针,在这里(void *)0表示初始值为NULL 这样也就表示

    //新创建的这个消息邮箱里没有内容

    

    OSTaskCreate(StartTask,(void *)0, &StartTaskStk[TASK_STK_SIZE 1], 0); //创建起始函数

    

    OSStart();                                             

}

 

void  StartTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==        

    OS_CPU_SR  cpu_sr;

#endif

    INT16S        key;             

    pdata pdata;                                         

    OS_ENTER_CRITICAL();

    PC_VectSet(0x08, OSTickISR);                           

    PC_SetTickRate(OS_TICKS_PER_SEC);                      

    OS_EXIT_CRITICAL();

    OSStatInit();                                          

    

    OSTaskCreate(MyTask,(void *)0, &MyTaskStk[TASK_STK_SIZE 1], 1); //创建任务函数

OSTaskCreate(YouTask,(void *)0, &YouTaskStk[TASK_STK_SIZE 1], 2); //创建任务函数

 

for (;;)

    {

     //如果恩下ESC键,则退出UC/OS-II

        if (PC_GetKey(&key) == TRUE)

                             

            if (key == 0x1B) 

                                        

                PC_DOSReturn();                            

            }

        }

        OSTimeDlyHMSM(0,0,3,0);                         

    }

}

 

 

 

void  MyTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==        

    OS_CPU_SR  cpu_sr;

#endif

   

    pdata pdata;                                         

    for (;;)

    {

     sprintf(s,"%d",Times);  //把Times赋给s

     OSMboxPost(Str_Box,s);  //发送消息s  其中两个参数Str_Box是OS_EVENT *pevent表示消

     //息邮箱指针(是事件控制块指针),s是void *msg表示消息指针

     //该函数表示把消息s发送到消息邮箱Str_Box中

    

     Times++;  //MyTask的运行次数加1

 

        OSTimeDlyHMSM(0,0,1,0);      

    }

}

 

void  YouTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==        //Allocate storage for CPU status register 

    OS_CPU_SR  cpu_sr;

#endif

 

pdata=pdata;

for (;;)

{

ss=OSMboxPend(Str_Box,10,&err);  //请求消息邮箱 参数表示:Str_Box是消息邮箱指针,10表示等待时间,

//err表示错误信息,返回值ss是邮箱中的消息指针

PC_DispStr(10,++y,ss,DISP_BGND_BLACK+DISP_FGND_WHITE);  //显示消息的内容,就是任务MyTask的运行次数

        OSTimeDlyHMSM(0,0,1,0);    //等待1s               

    }

}

 

 

 

//本程序实现的功能就是MyTask把自己的运行次数作为消息发送到消息邮箱中,任务YouTask请求消息邮箱,得到消息并显示出来

//因为MyTask和YouTask的等待时间相等,都是1s,所以Mytask和YouTask交替运行,运行次数相同,所以显示出的数字是从

//0开始,1 

//我试过了,(1)当MyTask的延迟时间短时,即YouTask运行一次,MyTask运行多次,这样显示的数字就是MyTask的运行次数,会不连续

//这是正常的。

//但是,(2)当MyTask运行一次,YouTask运行多次时,这样会好几次显示同样的数字,这也就表示在YouTask调用

//ss=OSMboxPend(Str_Box,10,&err);函数后,取得了消息,并每有把消息邮箱中的消息给清除,而是消息一直在邮箱中存在,

//所以下次再取消息的时候,消息还没有来得及更新,还是原来的消息。

//不知道当调用ss=OSMboxPend(Str_Box,10,&err);取得消息后,邮箱中的消息是否应该清除,从上面的现象来看,好像是没有清除

//这要分析该函数的代码才能搞清楚

 

//清楚了,情况是这样的:函数ss=OSMboxPend(Str_Box,10,&err);得到了邮箱中的消息后,确实是将邮箱清除了,将NULL指针存入了

//邮箱中,当出现上面(2)情况时,邮箱为空,YouTask是处于等待状态,但是由于在调用OSMboxPend时指定等待时间为10,所以当

//等待时间到了,即使邮箱中还是无消息,YouTask也会进入就绪态的,然后继续往下运行,但是,由于ss没有再取得新的消息,还

//是原来的值,所以还会显示原来的值。这种情况可以用改变OSMboxPend的等待时间来验证。OSMboxPend的详细代码说明,参见P235

 

//但是不知道为什么当OSMboxPend的等待时间我设为0时,表示无限等待,知道邮箱中有消息, 就什么也不显示了 ,为什么???

//当等待时间设为很大,大于1s对应的等待时间,显示的时间间隔就由等待时间来确定了,不知道为什么会这样??

//这个要搞清楚

关键字:cos-ii  学习笔记  消息邮箱 引用地址:ucos-ii学习笔记——消息邮箱的原理及使用

上一篇:ucos-ii学习笔记——消息队列的原理及使用
下一篇:ucos-ii学习笔记——信号量的原理及使用

推荐阅读最新更新时间:2024-03-16 14:29

LabView学习笔记(6)跑马灯之顺序结构与局部变量的使用
本例使用局部变量,通过练习使用顺序结构和While循环,又一次实现了跑马灯的效果。 前面板设计: 程序框图设计: 运行发现与前面while循环+移位寄存器效果一样!
[测试测量]
LCD实验学习笔记(十):TFT LCD
硬件组成: REGBANK是LCD控制寄存器组,含17个寄存器及一块256*16的调色板,用来设置参数。 LCDCDMA中有两个FIFO,当FIFO空或数据减少到阈值,自动发起DMA传输,从内存获取图像数据,不需CPU干涉。 VIDPRCS将LCDCDMA中的数据组成特定格式,从VD 发送LCD屏。 TIMEGEN产生控制信号VSYNC,HSYNC,VCLK,VDEN,LEND。VSYNC是跳到左上角的信号,HSYNC是跳到下一行最左边的信号。每个VCLK表示正在传输一个像素的数据。 数据格式: 一幅图像为一帧(frame),由多行组成,每行由多个像素点组成,每个像素的颜色使用若干位表示(BPP)。 VSYNC信号表示一帧数据的开
[单片机]
STM32CubeMX学习笔记——FreeRTOS_任务挂起与继续
Github https://github.com/HaHaHaHaHaGe/Planof2019_half/tree/master/Course_Project/FreeRTOS/Class02_SuspendResume 简介 任务挂起与继续的作用,用于暂停运行某些任务与继续运行某些任务。就像用视频播放器看电影的播放按键与暂停按键一样简单。 在STM32CubeMX上配置FreeRTOS非常的简单,几乎不需要做任何操作,只需要勾选 移植FreeRTOS就成功了,关于在非Cube上的RTOS配置文件内的相关内容,也在下方的Configuration栏中给好了 所有的配置都可以在这里完成 任务创建 有别于在没有
[单片机]
STM32CubeMX<font color='red'>学习</font><font color='red'>笔记</font>——FreeRTOS_任务挂起与继续
51单片机学习笔记之中断
(一)寄存器 要想学习中断那么首先就要了解寄存器,在这里我们学习一下什么是寄存器,寄存器怎么用。 1.什么是寄存器 寄存器是特殊的RAM,特殊功能寄存器是控制单片机硬件的开关(例如IE)或者是指示单片机状态的信号(例如PSW),通过特殊寄存器你就可以方便的控制整个MCU,并且知道当前的MCU的工作状态。 2.寄存器怎么用 AT89S51单片机中的特殊功能寄存器(SFR)的单元地址映射在片内RAM区的80H~FFH区域中,它共有26个,离散地分布在该区域中。用到哪个寄存器就相应配置哪个寄存器即可。寄存器太多就不一一写出来了,用到再去找就好。 (二)中断 单片机的中断是由单片机片内的中断系统来实现的。当中断请求源(简称中断
[单片机]
51单片机<font color='red'>学习</font><font color='red'>笔记</font>之中断
实现蓝牙与手机的双向通信 学习笔记
说明需要注意的几点: 1.US ART3_RX_BUF =0; //加入结束符,如果不加,就会和某些数据夹杂在一起,传回来部分无用的信息,经测试! 2.接线!!!蓝牙与单片机,任何时候都是 rx-tx,tx-rx。但是stm32精英版中uart3有个很奇怪的错误?上图 这也就是说,在板子上的rx接的单片机实际引脚是TX,所以接线的时候是对应相接。 #include led.h #include delay.h #include key.h #include sys.h #include lcd.h #include usart.h #include hc05.h #include usart3.
[单片机]
实现蓝牙与手机的双向通信 <font color='red'>学习</font><font color='red'>笔记</font>
电设工作小结之——MSP430G2553学习笔记——3
接上一篇继续: 二,MSP430G2553的应用设计 (一),频率计的设计 1,频率计的实现方法有:测频法,测周法,等精度测频。一般是低频用测周法较准,高频用测频法较准。等精度测频是比较准的。 2,测周法: (1)可以使用定时器的输入捕获功能,捕获上升沿或下降沿,然后就可以计算出信号的周期,从而得出频率。 (2)也可以把待测信号接到IO上,然后用无限循环不停的查询电平的高低,从而得出信号的周期。丁老师建议:以丁老师的经验,这种方法测量的精度比用捕获中断的精度要高,因为中断的进入和退出都要占用时间。 (3)但这种侧周法适用于低频信号频率的测量,对于高频信号精度不好。 3,测频法: (1)可以定时一定的时间,然后计算
[单片机]
MSP430 DM430-A开发板学习笔记(二)MSP430f149与hc06蓝牙模块的使用
1.MSP430f149与hc06蓝牙模块的连接 1.1hc06蓝牙模块 hc06蓝牙模块可以直接在淘宝上购买,去官方店买比较好,资料比较全 hc06蓝牙与各种单片机的连接情况如下 因为msp430的供电也是3.3v,所以hc06蓝牙模块可以用msp430开发板上的vcc和gnd来对其进行供电和共地 然后要注意的是msp430f149的串口TXD 和 RXD 分别是p3.4和p3.5,这里的具体分析可以参考以下文章 MSP430F149串口收发程序详解 1.2单片机模块 单片机所用的编程软件为IAR,所用的下载器为BSL,这些都在我的以下文章的评论区中有下载链接 MSP430 DM430-A开发板学习笔记(一)IA
[单片机]
MSP430 DM430-A开发板<font color='red'>学习</font><font color='red'>笔记</font>(二)MSP430f149与hc06蓝牙模块的使用
神舟IV学习笔记(十一)DAC波形生成
数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。 DAC主要特征 ● 2个DAC转换器:每个转换器对应1个输出通道 ● 8位或者12位单调输出 ● 12位模式下数据左对齐或者右对齐 ● 同步更新功能 ● 噪声波形生成 ● 三角波形生成 ● 双DAC通道同时或者分别转换 ● 每个
[单片机]
神舟IV<font color='red'>学习</font><font color='red'>笔记</font>(十一)DAC波形生成
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved