How does an interrupt service routine (ISR) differ from a standard function call? What are the restrictions on writing code inside an ISR?