Electronic – Things to do with ISR

firmwareinterrupts

I have an ISR that increments a counter every 5ms if the switch is pressed.

If the counter becomes 200 then do Reset. I plan to add more functions to be called from the counter value.

After a few encounters with ISRs, I have got the expert advice from this site to keep ISR short.

Then how should I keep the ISR properly or near to perfection.

Is it about keeping flags?

I trust calling ISR that do long routines is a bad architecture. But then how can I call long routines from the value of flags in ISR if it is kept in another source files other than main.c?

Best Answer

Allowing access to variables between source files is done using the extern keyword, for example in header file declaring a variable. If it's all in one file you can use a global variable.

When you want an ISR to be able to change the variable (such as a flag) and have another routine recognize the change (perhaps by polling the flags periodically between doing other stuff), it's best to use the volatile keyword, which prevents the variable from being optimized out of the code (since otherwise the compiler does not see how it could change).

See: https://stackoverflow.com/questions/1433204/how-do-i-share-a-variable-between-source-files-in-c-with-extern-but-how for more info on extern

And: http://www.barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword for more info on volatile