搜索
bottom↓
回复: 2

请教个ucos3中OSSemPost的问题?

[复制链接]

出0入0汤圆

发表于 2013-5-7 16:54:00 | 显示全部楼层 |阅读模式
本帖最后由 hbchf 于 2013-5-7 16:57 编辑

先上代码:
  1. void StartTask(void)
  2. {
  3.   OS_ERR err;
  4.   Param_init();
  5.   SysTickInit();       
  6.        
  7.   //定义信号量 -有卡标识
  8. OSSemCreate(        (OS_SEM         *)&Cardflage,
  9.                                         (CPU_CHAR         *)"detection card ok",
  10.                                         (OS_SEM_CTR)1,
  11.                                         (OS_ERR         *)err);[/align]
  12.        
  13. OSTaskCreate(        (OS_TCB         *)&LCD_TCB,
  14.                                         (CPU_CHAR         *)"LCD_task",
  15.                                         (OS_TASK_PTR)LCDTCB,
  16.                                         (void                 *)0,
  17.                                         (OS_PRIO         )LCD_PRIO,
  18.                                         (CPU_STK        *)&LCD_stk[0],
  19.                                         (CPU_STK_SIZE)LCD_STK_SIZE / 10,
  20.                                         (CPU_STK_SIZE)LCD_STK_SIZE,
  21.                                         (OS_MSG_QTY        )0,
  22.                                         (OS_TICK        )0,
  23.                                         (void                *)0,
  24.                                         (OS_OPT                )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  25.                                         (OS_ERR                *)&err);
  26.        
  27. OSTaskCreate(        (OS_TCB         *)&DecteCard_TCB,
  28.                                         (CPU_CHAR         *)"user card task",
  29.                                         (OS_TASK_PTR)Task_DecteCard,
  30.                                         (void                 *)0,
  31.                                         (OS_PRIO        ) DecteCard_PRIO,
  32.                                         (CPU_STK        *)&DecteCard_stk[0],
  33.                                         (CPU_STK_SIZE)DecteCard_STK_SIZE / 10,
  34.                                         (CPU_STK_SIZE)DecteCard_STK_SIZE,
  35.                                         (OS_MSG_QTY)0,
  36.                                         (OS_TICK        )0,
  37.                                         (void                *)0,
  38.                                         (OS_OPT                )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  39.                                         (OS_ERR                *)&err);       

  40.                                        
  41. OSTaskCreate(        (OS_TCB         *)&AntennaTCB,                          //定时复位天线
  42.                                         (CPU_CHAR         *)"turn on/off antenna",
  43.                                         (OS_TASK_PTR)Task_on_off_antenna,
  44.                                         (void                 *)0,
  45.                                         (OS_PRIO        )Antenna_PRIO,
  46.                                         (CPU_STK        *)&Antenna_stk[0],
  47.                                         (CPU_STK_SIZE)Antenna_STK_SIZE / 10,
  48.                                         (CPU_STK_SIZE)Antenna_STK_SIZE,
  49.                                         (OS_MSG_QTY)0,
  50.                                         (OS_TICK        )0,
  51.                                         (void                *)0,
  52.                                         (OS_OPT                )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  53.                                         (OS_ERR                *)&err);
  54.        
  55.         //删除任务
  56. OSTaskDel(                (OS_TCB         *)&taskStartTCB,
  57.                                         (OS_ERR         *)&err);
  58.        
  59.                                
  60. }
复制代码
  1. static void Task_on_off_antenna(void *p_arg)
  2. {
  3.         OS_ERR err;
  4.         static uchar m ;
  5.         static uchar ch,n =0;
  6.        static uchar buf[10];

  7.         while (1)
  8.         {
  9.                 OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_HMSM_STRICT,&err);
  10.                 FM1715_CloseRF();
  11.                 OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_HMSM_STRICT,&err);
  12.                 FM1715_OpenRF();       
  13.                 OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err);
  14.                  memset(buf,0,sizeof(buf));
  15.                 ch = mcml_request(buf);
  16.                if(ch == FM1715_OK)   
  17.                   {

  18.                         OSSemPost(&Cardflage,
  19.                                         OS_OPT_POST_ALL,
  20.                                         &err);
  21.                                 n = 2;
  22.                                m = n ;
  23.                  }   
  24.    
  25.         }
  26. }
  27. static void Task_DecteCard(void *p_arg)
  28. {
  29.         OS_ERR err;
  30.         CPU_TS ts;
  31.         static uchar n,m = 0;
  32.        
  33.         while (1)
  34.         {
  35.                 OSSemPend(&Cardflage,
  36.                                   0,
  37.                                  OS_OPT_PEND_BLOCKING,
  38.                                  &ts,
  39.                                 &err);
  40.                                n = m++;
  41.                                          
  42.         }
  43. }
复制代码
在单步调试的过程中,程序进入到了函数Task_on_off_antenna中的OSSemPost执行完后;任务Task_DecteCard一直挂着怎么就进不了这个任务了?新手上路多多指教!

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

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

出0入0汤圆

 楼主| 发表于 2013-5-7 16:59:35 | 显示全部楼层
我的理解任务Task_on_off_antenna中的OSSemPost执行完后,任务切换到Task_DecteCard的时候,此时OSSemPend(&Cardflage)满足条件,会执行该任务下面的L42行的?是这样理解的吗?

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 09:25

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

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