搜索
bottom↓
回复: 3

ucos-ii的信号量问题OSSemPend(Fun_Semp,0,&err);

[复制链接]

出0入0汤圆

发表于 2013-6-16 15:55:28 | 显示全部楼层 |阅读模式
OSSemPend(Fun_Semp,0,&err);函数运行时并不处于等待状态。
当信号量初始化为0时,Fun_Semp=OSSemCreate(0); 理论上两个程序都应该处于等待状态,但在电脑上运行时发现两个程序一直在运行,没有处于等待状态。


/*编写一个应用程序,其中有一个函数Fun()和两个用户任务:MyTask和YouTask。应用程序中的两个任务都可以
调用此函数,但不能同时调用*/

#include "INCLUDES.h"

#define  TASK_STK_SIZE        512       /* 任务堆栈长度*/            
char *s1="MyTask";
char *s2="YouTask";
INT8U err;
INT8U y=0;
OS_EVENT *Fun_Semp;    //声明信号量

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

void  Fun(INT8U x,INT8U y);
void  StartTask(void *data);
void  MyTask(void *data);                  /* 声明任务      */
void  YouTask(void *data);

/*
*********************************************************************************************************
*                                                MAIN主函数
*********************************************************************************************************
*/
void  main (void)
{
        Fun_Semp=OSSemCreate(0);                               //定义信号量
    OSInit();                                              /* 初始化uC/OS-II */
    PC_DOSSaveReturn();                                    /* 保存DOS环境     */
    PC_VectSet(uCOS, OSCtxSw);                             /* 安装uC/OS-II的中断 */
    OSTaskCreate(StartTask,(void *)0, &StartTaskStk[TASK_STK_SIZE - 1], 0); //创建起始函数
    OSStart();                                             /* 启动多任务管理   */
}

void  StartTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3        /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
    INT16S        key;             /*用于退出的建*/
pdata = pdata;                                         /* Prevent compiler warning                 */
    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)
         {                     /* See if key has been pressed              */
            if (key == 0x1B)
            {                             /* Yes, see if it's the ESCAPE key          */
                PC_DOSReturn();                            /* Return to DOS                            */
            }
        }
        OSTimeDlyHMSM(0,0,3,0);                         /* 等待3S*/
    }
}

void  MyTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3        /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
   
    pdata = pdata;                                         /* Prevent compiler warning                 */
    for (;;)
    {       
            OSSemPend(Fun_Semp,0,&err);        //请求信号量
                PC_DispStr(0,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
                Fun(7,y);
//                OSSemPost(Fun_Semp);    //发送信号量
        OSTimeDlyHMSM(0,0,1,0);                         /* 等待1S*/
    }
}

void  YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3        //Allocate storage for CPU status register
    OS_CPU_SR  cpu_sr;
#endif

        pdata=pdata;
        for (;;)
        {
                OSSemPend(Fun_Semp,0,&err);    //请求信号量
                PC_DispStr(0,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
                Fun(7,y);   //调用FUN函数
//                OSSemPost(Fun_Semp);

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

void Fun(INT8U x,INT8U y)
{
        PC_DispStr(x,y,"  Calling FUN()",DISP_BGND_BLACK+DISP_FGND_WHITE);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-6-16 16:59:24 | 显示全部楼层
OSInit();                                              /* 初始化uC/OS-II */
Fun_Semp=OSSemCreate(0);              //定义信号

系统还没有初始化,不能创建

出0入0汤圆

发表于 2013-6-16 17:26:17 | 显示全部楼层
判断 Fun_Semp是不是0.

出0入0汤圆

 楼主| 发表于 2013-6-16 18:19:07 | 显示全部楼层
Eric2013 发表于 2013-6-16 16:59
OSInit();                                              /* 初始化uC/OS-II */
Fun_Semp=OSSemCreate(0); ...

多谢多谢!就是这个问题!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表