OpenEdv-开源电子网

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

主循环处理时间有点长,导致按键响应不灵敏

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-1-6
在线时间
7 小时
发表于 2017-1-6 14:00:28 | 显示全部楼层 |阅读模式
1金钱
我用SHT10检测温湿度、MQ-2检测烟雾,GPS定位,GSM发送短信。现在我主要加了3个按键进去,就是测试各个模块功能,能不能实现。但是在测试过程中,发现有时按键按下去没有反应,我分析主要原因是:循环中处理模块信息时间太长,导致有时候按键检测到,但是主循环还在处理其他事情。就导致这次的按键失效,就是丢键。不知道有没有大神,能给个思路,怎么及时处理按键响应。才学STM32 的2个月,如果觉得问题问的有点傻,莫怪!!!

最佳答案

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

程序中不要出现delay死等,是裸机实现多任务的关键。 RTOS也不是万能的,只能说是简化了程序的设计,我们还是要学习RTOS的设计思想,说说我的理解吧,可能不对,你随便看一下。 其实RTOS和裸机的区别,无非就是在任务调度上,RTOS是一个模板,用户划分好任务,直接套在里面,就可以了(但是如何合理的划分任务,仍然是一个难题),因为RTOS每一个任务都有一个虚拟堆栈用来保存当前任务的环境,所以任务就可以从当前的函数 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-1-6 14:00:29 | 显示全部楼层
本帖最后由 东北小辉辉 于 2017-1-6 14:57 编辑
菜鸟2770 发表于 2017-1-6 14:41
看来还是学的太少,一直裸奔到现在,要去看看UCOS了,谢谢指教

程序中不要出现delay死等,是裸机实现多任务的关键。

RTOS也不是万能的,只能说是简化了程序的设计,我们还是要学习RTOS的设计思想,说说我的理解吧,可能不对,你随便看一下。

其实RTOS和裸机的区别,无非就是在任务调度上,RTOS是一个模板,用户划分好任务,直接套在里面,就可以了(但是如何合理的划分任务,仍然是一个难题),因为RTOS每一个任务都有一个虚拟堆栈用来保存当前任务的环境,所以任务就可以从当前的函数中跳出。
裸机的话,由于是共享堆栈,任务一旦进入一个函数就要运行完,所以就要把每个任务分的很细,不能有长时间的延时,遇到大的任务,要把它切碎。

剩下的进程间通信,信号,消息什么的,其实是裸机和OS都有的,比如,裸机一样要注意保护共享资源,临界区什么的,否则,程序一样会出问题。

这方面我也是初学者,希望共同学习。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-1-6
在线时间
7 小时
 楼主| 发表于 2017-1-6 14:02:10 | 显示全部楼层
我用SHT10检测温湿度、MQ-2检测烟雾,GPS定位,GSM发送短信。现在我主要加了3个按键进去,就是测试各个模块功能,能不能实现。但是在测试过程中,发现有时按键按下去没有反应,我分析主要原因是:循环中处理模块信息时间太长,导致有时候按键检测到,但是主循环还在处理其他事情。就导致这次的按键失效,就是丢键。不知道有没有大神,能给个思路,怎么及时处理按键响应。才学STM32 的2个月,如果觉得问题问的有点傻,莫怪!!!
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-1-6 14:22:34 | 显示全部楼层
本帖最后由 东北小辉辉 于 2017-1-6 14:25 编辑
菜鸟2770 发表于 2017-1-6 14:02
我用SHT10检测温湿度、MQ-2检测烟雾,GPS定位,GSM发送短信。现在我主要加了3个按键进去,就是测试各个模块 ...

这实际上是一个多任务并行的问题,裸机的话,要采用状态机的思想,切碎大状态,每个状态要尽量占用很小的时间,不能出现阻塞,设计的难度还是很大的,实在不行,可以套ucos。

问题不应该在加按键的时候出现啊,应该早就出现了。如果你每个任务都是阻塞的,比如在GSM发送短信的过程中,是如何用SHT10检测出温湿度的呢?
楼主不要感觉这是一个简单的问题,这个问题应该是单片机裸奔的核心所在了,就是多任务的程序设计,我现在也是在初学阶段。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-1-6 14:27:40 | 显示全部楼层
如果没学过ucos的话,建议楼主去百度一下“小小调度器”,我们论坛也有网友实现。纯状态机开发的难度比较大,用这个“小小调度器”的话,可以用看似阻塞的编程方法实现非阻塞编程。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
发表于 2017-1-6 14:34:04 | 显示全部楼层
帮顶,学习~
亦余心之所善,
虽九死其犹未悔。
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7539
金钱
7539
注册时间
2016-11-30
在线时间
641 小时
发表于 2017-1-6 14:37:48 | 显示全部楼层
用按键产生中断,在中断中切换主循环状态!如果实时性要求不高应该可以了!
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-1-6
在线时间
7 小时
 楼主| 发表于 2017-1-6 14:41:10 | 显示全部楼层
东北小辉辉 发表于 2017-1-6 14:22
这实际上是一个多任务并行的问题,裸机的话,要采用状态机的思想,切碎大状态,每个状态要尽量占用很小的 ...

看来还是学的太少,一直裸奔到现在,要去看看UCOS了,谢谢指教
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-1-6
在线时间
7 小时
 楼主| 发表于 2017-1-6 14:43:06 | 显示全部楼层
东北小辉辉 发表于 2017-1-6 14:27
如果没学过ucos的话,建议楼主去百度一下“小小调度器”,我们论坛也有网友实现。纯状态机开发的难度比较大 ...

谢谢了!去看一下“小小调度器”
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
发表于 2017-1-6 14:59:32 | 显示全部楼层
裸机跑也可以,用中断触发标志位,最后在主程序里查标志位去处理。
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-1-6
在线时间
7 小时
 楼主| 发表于 2017-1-6 15:08:19 | 显示全部楼层
xuyan021 发表于 2017-1-6 14:59
裸机跑也可以,用中断触发标志位,最后在主程序里查标志位去处理。

用外部中断么,然后中断处理信息。。。
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-1-6 15:15:55 | 显示全部楼层
菜鸟2770 发表于 2017-1-6 15:08
用外部中断么,然后中断处理信息。。。

没那么简单,我举个例子,假设这个按键用外部中断来做。

这个按键是要消抖的把,算这个抖动是10ms,这10ms是用delay死等的方式来做的。

那如果现在单片机正在进行GPS定位,定位到一半,好,按键的外部中断来了,死等了10ms,按键是被识别到了,但是本次的GPS定位的时序就乱了,因为多出了10ms,那本次GPS定位就失败了。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
发表于 2017-1-7 17:08:22 | 显示全部楼层
10ms可以用定时器去。我一般方法是用一个基准定时器定一个时间,用一个变量去控制延时的时间。这样就可以最大限度解放控制器的工作了。
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2017-1-7 17:26:34 | 显示全部楼层
1.程序不能出现 delay 死等的延时  
2.程序要加入超时判断
3.要设置优先级别
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 06:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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