编程中的调度概念——用户输入
Scheduling concept in programming - user input
我很好奇用户输入是如何在微控制器中以不阻止所有其他工作的方式处理的。
例如,我有现代燃气锅炉 - Vaillant,锅炉是 运行 他自己的任务,而我可以在用户菜单中滚动,按按钮等等。
这是如何从概念的角度解决的?
是否有另一个微控制器处理用户输入,然后将选定的输入推送到主控制器?
或者主控制器中只有某种类型的调度器,它调度得如此之快,以至于它可以处理用户输入和后台任务?
这通常是如何处理的,以便用户可以在不阻塞主要任务的情况下使用菜单等。
谢谢
大多数 CPU 都有某种形式的中断(甚至 PC)。
基本上中断告诉CPU停止它正在做的事情并处理一些实时事件。当中断处理程序完成时,CPU 将恢复其原始程序。
有关中断的更多详细信息,请访问 wikipedia
这可以通过许多不同的方式处理,并且根据整个应用程序的复杂性,它可以像超级循环一样简单,也可以像基于多任务的应用程序一样复杂,每个任务都有几个独立的任务自己的事情(例如,一个做按键检测,另一个处理串行通信,另一个更新 [G]LCD,等等)。
您的特定示例可以使用超级循环方法轻松处理,尽管也可以使用多任务程序来简化 (IMO) 编码。
例如,使用超级循环方法,每次通过循环调用按键检测例程,该例程检查按键是否被按下,并在按键仍然存在时计算时间直到某个最大值.它不会阻塞,它会立即退出。当计数达到接受键的最小值时(例如,对应于大约 50-100 毫秒),您 return 按下键并将计数器归零(用于自动键重复),或者将键保存在临时缓冲区中,然后return 仅当按键最终被释放时(如果不需要自动按键重复)。
显示以类似的方式工作。当前屏幕根据设备所处的状态进行更新。当检测到 UP/DOWN 键(例如)时,滚动项目的索引会向上或向下更改,并且屏幕会重新绘制为新状态。
在某些情况下,如果您不希望您的应用程序变成一堆无法调试的标志和 ifs,则多任务处理程序是解决此类问题的唯一合理方法。同时(顺利)处理多个接口(例如,GPS、GSM、用户终端,key/LCD)就是这样的一个例子。
顺便说一句,按键中断在我看来是一种矫枉过正,除非您处于某种节电睡眠模式并且需要一种硬件方式来唤醒。与 CPU 速度相比,人类按键总是太慢,可以通过简单的轮询可靠地检测到。
我很好奇用户输入是如何在微控制器中以不阻止所有其他工作的方式处理的。
例如,我有现代燃气锅炉 - Vaillant,锅炉是 运行 他自己的任务,而我可以在用户菜单中滚动,按按钮等等。
这是如何从概念的角度解决的?
是否有另一个微控制器处理用户输入,然后将选定的输入推送到主控制器?
或者主控制器中只有某种类型的调度器,它调度得如此之快,以至于它可以处理用户输入和后台任务?
这通常是如何处理的,以便用户可以在不阻塞主要任务的情况下使用菜单等。
谢谢
大多数 CPU 都有某种形式的中断(甚至 PC)。
基本上中断告诉CPU停止它正在做的事情并处理一些实时事件。当中断处理程序完成时,CPU 将恢复其原始程序。
有关中断的更多详细信息,请访问 wikipedia
这可以通过许多不同的方式处理,并且根据整个应用程序的复杂性,它可以像超级循环一样简单,也可以像基于多任务的应用程序一样复杂,每个任务都有几个独立的任务自己的事情(例如,一个做按键检测,另一个处理串行通信,另一个更新 [G]LCD,等等)。
您的特定示例可以使用超级循环方法轻松处理,尽管也可以使用多任务程序来简化 (IMO) 编码。
例如,使用超级循环方法,每次通过循环调用按键检测例程,该例程检查按键是否被按下,并在按键仍然存在时计算时间直到某个最大值.它不会阻塞,它会立即退出。当计数达到接受键的最小值时(例如,对应于大约 50-100 毫秒),您 return 按下键并将计数器归零(用于自动键重复),或者将键保存在临时缓冲区中,然后return 仅当按键最终被释放时(如果不需要自动按键重复)。
显示以类似的方式工作。当前屏幕根据设备所处的状态进行更新。当检测到 UP/DOWN 键(例如)时,滚动项目的索引会向上或向下更改,并且屏幕会重新绘制为新状态。
在某些情况下,如果您不希望您的应用程序变成一堆无法调试的标志和 ifs,则多任务处理程序是解决此类问题的唯一合理方法。同时(顺利)处理多个接口(例如,GPS、GSM、用户终端,key/LCD)就是这样的一个例子。
顺便说一句,按键中断在我看来是一种矫枉过正,除非您处于某种节电睡眠模式并且需要一种硬件方式来唤醒。与 CPU 速度相比,人类按键总是太慢,可以通过简单的轮询可靠地检测到。