ucos-ii学习笔记——信号量集(事件标志组)的原理及使用

发布者:csw520最新更新时间:2015-08-18 来源: eefocus关键字:ucos-ii  信号量集  事件标志组 手机看文章 扫描二维码
随时随地手机看文章
Created on: 2012-10-8

      Author: zhang bin

 

学习笔记

for ucos-ii  PC

redesigned by zhang bin

2012-10-8

versions:V-0.1

All Rights Reserved

 

 

 

 

#include "INCLUDES.h"

 

#define  TASK_STK_SIZE        512                    

 

OS_STK        StartTaskStk[TASK_STK_SIZE];  //起始任务  

OS_STK        MyTaskStk[TASK_STK_SIZE];

OS_STK        YouTaskStk[TASK_STK_SIZE];

OS_STK        HerTaskStk[TASK_STK_SIZE];

 

 

char *s1= "Mytask is running";

char *s2= "Youtask is running";

char *s3= "Hertask is running";

 

INT8U  err;  //返回的错误信息

INT8U  y=0;   //字符显示位置  

 

OS_FLAG_GRP  *Sem_F;    //定义一个信号量集指针,是标志组类型,OS_FLAG_GRP类型的指针  用标志组描述信号量集

//事件控制块用来描述信号量,消息邮箱,消息队列

 

void  StartTask(void *data);               

void  MyTask(void *data);                  

void  YouTask(void *data);                  

void  HerTask(void *data);                  

 

 

 

void  main (void)

{

    OSInit();                                              

    PC_DOSSaveReturn();                                    

    PC_VectSet(uCOS, OSCtxSw);                             

    

    Sem_F=OSFlagCreate(0,&err);    //创建信号量集 函数的原型为:OS_FLAG_GRP *OSFlagCreate(OS_FLAGS flags,INT8U *err)

    //其中参数OS_FLAGS flags是信号的初始值,在这里指定为0,即信号初始值为0.参数*err是错误信息,前面已经定义了

    //INT8U  err;  //返回的错误信息,所以此处为&err

    //返回值为OS_FLAG_GRP型的指针,即为创建的信号量集的标志组的指针,

    //前面已经定义了OS_FLAG_GRP  *Sem_F;    //定义一个信号量集指针

    

    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);

    OSTaskCreate(HerTask, (void *)0, &HerTaskStk[TASK_STK_SIZE 1], 5);

   

    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( )

{

OSFlagPend(   //请求信号量集

Sem_F,   //请求信号量集指针

(OS_FLAGS)3,    //过滤器 请求第0和第1位信号 0011 这里是把数据3强制转化为OS_FLAGS类型的数据,

//因为过滤器和信号量集中的信号都是OS_FLAGS类型的数据

//OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,   //信号全是1表示信号有效 参数OS_FLAG_CONSUME表示当

//任务等待的事件发生后,清除相应的事件标志位

OS_FLAG_WAIT_SET_ALL,   //信号全是1表示信号有效  没有加参数OS_FLAG_CONSUME,所以不会清除标志位

0,    //等待时限,0表示无限等待

&err   //错误信息 

);  

//任务MyTask在这里请求信号量集,如果请求到了信号量集,就继续运行,下面就显示信息,如果请求不到信号量集

//MyTask就挂起,处于等待状态,只到请求到了信号量集才继续往下运行

 

PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);  //显示信息

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

}

}

 

 

void YouTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==                                

    OS_CPU_SR  cpu_sr;

#endif

pdata=pdata;

for( )

{

PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);  //显示信息

 

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

 

OSFlagPost(    //向信号量集发信号

Sem_F,    //发送信号量集的指针

(OS_FLAGS)2,    //选择要发送的信号 给第1位发信号 0010  同样把2强制转化为OS_FLAGS型的数据,

//因为信号为OS_FLAGS型的

OS_FLAG_SET,   //信号有效的选项 信号置1  OS_FLAG_SET为置1  OS_FLAG_CLR为置0  

&err   //错误信息

);

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

}

}

 

 

 

void HerTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==                                

    OS_CPU_SR  cpu_sr;

#endif

pdata=pdata;

for( )

{

PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);  //显示信息

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

OSFlagPost(   //向信号量集发信号

Sem_F, 

(OS_FLAGS)1,    //给第0位发信号  0001,把1强制转化为OS_FLAGS型的

OS_FLAG_SET,   //信号置1

&err 

 );

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

}

}

//因为任务MyTask请求信号量集的时候请求的是第一位和第零位,所以下面两个任务分别发送第一位和第零位信号

 

//有一个问题:任务请求信号量集,得到信号后,信号量集中的对应的信号会被清除么??从本例的运行现象来看,好像

//是没有清除,因为当第一次YouTask和HerTask运行后,间隔了8s任务MyTask才运行,因为YouTask和HerTask都等待了8s

//才向信号量集发送信号。这个显现是正常的。但是以后MyTask每间隔2s就运行一次,没有间隔8s,等待信号量集。

 

//查到了:OSFlagPend()函数允许指定在任务等待的事件发生后,重新置起或是清除相应的事件标志位。这是通过在调用

//OSFlagPend()函数时将一个常量OS_FLAG_CONSUME和参数wait_type相“加”(或者相“或”)来实现的。

//例如希望等待事件标志组的BIT0位置位,而此时事件标志组的BIT0位已经置位了,那么如果在调用OSFlagPend()时,把参数

//wait_type加上OS_FLAG_CONSUME,就能清除这个事件标志位。如下所示:(详细说明,参见P210)

关键字:ucos-ii  信号量集  事件标志组 引用地址:ucos-ii学习笔记——信号量集(事件标志组)的原理及使用

上一篇:ucos-ii学习笔记——动态内存分配原理及使用
下一篇:ucos-ii学习笔记——消息队列的原理及使用

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

基于ARM7处理器uC/OS系统的Nos-Wlan移植
1 引言 目前,在无线监控、工业控制、视频传输等行业应用中,嵌入式无线系统主要采用以NORDIC解决方案为代表的无操作系统环境,该方案由“CPU+无线数传模块”构成,能够实现短距离低带宽无线通信。为满足这种需求,北京中电华大电子设计有限责任公司(以下简称华大电子)适时的推出了不依赖于任何操作系统的Nos-Wlan模块以加速现有产品的无线功能的升级,模块支持国内(WAPI)/国际(802.11i)安全标准。本文主要介绍了华大电子Nos-Wlan模块在基于ARM7核处理器LPC2478的uC/OS-ii环境下的移植。 2 Nos-Wlan模块介绍 Nos-Wlan系列模块产品是为了满足工业应用、安防监控等领域中,现有产品的无线功
[单片机]
基于ARM7处理器uC/OS系统的Nos-Wlan移植
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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