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

发布者:春林初盛最新更新时间:2015-08-18 来源: eefocus关键字:ucos-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       

#define  N_MESSAGES                    128       

 

OS_STK        StartTaskStk[TASK_STK_SIZE];

OS_STK        MyTaskStk[TASK_STK_SIZE];

OS_STK        YouTaskStk[TASK_STK_SIZE];

 

char *s_flag;   //该字符串指示哪个任务在运行

//char *s_1;  

 

char          *ss;  //存放接收到的消息指针

 

char          *s100; //存放发送消息的指针

char          *s;

char          *s500;

void          *MsgGrp[N_MESSAGES];    //定义消息指针数组

//创建消息队列,首先需要定义一个指针数组(用于存放消息邮箱),然后把各个消息数据缓冲区的首地址存入这个数组中

//最后再调用函数OSQCreate()来创建消息队列

 

INT8U         err;

INT8U         y=0;

 

OS_EVENT      *Str_Q;                //定义事件控制块指针 队列的事件控制块指针 用于存放创建的消息队列的指针

 

void  MyTask(void *data);                     

void  StartTask(void *data);       

void  YouTask(void *data); 

 

 

 

void  main (void)

{

    OSInit();                                              

    PC_DOSSaveReturn();                                    

    PC_VectSet(uCOS, OSCtxSw);                             

    

Str_Q=OSQCreate(&MsgGrp[0],N_MESSAGES);                //创建消息队列

//函数的第一个参数&MsgGrp[0]是void **start,是存放消息缓冲区指针数组的地址,它是指向指针数组的指针

//可以用指针数组的首个元素的地址表示

//N_MESSAGES是该数组的大小

//返回值是消息队列的指针   Str_Q是OS_EVENT型的指针,是事件控制块型的指针

 

    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], 3);

    OSTaskCreate(YouTask, (void *)0, &YouTaskStk[TASK_STK_SIZE 1], 4);

    

   // s="How many strings could be geted?";

    //OSQPostFront(Str_Q,s);      //发送消息 以LIFO后进先出的方式发送

    //第一个参数Str_Q是消息队列的指针,是OSQCreate的返回值,第二个参数s是消息指针

    

    for (;;) 

    {

     s_flag="The StartTask is running!";

     PC_DispStr(50,++y, s_flag, DISP_FGND_RED DISP_BGND_LIGHT_GRAY);   //提示哪个任务在运行

    

        if(OSTimeGet()>100&&OSTimeGet()<500)

        {

         s100="The value of OSTIME is from 100 to 500 NOW!!";

         OSQPostFront(Str_Q,s100);   //发送消息 以LIFO后进先出的方式发送

         //发送消息 以LIFO后进先出的方式发送

           //第一个参数Str_Q是消息队列的指针,是OSQCreate的返回值,第二个参数s是消息指针

         s="The string belongs to which task."; 

         OSQPostFront(Str_Q,s);      //发送消息 以LIFO方式发送  所以如果要申请消息时,会先得到s,然后才是s100

        }

 

if(OSTimeGet()>1000&&OSTimeGet()<1500)

        {

         s500="The value of OSTIME is from 1000 to 1500 NOW!!";

         OSQPostFront(Str_Q,s500);   //发送消息

        }

        

        if (PC_GetKey(&key) == TRUE)   

                          

            if (key == 0x1B) 

                     

                PC_DOSReturn();          

            }

        }

 

        OSTimeDlyHMSM(0, 0, 1, 0);        

    }

}

 

 

 

void  MyTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==                                

    OS_CPU_SR  cpu_sr;

#endif

    pdata=pdata;

    for (;;)

                

     s_flag="The MyTask is running!";

     PC_DispStr(50,++y, s_flag, DISP_FGND_RED DISP_BGND_LIGHT_GRAY);   //提示哪个任务在运行

    

     ss=OSQPend(Str_Q,0,&err);    //请求消息队列,参数分别是:Str_Q为所请求消息队列的指针  第二个参数为等待时间

     //0表示无限等待,&err为错误信息,返回值为队列控制块OS_Q成员OSQOut指向的消息(如果队列中有消息可用的话),如果

     //没有消息可用,在使调用OSQPend的任务挂起,使之处于等待状态,并引发一次任务调度

     //因为前面发送消息时使用的是LIFO的方式,所以此处第一次得到的消息是上面最后发送的消息

    

     PC_DispStr(3,y, ss, DISP_FGND_BLACK DISP_BGND_LIGHT_GRAY);  //显示得到的消息

     //s_1="M";

     PC_DispStr(0,y,"My",DISP_FGND_RED DISP_BGND_LIGHT_GRAY);  //显示是哪一个任务显示的

    

     OSTimeDlyHMSM(0, 0, 1, 0);  

    }

}

 

void  YouTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==                                

    OS_CPU_SR  cpu_sr;

#endif

    pdata=pdata;

    for (;;)

                

     s_flag="The YouTask is running!";

     PC_DispStr(50,++y, s_flag, DISP_FGND_RED DISP_BGND_LIGHT_GRAY);   //提示哪个任务在运行

    

     ss=OSQPend(Str_Q,0,&err);    //请求消息队列

    

     PC_DispStr(3,y, ss, DISP_FGND_BLACK DISP_BGND_LIGHT_GRAY);  //显示得到的消息

     //s_1="Y";

     PC_DispStr(0,y,"You",DISP_FGND_RED DISP_BGND_LIGHT_GRAY);  //显示是哪一个任务显示的

    

     OSTimeDlyHMSM(0, 0, 1, 0);  

    }

}

 

//运行的现象说明上面分析是正确的,因为当时钟节拍数大于100,小于500时,会发送第一个if语句中的两个字符串s100和s

//下面运行的任务接收到并且显示。当时钟节拍数大于1000小于1500时,发送第二个if语句中的字符串,下面运行的任务

//接收并显示。当时钟节拍数大于1500时,就不再发送消息了,下面的任务得不到消息就无限等待下去,所以就不再显示了

//从运行的现象不难可以看出,有时MyTask或YouTask运行了,但是没有得到消息而处于等待状态

//使用上面的方法可以很清楚地看出任务调度和运行的关系了 MyTask和YouTask 是交替运行的,因为延迟时间相等

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

上一篇:ucos-ii学习笔记——信号量集(事件标志组)的原理及使用
下一篇:ucos-ii学习笔记——消息邮箱的原理及使用

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

STM8学习笔记三——错误:no definition for "assert_failed"
在STM8程序编译过程中,我碰到了这样的错误: Error : no definition for assert_failed 出现这个问题的原因是因为: void assert_failed(u8* file, u32 line); 这个函数在“stm8s_conf.h”这个文件中只是单纯的声明,他的作用来在我们在做串口调试时返回值验证出错的时候调用。因此我们需要在某个地方将这个函数进行实现。一般将他放在“main.c”进行实现。 解决方法如下: 1、在main.c代码里添加以下代码: #ifdef USE_FULL_ASSERT void assert_failed(u8* file, u32 line) { /* Use
[单片机]
龙芯税控SoC中Bootloader的设计与分析
前言 Bootloader是系统加电运行的第一段软件代码。在嵌入式系统 中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由Bootloader来完成。Bootloader是底层硬件和上层应用软件之间的一个中间件软件。它创建内核需要的一些信息并将这些信息通过相关机制传递给内核,从而将系统的软硬件环境带到一个合适的状态。同时还提供基本输入、输出系统监控程序功能,还可具有一定的调试功能。 随着大规模集成电路的发展和现在工艺的进步,片上系统SoC逐渐成为主流的芯片设计形态。龙芯税控 SoC系统软件框架包括以下几个主要部分:工具链、模拟调试环境、仿真环境、Bootloader、操作系统以及应用程序。本文介绍了龙芯税控
[单片机]
龙芯税控SoC中Bootloader的设计与分析
汇编入门学习笔记 (八)—— 转移指令
疯狂的暑假学习之 汇编入门学习笔记 (八) 转移指令 参考: 《汇编语言》 王爽 第9章 可以修改ip或者同时修改cs和ip的指令统称为转移指令。 8086CPU转移行为分为: 段内转移:只修改ip 段间转移:同时修改cs和ip 段内转移按ip修改的范围可分为: 短转移:ip修改范围 -128~127 近转移:ip修改范围 -32768~32767 转移指令分为: 无条件转移指令。如 jmp 条件转移指令 循环指令。如 loop 过程。 中断。 1. offset,nop指令 offset 获取标号的偏移地址 nop 占用1一个字
[单片机]
单片机学习笔记外部中断,定时器,串口中断
CPU收到中断请求,停下正在处理的工作A,去处理事件B,处理完后继续回到中断的地方继续执行事件A的过程,称为中断 51有5个中断源 外部中断0 定时计数中断0 外部中断1 定时继续中断1 串口中断 MCS-51单片机中断系统的结构: 5个中断源的符号、名称及产生的条件如下。 INT0:外部中断0,由P3.2端口线引入,低电平或下跳沿引起。 INT1:外部中断1,由P3.3端口线引入,低电平或下跳沿引起。 T0:定时器/计数器0中断,由T0计满回零引起。 T1:定时器/计数器l中断,由T1计满回零引起。 TI/RI:串行I/O中断,串行端口完成一帧字符发送/接收后引起。
[单片机]
单片机<font color='red'>学习</font><font color='red'>笔记</font>外部中断,定时器,串口中断
STM32单片机学习笔记(4):24C02(模拟IIC)
项目简介 利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第四部分针对EEPROM 24C02的一个实例,IIC通信是一种比较典型的串行通信方式,在很多情况下都会有所使用,了解并熟悉IIC通信就显得十分重要。本项目之所以使用模拟IIC,而没有使用STM32单片机内置的硬件IIC,主要由于Half库里IIC的坑太多了,自己一开始也是想通过HAL库来开发,但是始终不成功,也有可能仿真软件也有些坑,如果有能够做出来的大佬,也欢迎评论区或私聊我交流,不过在实物32单片机开发板上网上好像验证过可用,但是手上暂时缺开发板,
[单片机]
STM32单片机<font color='red'>学习</font><font color='red'>笔记</font>(4):24C02(模拟IIC)
LCD实验学习笔记(一):Makefile
主Makefile总领全局的就这句—— lcd.bin: $(objs) 要生成lcd.bin,依赖于objs列举的一堆文件:head.o init.o nand.o interrupt.o serial.o lcddrv.o framebuffer.o lcdlib.o main.o lib/libc.a 所以要先找到这些文件,几个.o,还有一个.a .o目标文件怎么生成? %.o:%.c和%.o:%.S是生成规则,就是依赖于.c或.S文件,使用交叉编译命令生成。 .a是库文件,到lib子目录里去找,在子目录里用make命令生成 下面逐行解读: CC = arm-linux-gcc //编译器。定义CC变量,为了简化书写 L
[单片机]
MSP432学习笔记:时钟(一)
MSP432共有六个时钟源,五个时钟,下面分别由我来介绍一下 时钟源分别有以下几个 LFXTCLK:低频振荡器(LFXT),可与低频32768-Hz手表配套使用,晶体,标准晶体,谐振器,或外部时钟源在32千赫或以下的范围。当在旁路模式下,LFXTCLK可以由32 khz或以下的外部方波信号驱动的范围内。 HFXTCLK:高频振荡器(HFXT),可与1-MHz至48-MHz范围内的标准晶体或谐振器一起使用。在旁路模式下,HFXTCLK可以通过外部方波信号驱动。 DCOCLK:内部数字控制振荡器(DCO),默认频率为可编程频率和3 mhz频率。 VLOCLK:内部极低功率低频振荡器(VLO),典型频率为9.4 kh
[单片机]
STM32基于固件库学习笔记(11)RTC实时时钟
实时时钟(RTC) 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。 互联型产品是指STM32F105xx和STM32F107xx微控制器。 主要特性 ● 可编程的预分频系数:分频系数最高为20 。 ● 32位的可编程计数器,可用于较长时间段的测量。 ● 2个分离的时钟:用于APB1接口的PC
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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