... that do not work properly in Arduino interrupt service routines ...
A much safer approach would be to ask what does work properly in an ISR. Considering that my advice was to "keep it short" that would tend to exclude calling any functions except ones which are known to be OK. For example, calling millis()
or micros()
to find out the current timer values would be OK (bearing in mind that the figures returned by millis()
will not increment).
Anything complex enough to be placed in a library would tend to be excluded simply based on that, in my opinion, unless specifically documented otherwise.
So, I wouldn't try to write files, do serial output, do I2C output, drive motors, etc.
Really, what an ISR should be doing is one or more of:
- Setting a flag (eg. "key has been pressed")
- Note the time (eg. "Pulse received at this moment")
- Retrieve some value (eg. what number is in a timer register)
Then the main code, not in an ISR, does something lengthier with that data.
The other thing to be concerned about is: Is a function re-entrant?
Just as an example, if you are doing strcpy
in an ISR, is the strcpy
function coded to be re-entered? (I don't know the answer just now). If it is not re-entrant, and you happen to be doing a strcpy
in the main code, and the ISR also does a strcpy
then one of them will be corrupted.
In terms of getting a comprehensive list, that would be almost impossible. Some libraries are no longer maintained. Others might be maintained but change from one month to the next, and the change might affect how they work inside an ISR. This is like the question people ask about "which libraries use which timers or pins?". These questions are difficult or impossible to adequately answer.