打印

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

[复制链接]
1613|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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

用信号量保护全局变量也可以。不过你这里不用也行

使用特权

评论回复
5
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权限
}

使用特权

评论回复
6
平常人| | 2007-12-25 20:45 | 只看该作者

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

两个任务使用同一个变量,一个是读,另一个是写,没有冲突,所以没有必要使用信号量。

使用特权

评论回复
7
sufeng983| | 2007-12-26 17:12 | 只看该作者

呵呵

他是在学习信号量的使用,不是做产品。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

165

帖子

0

粉丝