The above sequence assumes that the ISR signals or sends a message to a task. However, in many cases, the ISR may not need to notify a task and can simply perform all of its work within the ISR (assuming it can be done quickly). In this case, the ISR will appear as shown in Listing 9-2.L9-2(1) As
Anchor | ||||
---|---|---|---|---|
|
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
MyShortISR: (1)
Save enough registers as needed by the ISR; (2)
Clear interrupting device; (3)
DO NOT re-enable interrupts; (4)
Call user ISR; (5)
Restore the saved CPU registers; (6)
Return from interrupt; (7) |
Panel | ||
---|---|---|
| ||
(1) As mentioned above, an ISR is typically written in assembly language. |
...
MyShortISR corresponds to the name of the handler that will handle the interrupting device. |
...
(2) |
...
Here, you save sufficient registers as required to handle the ISR. |
...
(3) |
...
The user probably needs to clear the interrupting device to prevent it from generating the same interrupt once the ISR returns. |
...
(4) |
...
Do not re-enable interrupts at this point since another interrupt could make µC/OS-III calls, forcing a context switch to a higher-priority task. This means that the above ISR would complete, but at a much later time and, possible cause other complications. |
...
(5) |
...
Now you can take care of the interrupting device in assembly language or call a C function, if necessary. |
...
(6) |
...
Once finished, simply restore the saved CPU registers. |
...
(7) |
...
Perform a return from interrupt to resume the interrupted task. |