请教个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一直挂着怎么就进不了这个任务了?新手上路多多指教! 我的理解任务Task_on_off_antenna中的OSSemPost执行完后,任务切换到Task_DecteCard的时候,此时OSSemPend(&Cardflage)满足条件,会执行该任务下面的L42行的?是这样理解的吗? 看来大伙都在忙活儿呀!
问题简单
现在解决了,把原因告诉大伙,或许可以帮助像我一样的新手理解问题。
原因是:
在调用OSSemPend()时,一定要检测它的返回类型,即err,如果不检测它的话,没有什么意义,这个有几种类型,分别是
OS_ERR_PEND_ISR
OS_ERR_PEVENT_NULL 没有创建该信号量
OS_ERR_EVENT_TYPE OSEventType类型不匹配
OS_NO_ERR 成功
OS_TIMEOUT 超时
页:
[1]