两个任务 同步 。信号量。UCOS。如何才比较合理。
A任务和B任务A任务周期性执行,为采样任务,当检测到超过某个数值时触发B任务。
B任务受A任务触发,B任务执行时A任务不许执行。
设计一个信号量:sem
A任务如下:
while(1){
pend(sem);等待B任务执行完后B任务发送信号量
采样;
判断采样值是否大于预定数值,如果大于,则post(sem),发送信号量;
延时;}
B任务如下:
while(1){
pend(sem);等待A任务采样值大于预定数值时发出的sem
执行程序;
post(sem);执行完发送信号量,通知A任务可以继续执行;
延时;
}
一开始两个任务都在等信号量,主程序里先发送一个信号量,A的优先级高,A先运行,A运行一次如果没有采样到超过预定的值,那么就触发不了B任务,那也就再也没哪个任务post 一个sem,导致A,B都运行不了。
如果改成:
A任务如下:
while(1){
采样;
判断采样值是否大于预定数值,如果大于,则post(sem),发送信号量;
延时;}
B任务如下:
while(1){
pend(sem);等待A任务采样值大于预定数值时发出的sem
执行程序;
延时;
}
A在不断的采样,在B任务运行的时候也在采样,不符合要求,A必须要受到B的控制。
这两个任务用什么方式同步? A运行一次如果没有采样到超过预定的值,那么就触发不了B任务
修改为:A运行一次如果没有采样到超过预定的值,给自已再发一个信号量就可以了 这种情况,貌似一个信号量解决不了问题 直接定义2个全局标志貌似更加方便。 再加1个任务c
A任务 ,B任务,C任务
A任务周期性执行,为采样任务,当检测到超过某个数值时触发B任务。
B任务受A任务触发,B任务执行时A任务不许执行。
C任务是周期性任务,C和B不能同时运行。
也就是B运行时,A,C两个周期性任务都不允许运行。B任务运行的条件是A任务检测到某个值。 用任务挂起函数实现了。 pend不是有超时功能吗? mark 设计2个信号量:sem1,sem2,信号量初始值都为0;
A任务如下:
while(1)
{
采样;
判断采样值是否大于预定数值;
如果大于,则post(sem2),发送信号量2;然后pend(sem1);等待信号量1有效;
}
B任务如下:
while(1)
{
pend(sem2);等待A任务采样值大于预定数值时发出的sem2;
执行程序;
post(sem1); 执行完发送信号量1,通知A任务可以继续执行;
} 1个信号量能解决的往往是"互斥"问题,2个信号能解决的往往是"同步"问题。 如果B的优先级比A高,B执行时A就不会执行了 一个简单的问题,可以看到有不同的解决办法,同时也反映出技术功底的不同。
页:
[1]