xlander 发表于 2007-12-10 15:14

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

<br /><br />假设有任务TaskDisplay,TaskMain,两任务共享变量LedState。<br />任务TaskDisplay根据LedState令某LED闪亮,周期1秒。<br />任务TaskMain根据设备的环境动态的改变LedState。<br /><br />请问,这种情况下应该设置几个信号量,两个任务的优先级如何安排?<br />TaskDisplay采用那个时间函数实现&quot;周期延时&quot;?<br /><br />很简单的题目,越想越糊涂了。<br /><br /><br />

xlander 发表于 2007-12-10 15:24

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

我现在是这么想的,但是有问题。<br /><br /><br />设置一个信号量SemLED,TaskDisplay优先级高于TaskMain<br /><br />TaskDisplay的伪代码<br />while(1)<br />{<br />&nbsp;&nbsp;OS_SemPend(SemLED,&nbsp;OS_TICKS_PER_SECOND/2,&nbsp;&err);<br />&nbsp;&nbsp;访问和设置LedState;<br />&nbsp;&nbsp;开或关LED;<br />}<br /><br />TaskMain的伪代码<br />while(1)<br />{<br />&nbsp;&nbsp;OS_SemPend(SemLED,&nbsp;0,&nbsp;&err);<br />&nbsp;&nbsp;访问和设置LedState;<br />}<br /><br />这样的话,如果TaskMain正在执行,而TaskDisplay恰好等待超时,这个时候由于TaskDisplay优先级比TaskMain高,系统切向TaskDisplay,就可能会出现问题。<br /><br /><br /><br /><br /><br /><br /><br /><br />

xddzccn 发表于 2007-12-20 21:36

while(1)

while(1)<br />{<br />&nbsp;&nbsp;OS_SemPend(SemLED,&nbsp;OS_TICKS_PER_SECOND/2,&nbsp;&err);<br />&nbsp;&nbsp;访问和设置LedState;<br />&nbsp;&nbsp;开或关LED;<br />&nbsp;&nbsp;&nbsp;OS_SemPend(SemLED,&nbsp;0,&nbsp;&err);<br />}<br /><br />TaskMain的伪代码<br />while(1)<br />{<br />&nbsp;&nbsp;OS_SemPend(SemLED,&nbsp;0,&nbsp;&err);<br />&nbsp;&nbsp;访问和设置LedState;<br />&nbsp;&nbsp;OS_SemPend(SemLED,&nbsp;0,&nbsp;&err);<br />}<br />这样可可否&nbsp;

gouki_s 发表于 2007-12-21 08:53

怎么都是OS_SemPend

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

sufeng983 发表于 2007-12-25 11:49

1

这样?<br />OS_EVENT&nbsp;LED_CHANGE_SEM&nbsp;&nbsp;&nbsp;//LED状态改变sem<br />OS_EVENT&nbsp;STATE_OWN_SEM&nbsp;&nbsp;&nbsp;&nbsp;//led_state变量占用互斥sem<br /><br />TaskMain的伪代码<br />while(1)<br />{<br />&nbsp;&nbsp;OSSemPend(STATE_OWN_SEM,&nbsp;OS_TICKS_PER_SECOND/2,&nbsp;&err);&nbsp;//申请使用state_led权限<br />&nbsp;&nbsp;访问和设置LedState;<br />&nbsp;&nbsp;OSSemPost(STATE_OWN_SEM);//释放使用state_led权限<br />&nbsp;&nbsp;OSSemPost(LED_CHANGE_SEM);//发送state_led改变信号<br />&nbsp;<br />}<br /><br />TaskDisplay的伪代码<br />while(1)<br />{<br />&nbsp;&nbsp;OSSemPend(LED_CHANGE_SEM,&nbsp;OS_TICKS_PER_SECOND/2,&nbsp;&err);//等待state_led改变信号<br />&nbsp;&nbsp;OSSemPend(STATE_OWN_SEM,&nbsp;OS_TICKS_PER_SECOND/2,&nbsp;&err);&nbsp;//申请使用state_led权限<br />&nbsp;&nbsp;访问和设置LedState;<br />&nbsp;&nbsp;开或关LED;<br />&nbsp;&nbsp;OSSemPost(STATE_OWN_SEM);//释放使用state_led权限<br />}

平常人 发表于 2007-12-25 20:45

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

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

sufeng983 发表于 2007-12-26 17:12

呵呵

他是在学习信号量的使用,不是做产品。
页: [1]
查看完整版本: 这样的情况,该如何设置信号量?