这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » zlgarm,uc,os 向zlgarm请教uc/os信号量删除函数的使用

共2条 1/1 1 跳转至

zlgarm,uc,os 向zlgarm请教uc/os信号量删除函数的使用

院士
2006-09-17 18:14:16     打赏
zlgarm,uc,os 向zlgarm请教uc/os信号量删除函数的使用



关键词: zlgarm     请教     信号     删除     函数     使用    

院士
2006-12-22 22:43:00     打赏
2楼
问 OSSemDel()这个函数是用来删除信号量的,可是我成功删除该信号量后,依赖于这个信号量的两个任务居然还能运行,这是为什么?

#include "config.h"
#include "stdlib.h"

#define    TaskStkLengh     64            // 定义用户任务0的堆栈长度


OS_STK    Root_TaskStk [TaskStkLengh];
OS_STK    Task0Stk [TaskStkLengh];        // 定义用户任务0的堆栈
OS_STK    Task1Stk [TaskStkLengh];    // 定义Task1的堆栈
OS_STK    Task2Stk [TaskStkLengh];    // 定义Task2的堆栈


void    Root_Task(void *pdata);
void     Task0(void *pdata);            // Task0 任务0
void     Task1(void *pdata);            // Task1 任务1
void     Task2(void *pdata);
   

OS_EVENT *DispSem;


/*
**********************************************************************************************************
** 函数名称 :main()
** 函数功能 :uC/OS-II主函数,启动多任务环境。
**********************************************************************************************************
*/
int main (void)
{         
    OSInit ();        
    DispSem = OSSemCreate(1);    
                            
    OSTaskCreate (Root_Task,(void *)0, &Root_TaskStk[TaskStkLengh - 1], 1);    
    
    OSStart ();
    return 0;                                                    
}




void Root_Task    (void *pdata)
{
    pdata = pdata;
    
    TargetInit ();
    OSStatInit();
    OSTimeDlyHMSM(0,0,2,0);
    
    OSTaskCreate (Task0,(void *)0, &Task0Stk[TaskStkLengh - 1], 2);    
    OSTaskCreate (Task1,(void *)0, &Task1Stk[TaskStkLengh - 1], 3);    
    OSTaskCreate (Task2,(void *)0, &Task2Stk[TaskStkLengh - 1], 4);        
    while (1)
    {
        OSTimeDlyHMSM(10,0,0,0);
    }
            
}

/*********************************************************************************************************
**                            Task0 任务0
**                     目标板初始化,创建Task1,向串口0发送字符串“I AM TASK A.”
********************************************************************************************************/

void Task0    (void *pdata)
{
    uint8 err;
    char str1[]="I AM TASK A.\t";
    uint8 a=99,b=99;
    
    pdata = pdata;
    
    while (1)
    {
    
          OSSemPend(DispSem, 0, & err);    //  等待信号量
         
          PC_DispStr(0, 0, str1 , 0);
          OSSemPost(DispSem);        // 发送信号量
          OSTimeDlyHMSM(0,0,0,20);

    }
            
}

/*********************************************************************************************************
**                            Task1 任务1
**                        向串口0发送字符串“i am task b.”
********************************************************************************************************/

void Task1    (void *pdata)
{
    uint8 err;
    char str1[]="i am task b.\t";
    
    pdata = pdata;
    
    while (1)
    {
         
        OSSemPend(DispSem, 0, & err);    //  等待信号量
        
            PC_DispStr(0, 0, str1, 0);
            OSSemPost(DispSem);        // 发送信号量
            OSTimeDlyHMSM(0,0,0,20);
            
                    
    }
}


void     Task2(void *pdata)
{
    char str0[20];
    static char i=0;
    INT8U err=0;
    pdata = pdata;
    
    while(1)
    {
        if(i==0)
        {
            OSSemDel(DispSem,OS_DEL_ALWAYS,&err );
            sprintf(str0, "删除的结果%d\t",(uint8)err);
            PC_DispStr(0, 0, str0, 0);
        }
        i++;
        OSTimeDlyHMSM(0,0,4,0);
    }
}

  
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

运行结果:
I AM TASK A.    i am task b.    删除的结果0    I AM TASK A.    i am task b.    I AM TASK A.    i am task b.    I AM TASK A.    i am task b.    I AM TASK A.    i am task b.    I AM TASK A.    i am task b.    I AM TASK A.    i am task b.    I AM TASK A.    i am task b.。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


1: re检查OSSemPend返回的err!

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]