这样的情况,该如何设置信号量?
<br /><br />假设有任务TaskDisplay,TaskMain,两任务共享变量LedState。<br />任务TaskDisplay根据LedState令某LED闪亮,周期1秒。<br />任务TaskMain根据设备的环境动态的改变LedState。<br /><br />请问,这种情况下应该设置几个信号量,两个任务的优先级如何安排?<br />TaskDisplay采用那个时间函数实现"周期延时"?<br /><br />很简单的题目,越想越糊涂了。<br /><br /><br />我现在是这么想的,但是有问题。
我现在是这么想的,但是有问题。<br /><br /><br />设置一个信号量SemLED,TaskDisplay优先级高于TaskMain<br /><br />TaskDisplay的伪代码<br />while(1)<br />{<br /> OS_SemPend(SemLED, OS_TICKS_PER_SECOND/2, &err);<br /> 访问和设置LedState;<br /> 开或关LED;<br />}<br /><br />TaskMain的伪代码<br />while(1)<br />{<br /> OS_SemPend(SemLED, 0, &err);<br /> 访问和设置LedState;<br />}<br /><br />这样的话,如果TaskMain正在执行,而TaskDisplay恰好等待超时,这个时候由于TaskDisplay优先级比TaskMain高,系统切向TaskDisplay,就可能会出现问题。<br /><br /><br /><br /><br /><br /><br /><br /><br />while(1)
while(1)<br />{<br /> OS_SemPend(SemLED, OS_TICKS_PER_SECOND/2, &err);<br /> 访问和设置LedState;<br /> 开或关LED;<br /> OS_SemPend(SemLED, 0, &err);<br />}<br /><br />TaskMain的伪代码<br />while(1)<br />{<br /> OS_SemPend(SemLED, 0, &err);<br /> 访问和设置LedState;<br /> OS_SemPend(SemLED, 0, &err);<br />}<br />这样可可否 怎么都是OS_SemPend
用信号量保护全局变量也可以。不过你这里不用也行1
这样?<br />OS_EVENT LED_CHANGE_SEM //LED状态改变sem<br />OS_EVENT STATE_OWN_SEM //led_state变量占用互斥sem<br /><br />TaskMain的伪代码<br />while(1)<br />{<br /> OSSemPend(STATE_OWN_SEM, OS_TICKS_PER_SECOND/2, &err); //申请使用state_led权限<br /> 访问和设置LedState;<br /> OSSemPost(STATE_OWN_SEM);//释放使用state_led权限<br /> OSSemPost(LED_CHANGE_SEM);//发送state_led改变信号<br /> <br />}<br /><br />TaskDisplay的伪代码<br />while(1)<br />{<br /> OSSemPend(LED_CHANGE_SEM, OS_TICKS_PER_SECOND/2, &err);//等待state_led改变信号<br /> OSSemPend(STATE_OWN_SEM, OS_TICKS_PER_SECOND/2, &err); //申请使用state_led权限<br /> 访问和设置LedState;<br /> 开或关LED;<br /> OSSemPost(STATE_OWN_SEM);//释放使用state_led权限<br />}这里好像没有必要使用信号量
两个任务使用同一个变量,一个是读,另一个是写,没有冲突,所以没有必要使用信号量。呵呵
他是在学习信号量的使用,不是做产品。
页:
[1]