OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7881|回复: 9

消息邮箱有点理解不出来,请求帮助

[复制链接]

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2012-10-18
在线时间
0 小时
发表于 2012-10-24 12:05:32 | 显示全部楼层 |阅读模式
消息邮箱的例程里面:
//蜂鸣器任务 
void beep_task(void *pdata) 
  u8 err; 
  while(1) 
  { 
    OSSemPend(sem_beep,0,&err);        // 
    BEEP=1;delay_ms(60); 
    BEEP=0;delay_ms(940);     
  }                     
}

想问个当没有消息信号时就一直在那等待而不会执行下面的那四句,那程序不会一直死在这里吗?但烧写进单片机还是会执行别的任务...他是怎么跳出这个while的呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

148

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2012-7-25
在线时间
0 小时
发表于 2012-10-24 12:34:35 | 显示全部楼层
回复【楼主位】晓宇_2012:
---------------------------------
ucos中,你说的这个while是永远不能退出的,beep_task可以被永远挂起不再执行(任务删除)。

OSSemPend,收不到消息,这个while会被挂起,执行其他任务(也是一个while)。

这个就是靠任务调度实现的。
回复 支持 反对

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2012-10-18
在线时间
0 小时
 楼主| 发表于 2012-10-24 13:44:59 | 显示全部楼层
回复【2楼】maninman1981:
回复【楼主位】晓宇_2012:
---------------------------------
ucos中,你说的这个while是永远不能退出的,beep_task可以被永远挂起不再执行(任务删除)。
OSSemPend,收不到消息,这个while会被挂起,执行其他任务(也是一个while)。
这个就是靠任务调度实现的。
---------------------------------
嗯,谢谢你的细心回复,不过还有点疑惑:不能跳出while这个我知道,但一般的任务都是通过while里面的延时函数让出cpu 控制权,并进行任务调度,执行另外一个任务,而上面我列举的:没有信号量是就在那里等待,那就不会执行后面的delay_ms(60)咯?那也就不会让出cpu控制权咯?-------不知我的理解对不对
回复 支持 反对

使用道具 举报

27

主题

148

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2012-7-25
在线时间
0 小时
发表于 2012-10-24 14:14:23 | 显示全部楼层
ucos里粗略延时,用OSTimeDly。
你理解的可以了。
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2012-10-24 14:14:57 | 显示全部楼层

回复【3楼】 晓宇_2012 :
---------------------------------
一切所谓的让出cpu控制权都是调度引发的。
所以只要会发起调度,就有可能让出cpu控制权。

OSSemPend函数体里面是有调度的。。。。。

void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
    OS_CPU_SR  cpu_sr;
#endif   


    if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
        *err = OS_ERR_PEND_ISR;                       /* ... can't PEND from an ISR                    */
        return;
    }
#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
        *err = OS_ERR_PEVENT_NULL;
        return;
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
        *err = OS_ERR_EVENT_TYPE;
        return;
    }
#endif
    OS_ENTER_CRITICAL();
    if (pevent->OSEventCnt > 0) {                     /* If sem. is positive, resource available ...   */
        pevent->OSEventCnt--;                         /* ... decrement semaphore only if positive.     */
        OS_EXIT_CRITICAL();
        *err = OS_NO_ERR;
        return;
    }
                                                      /* Otherwise, must wait until event occurs       */
    OSTCBCur->OSTCBStat |= OS_STAT_SEM;               /* Resource not available, pend on semaphore     */
    OSTCBCur->OSTCBDly   = timeout;                   /* Store pend timeout in TCB                     */
    OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
    OS_EXIT_CRITICAL();
    OS_Sched();                                       /* Find next highest priority task ready         */
    OS_ENTER_CRITICAL();
    if (OSTCBCur->OSTCBStat & OS_STAT_SEM) {          /* Must have timed out if still waiting for event*/
        OS_EventTO(pevent);
        OS_EXIT_CRITICAL();
        *err = OS_TIMEOUT;                            /* Indicate that didn't get event within TO      */
        return;
    }
    OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
    OS_EXIT_CRITICAL();
    *err = OS_NO_ERR;
}

我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2012-10-18
在线时间
0 小时
 楼主| 发表于 2012-10-24 17:13:08 | 显示全部楼层

回复【5楼】Admin:
 回复【3楼】晓宇_2012:
---------------------------------
一切所谓的让出cpu控制权都是调度引发的。
所以只要会发起调度,就有可能让出cpu控制权。
OSSemPend函数体里面是有调度的。。。。。
void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
    OS_CPU_SR  cpu_sr;
#endif    
    if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
        *err = OS_ERR_PEND_ISR;                       /* ... ca
......
---------------------------------
哦,,这下明白了....谢谢了,原来OSSemPend里面就有任务调度
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2012-10-24 18:14:36 | 显示全部楼层

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


    if (ticks > 0) {                                                      /* 0 means no delay!         */
        OS_ENTER_CRITICAL();
        if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {  /* Delay current task        */
            OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
        }
        OSTCBCur->OSTCBDly = ticks;                                       /* Load ticks in TCB         */
        OS_EXIT_CRITICAL();
        OS_Sched();                                                       /* Find next task to run!    */
    }
}


OSTimeDly()里面也有调度。。。就是这个道理

我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
883
金钱
883
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-10-24 18:17:14 | 显示全部楼层
回复【6楼】晓宇_2012:
---------------------------------

void beep_task(void *pdata) 

  u8 err; 
  while(1) 
  { 
    OSSemPend(sem_beep,0,&err);        // ?
    BEEP=1;delay_ms(60); 
    BEEP=0;delay_ms(940);     
  }               
这样理解错误的。。
1.不管你任务多少,如果这个任务一直等待消息邮箱,那么这个任务就挂起了,就绪表就没有这个任务的优先级,其他任务会执行的。
2.因为等待消息邮箱只引发一次调度而已。
3.每个时钟节拍都会调度一次的。。我通常设置1KHZ。。这个看你CPU了。。
很喜爱电子行业
回复 支持 反对

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2012-10-18
在线时间
0 小时
 楼主| 发表于 2012-10-24 22:47:50 | 显示全部楼层
回复【8楼】冰是睡着的水:
---------------------------------
哦,谢谢,理解当中.....我的stm32f103,如果设为1KHZ会不会太快啊?
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
883
金钱
883
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-10-24 23:03:01 | 显示全部楼层
回复【9楼】晓宇_2012:
---------------------------------
能够跑的起来就OK了。。103没有压力。。
很喜爱电子行业
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 16:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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