这样的情况,该如何设置信号量?

[复制链接]
 楼主| xlander 发表于 2007-12-10 15:14 | 显示全部楼层 |阅读模式


假设有任务TaskDisplay,TaskMain,两任务共享变量LedState。
任务TaskDisplay根据LedState令某LED闪亮,周期1秒。
任务TaskMain根据设备的环境动态的改变LedState。

请问,这种情况下应该设置几个信号量,两个任务的优先级如何安排?
TaskDisplay采用那个时间函数实现"周期延时"?

很简单的题目,越想越糊涂了。


 楼主| xlander 发表于 2007-12-10 15:24 | 显示全部楼层

我现在是这么想的,但是有问题。

我现在是这么想的,但是有问题。


设置一个信号量SemLED,TaskDisplay优先级高于TaskMain

TaskDisplay的伪代码
while(1)
{
  OS_SemPend(SemLED, OS_TICKS_PER_SECOND/2, &err);
  访问和设置LedState;
  开或关LED;
}

TaskMain的伪代码
while(1)
{
  OS_SemPend(SemLED, 0, &err);
  访问和设置LedState;
}

这样的话,如果TaskMain正在执行,而TaskDisplay恰好等待超时,这个时候由于TaskDisplay优先级比TaskMain高,系统切向TaskDisplay,就可能会出现问题。








xddzccn 发表于 2007-12-20 21:36 | 显示全部楼层

while(1)

while(1)
{
  OS_SemPend(SemLED, OS_TICKS_PER_SECOND/2, &err);
  访问和设置LedState;
  开或关LED;
   OS_SemPend(SemLED, 0, &err);
}

TaskMain的伪代码
while(1)
{
  OS_SemPend(SemLED, 0, &err);
  访问和设置LedState;
  OS_SemPend(SemLED, 0, &err);
}
这样可可否 
gouki_s 发表于 2007-12-21 08:53 | 显示全部楼层

怎么都是OS_SemPend

用信号量保护全局变量也可以。不过你这里不用也行
sufeng983 发表于 2007-12-25 11:49 | 显示全部楼层

1

这样?
OS_EVENT LED_CHANGE_SEM   //LED状态改变sem
OS_EVENT STATE_OWN_SEM    //led_state变量占用互斥sem

TaskMain的伪代码
while(1)
{
  OSSemPend(STATE_OWN_SEM, OS_TICKS_PER_SECOND/2, &err); //申请使用state_led权限
  访问和设置LedState;
  OSSemPost(STATE_OWN_SEM);//释放使用state_led权限
  OSSemPost(LED_CHANGE_SEM);//发送state_led改变信号
 
}

TaskDisplay的伪代码
while(1)
{
  OSSemPend(LED_CHANGE_SEM, OS_TICKS_PER_SECOND/2, &err);//等待state_led改变信号
  OSSemPend(STATE_OWN_SEM, OS_TICKS_PER_SECOND/2, &err); //申请使用state_led权限
  访问和设置LedState;
  开或关LED;
  OSSemPost(STATE_OWN_SEM);//释放使用state_led权限
}
平常人 发表于 2007-12-25 20:45 | 显示全部楼层

这里好像没有必要使用信号量

两个任务使用同一个变量,一个是读,另一个是写,没有冲突,所以没有必要使用信号量。
sufeng983 发表于 2007-12-26 17:12 | 显示全部楼层

呵呵

他是在学习信号量的使用,不是做产品。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

165

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

65

主题

165

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部