Computer systems perform wide-ranging tasks in today's world, to say the least. In performing many of these tasks, computers are called upon to determine the condition of and control external devices. These external devices may be of many different types, including sensors, clocks, actuators, disk drives and motors to name just a few.
A computer typically interacts with external devices by executing a software program that calls for the computer to generate signals that control certain of the devices based on the condition of other of the devices. For example, a computer may adjust the speed of a motor based on the temperature of a fluid that the motor is stirring and the length of time that the motor has been stirring the fluid.
When computers began to be called upon to sense and control external devices, a method called “polling” was developed. Polling calls for the computer actively to query the external devices to determine their condition, usually periodically. In the example above, the computer may poll a thermometer and a clock once a second to determine the fluid temperature and time. While effective for simple tasks involving a relatively small number of devices, polling came to consume ever-greater amounts of the computer's time as the tasks and the numbers of devices became more complex. Polling is inefficient, because the computer must poll even when no conditions requiring the computer's response have occurred. At its extreme, polling may even consume so much time that the computer is precluded from performing other tasks.
To overcome the disadvantages inherent in polling, “interrupts” were developed. With interrupts, the computer does not actively determine the condition of external devices. Instead, changes in device condition (“events”) cause signals (“interrupts”) to be delivered to the computer, often by way of an “interrupt register,” or “alarm register,” that contains status information regarding its corresponding external device. The computer is free to execute its software program until it receives an interrupt, at which time it usually departs from its program and responds to, or “handles,” the interrupt, often based on the contents of one or more interrupt registers.
Interrupts are widely used today, but they are by no means a perfect solution. Interrupt handling becomes complex when a computer is called upon to sense and control a great number of external devices. It becomes more complex when combinations of events trigger different responses by the computer. It becomes still more complex when the events and combinations change depending upon the software instructions that the computer is executing when the events or combinations occur. Combinations of interrupt conditions have become so complex that they are now often organized into a “hierarchical register consolidation structure” to ease their management.
Overlying all of the potential complexity described above is that a given software program may have to function on many computers in many different environments, each with its own combination of external devices and distinctive register consolidation structure. This variability requires each software program to be configured to each environment, making software development and installation more complex, time-consuming, expensive and error-prone. Accordingly, what is needed in the art is a better way to manage interrupts, particularly in a complex, hierarchical environment.