yifengzhineng 发表于 2012-1-7 16:51:28

两个任务 同步 。信号量。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的控制。


这两个任务用什么方式同步?

xjjiang 发表于 2012-1-7 17:31:39

A运行一次如果没有采样到超过预定的值,那么就触发不了B任务

修改为:A运行一次如果没有采样到超过预定的值,给自已再发一个信号量就可以了

yifengzhineng 发表于 2012-1-7 17:56:00

这种情况,貌似一个信号量解决不了问题

yifengzhineng 发表于 2012-1-7 17:57:08

直接定义2个全局标志貌似更加方便。

yifengzhineng 发表于 2012-1-7 19:28:07

再加1个任务c
A任务 ,B任务,C任务
A任务周期性执行,为采样任务,当检测到超过某个数值时触发B任务。
B任务受A任务触发,B任务执行时A任务不许执行。
C任务是周期性任务,C和B不能同时运行。

也就是B运行时,A,C两个周期性任务都不允许运行。B任务运行的条件是A任务检测到某个值。

yifengzhineng 发表于 2012-1-7 19:57:22

用任务挂起函数实现了。

i55x 发表于 2012-1-7 20:55:42

pend不是有超时功能吗?

Helloeveryon 发表于 2012-1-7 21:51:03

mark

2005xxg 发表于 2012-1-10 11:25:10

设计2个信号量:sem1,sem2,信号量初始值都为0;
A任务如下:
while(1)
{
    采样;
    判断采样值是否大于预定数值;
    如果大于,则post(sem2),发送信号量2;然后pend(sem1);等待信号量1有效;
   
}

B任务如下:
while(1)
{
    pend(sem2);等待A任务采样值大于预定数值时发出的sem2;
    执行程序;
    post(sem1); 执行完发送信号量1,通知A任务可以继续执行;
}

2005xxg 发表于 2012-1-10 11:27:58

1个信号量能解决的往往是"互斥"问题,2个信号能解决的往往是"同步"问题。

s200661524 发表于 2012-1-10 12:10:38

如果B的优先级比A高,B执行时A就不会执行了

2005xxg 发表于 2012-1-10 12:18:42

一个简单的问题,可以看到有不同的解决办法,同时也反映出技术功底的不同。
页: [1]
查看完整版本: 两个任务 同步 。信号量。UCOS。如何才比较合理。