初级会员

- 积分
- 62
- 金钱
- 62
- 注册时间
- 2019-6-3
- 在线时间
- 17 小时
|
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个节拍
{ ...
|