OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5300|回复: 5

ucosii io检测高低电平无法实现实时性的问题

[复制链接]

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2019-6-3
在线时间
17 小时
发表于 2019-8-13 11:25:40 | 显示全部楼层 |阅读模式
3金钱
任务:ucosII,检测IO口状态,处理相应的动作问题,要求检测到低电平,蜂鸣器就响三秒,停二秒,没有检测到就不响,          如果检测到低电平三秒内,突然电平变为高电平,那么要求蜂鸣器立即停止报警

用软件定时器的方法实现应该比较简单,现在用两个任务的形式来做不知如何实现,现写了代码如下

#define BEEP_TASK_PRIO                         10
#define PowerCheck_TASK_PRIO               9

  sem_p=OSSemCreate(0);

//PowerCheck任务
void PowerCheck_task(void *pdata)
{        
        (void)pdata;
        
        while(1)
        {
                if(GPIO_ReadInputDataBit(BEEP_PORT,PG)==0)
                {
                        OSSemPost(sem_p);
                }
                OSTimeDlyHMSM(0,0,1,0);//1s执行一次
        }
}

//BEEP任务
void beep_task(void *pdata)
{        
        INT8U err;
        
        (void)pdata;
        
        while(1)
        {
                OSSemPend(sem_p,0,&err);
                BEEP_ON();
                OSTimeDlyHMSM(0,0,3,0);//1s执行一次
                BEEP_OFF();
                OSTimeDlyHMSM(0,0,2,0);//1s执行一次
                }

        }

现在碰到两个问题
1.用信号量方式,检测到低电平的情况下,那么信号量会一直加上去,就算变成了高电平,那么只有在信号量减为0的时候才会停止
2.检测到低电平了,一秒后变成高电平了,但是蜂鸣器还是会完成它自己的任务,没法做到实时

请各位指教理解上的问题!

最佳答案

查看完整内容[请看2#楼]

//PowerCheck任务 void PowerCheck_task(void *pdata) { (void)pdata; unsigned char x,y; while(1) { if(GPIO_ReadInputDataBit(BEEP_PORT,PG)!=x) { x=GPIO_ReadInputDataBit(BEEP_PORT,PG); y=0; } else { if(y==10)//祛抖10个节拍 { ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2019-8-13 11:25:41 | 显示全部楼层
本帖最后由 TinyBoy 于 2019-9-2 11:18 编辑

//PowerCheck任务
void PowerCheck_task(void *pdata)
{        
        (void)pdata;
         unsigned char x,y;
        while(1)
        {

if(GPIO_ReadInputDataBit(BEEP_PORT,PG)!=x)
                {

                        x=GPIO_ReadInputDataBit(BEEP_PORT,PG);
y=0;               

                        
                }
else
{
                if(y==10)//祛抖10个节拍
{        
                if(x==0)
                OSSemPost(sem_p);
}
}
if(y<255)y++;
                OSTimeDlyHMSM(0,0,0,1);//1个节拍扫描一次任务
        }
}
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2019-8-13 16:42:54 | 显示全部楼层
sem_p=OSSemCreate(1);   //创建信号量: 1---可用;0---不可用
回复

使用道具 举报

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2019-6-3
在线时间
17 小时
 楼主| 发表于 2019-8-14 19:54:35 | 显示全部楼层
xfcjava3 发表于 2019-8-13 16:42
sem_p=OSSemCreate(1);   //创建信号量: 1---可用;0---不可用

2.检测到低电平了,一秒后变成高电平了,但是蜂鸣器还是会完成它自己的任务,没法做到实时

这个问题怎么解决或者解释或者根本就是方法不对


回复

使用道具 举报

8

主题

185

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-15
在线时间
47 小时
发表于 2019-8-28 14:25:52 | 显示全部楼层
楼主解决完毕这个问题了吗???
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2019-9-2 11:15:53 | 显示全部楼层
//PowerCheck任务把时间设置成1S就不对了,你思路就不对,检测到信号后,你还要做下处理,保证只触发一次,变高后再变低再触发:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表