hbchf 发表于 2013-5-7 16:54:00

请教个ucos3中OSSemPost的问题?

本帖最后由 hbchf 于 2013-5-7 16:57 编辑

先上代码:void StartTask(void)
{
OS_ERR err;
Param_init();
SysTickInit();       
       
//定义信号量 -有卡标识
OSSemCreate(        (OS_SEM         *)&Cardflage,
                                        (CPU_CHAR         *)"detection card ok",
                                        (OS_SEM_CTR)1,
                                        (OS_ERR         *)err);
       
OSTaskCreate(        (OS_TCB         *)&LCD_TCB,
                                        (CPU_CHAR         *)"LCD_task",
                                        (OS_TASK_PTR)LCDTCB,
                                        (void                 *)0,
                                        (OS_PRIO       )LCD_PRIO,
                                        (CPU_STK        *)&LCD_stk,
                                        (CPU_STK_SIZE)LCD_STK_SIZE / 10,
                                        (CPU_STK_SIZE)LCD_STK_SIZE,
                                        (OS_MSG_QTY        )0,
                                        (OS_TICK        )0,
                                        (void                *)0,
                                        (OS_OPT                )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                                        (OS_ERR                *)&err);
       
OSTaskCreate(        (OS_TCB         *)&DecteCard_TCB,
                                        (CPU_CHAR         *)"user card task",
                                        (OS_TASK_PTR)Task_DecteCard,
                                        (void                 *)0,
                                        (OS_PRIO        ) DecteCard_PRIO,
                                        (CPU_STK        *)&DecteCard_stk,
                                        (CPU_STK_SIZE)DecteCard_STK_SIZE / 10,
                                        (CPU_STK_SIZE)DecteCard_STK_SIZE,
                                        (OS_MSG_QTY)0,
                                        (OS_TICK        )0,
                                        (void                *)0,
                                        (OS_OPT                )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                                        (OS_ERR                *)&err);       

                                       
OSTaskCreate(        (OS_TCB         *)&AntennaTCB,                        //定时复位天线
                                        (CPU_CHAR         *)"turn on/off antenna",
                                        (OS_TASK_PTR)Task_on_off_antenna,
                                        (void                 *)0,
                                        (OS_PRIO        )Antenna_PRIO,
                                        (CPU_STK        *)&Antenna_stk,
                                        (CPU_STK_SIZE)Antenna_STK_SIZE / 10,
                                        (CPU_STK_SIZE)Antenna_STK_SIZE,
                                        (OS_MSG_QTY)0,
                                        (OS_TICK        )0,
                                        (void                *)0,
                                        (OS_OPT                )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                                        (OS_ERR                *)&err);
       
        //删除任务
OSTaskDel(                (OS_TCB         *)&taskStartTCB,
                                        (OS_ERR         *)&err);
       
                               
}static void Task_on_off_antenna(void *p_arg)
{
        OS_ERR err;
        static uchar m ;
        static uchar ch,n =0;
       static uchar buf;

        while (1)
        {
                OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_HMSM_STRICT,&err);
                FM1715_CloseRF();
                OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_HMSM_STRICT,&err);
                FM1715_OpenRF();       
                OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err);
                 memset(buf,0,sizeof(buf));
                ch = mcml_request(buf);
             if(ch == FM1715_OK)   
                {

                        OSSemPost(&Cardflage,
                                        OS_OPT_POST_ALL,
                                        &err);
                                n = 2;
                             m = n ;
                 }   
   
        }
}
static void Task_DecteCard(void *p_arg)
{
      OS_ERR err;
      CPU_TS ts;
        static uchar n,m = 0;
       
        while (1)
        {
                OSSemPend(&Cardflage,
                                  0,
                               OS_OPT_PEND_BLOCKING,
                                 &ts,
                              &err);
                               n = m++;
                                       
        }
}在单步调试的过程中,程序进入到了函数Task_on_off_antenna中的OSSemPost执行完后;任务Task_DecteCard一直挂着怎么就进不了这个任务了?新手上路多多指教!

hbchf 发表于 2013-5-7 16:59:35

我的理解任务Task_on_off_antenna中的OSSemPost执行完后,任务切换到Task_DecteCard的时候,此时OSSemPend(&Cardflage)满足条件,会执行该任务下面的L42行的?是这样理解的吗?

hbchf 发表于 2013-5-10 14:37:46

看来大伙都在忙活儿呀!
问题简单
现在解决了,把原因告诉大伙,或许可以帮助像我一样的新手理解问题。
原因是:
在调用OSSemPend()时,一定要检测它的返回类型,即err,如果不检测它的话,没有什么意义,这个有几种类型,分别是
OS_ERR_PEND_ISR      
OS_ERR_PEVENT_NULL   没有创建该信号量
OS_ERR_EVENT_TYPE    OSEventType类型不匹配
OS_NO_ERR            成功
OS_TIMEOUT         超时
页: [1]
查看完整版本: 请教个ucos3中OSSemPost的问题?