3520|6

78

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

UC/OSII菜鸟求助一个问题。 [复制链接]

 
我初学UC/OSII  练习使用信号量。看不懂下面的程序怎么实现每隔2S亮或者灭的。

我的理解是这样的,不知道对不对;
taskLed  首先发送信号量,然后进入  OSTimeDly 接着任务调度,执行  task1,因为已经发送了信号量,所以 信号量计数器(.OSEventCnt =1;所以在执行完第一个“OSSemPend (AckSem, 0, &err);”OSEventCnt =0,并点亮LED,第二个OSSemPend (AckSem, 0, &err)只能继续等。好像是在OSSemPend (AckSem, 0, &err)进行任务 调度又回到 taskLed  。
理解的很浅。请大家给解释解释。不胜感激。
/*********************************************************************************************************
** Function name:           taskLed    优先级为2
** Descriptions:            每隔2S发送一次信号量
** input parameters:        *pdata
** output parameters:       无      
** Returned value:          无  
*********************************************************************************************************/

static void taskLed (void  *parg)
{
    (void)parg;

while (1) 
{   
OSSemPost (AckSem);
OSTimeDly(OS_TICKS_PER_SEC*2);
    }
}
/*********************************************************************************************************
** Function name:           task1    优先级为3
** Descriptions:            接收信号量并控制LED的亮灭
** input parameters:        *pdata
** output parameters:       无      
** Returned value:          无  
*********************************************************************************************************/
static  void  task1 (void *pdata)
{
    INT8U err; 
    pdata = pdata;
    while (1) 
    {
 
OSSemPend (AckSem, 0, &err); //等待信号量
ledOn(1);           // 点亮LED1          
OSSemPend (AckSem, 0, &err);              
ledOff(1);           // 关闭LED1          
   }
}

最新回复

OSSemPend (AckSem, 0, &err);//获得信号量后,点亮LED1 ledOn(1);          // 点亮LED1          OSSemPend (AckSem, 0, &err);   //到了这里,本任务处于挂起状态,等待信号量,可以认为它阻塞了,任务中断,发送信号量的的函数里面有延时(造成了LED点亮延时),这个延时过后,发送信号量            ledOff(1);          // 关闭LED1  详情 回复 发表于 2012-7-5 22:11

点评

TASK_LED第一次释放信号量后由于等待延时的原因产生任务切换,系统运行TASK1。TASK1执行至第二次等待信号之时进入等待状态,产生任务切换。注意:由于此时TASK_LED尚在等待延时结束而且你并没有其他任务,因此系统进  详情 回复 发表于 2012-6-27 15:02
呵呵,楼主,信号量也就是变量的置位和取消而已,和你自己定义一个标志量一样。 OSSemPend (AckSem, 0, &err);//等待信号量 这个语句,如果检测不到信号量,是会无限期的等待的。任务不会挂起,但是任务调度是可  详情 回复 发表于 2012-6-27 08:59
点赞 关注
 

回复
举报

7228

帖子

192

TA的资源

五彩晶圆(高级)

沙发
 
OSSemPost (AckSem);
OSTimeDly(OS_TICKS_PER_SEC*2);
-----
Acksem 这个名字取得怎么有点像应答信号
第一个OSSempend接到信号量后
第2个OSSempend要继续等待的
所以是隔2S
初学
不一定对
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
谢谢  常见泽1
我还不太明白, 第一个OSSempend接到信号量后点亮LED,第二个继续等待信号量,这时会发生任务调度吗?为什么在发送信号量的时候程序不是在task1中的
 while (1) 
 {
 
       OSSemPend (AckSem, 0, &err);//等待信号量
       ledOn(1);          // 点亮LED1          
       OSSemPend (AckSem, 0, &err);              
       ledOff(1);          // 关闭LED1          
}
红色字体重新开始运行。对uc/osii的运行机制还很模糊。
 
 
 

回复

104

帖子

0

TA的资源

一粒金砂(高级)

4
 

回复 楼主 fendou 的帖子

呵呵,楼主,信号量也就是变量的置位和取消而已,和你自己定义一个标志量一样。

OSSemPend (AckSem, 0, &err);//等待信号量
这个语句,如果检测不到信号量,是会无限期的等待的。任务不会挂起,但是任务调度是可定发生的。

对于“为什么在发送信号量的时候程序不是在task1中的”,可能是你的测试的方法或者理解不对吧
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 楼主 fendou 的帖子

TASK_LED第一次释放信号量后由于等待延时的原因产生任务切换,系统运行TASK1。TASK1执行至第二次等待信号之时进入等待状态,产生任务切换。注意:由于此时TASK_LED尚在等待延时结束而且你并没有其他任务,因此系统进入统计任务或空闲任务,直至2S的延时结束系统自动切换到TASK_LED。TASK_LED第二次释放信号量,随后等待2S延时结束。任务切换,系统运行TASK1,关闭LED。。。。。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(高级)

6
 
谢谢大家的指点,我已经明白了。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

7
 
OSSemPend (AckSem, 0, &err);//获得信号量后,点亮LED1

ledOn(1);          // 点亮LED1         

OSSemPend (AckSem, 0, &err);   //到了这里,本任务处于挂起状态,等待信号量,可以认为它阻塞了,任务中断,发送信号量的的函数里面有延时(造成了LED点亮延时),这个延时过后,发送信号量           

ledOff(1);          // 关闭LED1
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表