我很好奇在微控制器中如何以不阻止所有其他工作的方式处理用户输入。
例如,我有一个现代化的燃气锅炉-Vaillant,锅炉正在运行自己的任务,而我可以在用户菜单中滚动,按按钮等。
从概念的角度来看这是如何解决的?
是否有另一个微控制器处理用户输入,然后将选定的输入推送到主控制器?
还是主控制器中只有某种类型的调度程序,调度速度如此之快,以至于它可以处理用户输入和后台任务?
通常如何处理,以便用户可以在不妨碍主要任务的情况下浏览菜单等。
谢谢
答案 0 :(得分:1)
这可以用许多不同的方式来处理,并且取决于整个应用程序的复杂性,它可以像超级循环一样简单,也可以像基于多任务的应用程序一样复杂,其中有几个独立的任务各自完成各自的工作(例如,一个执行按键检测,另一个处理串行通讯,另一个更新[G] LCD等)。
您的特定示例可以通过超级循环方法轻松处理,尽管也可以将多任务程序用于(IMO)简化编码。
例如,使用超级循环方法,每次通过循环调用一次按键检测例程,该例程检查按键是否被按下,并且只要仍然存在按键,计数时间就可以达到最大最大值。它不会阻止,它会立即退出。当计数达到接受密钥的最小值(例如,对应于大约50-100毫秒)时,您将按下的键返回,并将计数器归零(用于自动重复键),或者将密钥保存在临时缓冲区中并仅在以下情况下返回键:最终将释放该键(如果不需要重复自动键)。
显示器的工作方式类似。根据设备所处的状态来更新当前屏幕。例如,检测到UP / DOWN键时,滚动项目的索引会向上或向下变化,并以新的状态重新绘制屏幕。
在某些情况下,如果您不希望您的应用成为无法反驳的标志和ifs,那么多任务处理程序是解决此类问题的唯一合理方法。这样的例子之一就是同时(流畅)处理多个接口(例如GPS,GSM,用户终端,按键/ LCD)。
顺便说一句,按键中断是IMO的一个过大杀伤力,除非您处于某种省电的睡眠模式并且需要一种硬件方式来唤醒。与CPU速度相比,人为按下按键总是太慢,并且可以通过简单的轮询来可靠地检测到。
答案 1 :(得分:0)