-
-
Notifications
You must be signed in to change notification settings - Fork 732
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update attachInterrupt.adoc #842
base: master
Are you sure you want to change the base?
Conversation
Race hazards should be mentioned on this page. Nick Gammon's notes are misleading regarding single byte variables and I can't find any way to contact him easily.
@@ -55,6 +55,40 @@ Generally, an ISR should be as short and fast as possible. If your sketch uses m | |||
|
|||
Typically global variables are used to pass data between an ISR and the main program. To make sure variables shared between an ISR and the main program are updated correctly, declare them as `volatile`. | |||
|
|||
Races, code which changes behaviour depending upon timing, can be a problem if both normal code and interrupt code tries to access variables at the same time. This leads to highly intermittent and hard to find bugs. The simplest solution is to disable interrupts when accessing shared variables from non-interrupt code. Interrupts are disabled by default in interrupt functions so unless interrupts are turned on there is no problem there. See `noInterrupts()` and `interrupts()`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Races, code which changes behaviour depending upon timing, can be a problem if both normal code and interrupt code tries to access variables at the same time. This leads to highly intermittent and hard to find bugs. The simplest solution is to disable interrupts when accessing shared variables from non-interrupt code. Interrupts are disabled by default in interrupt functions so unless interrupts are turned on there is no problem there. See `noInterrupts()` and `interrupts()`. | |
Races, code which changes behaviour depending upon timing, can be a problem if both normal code and interrupt code tries to access variables at the same time. This leads to highly intermittent and hard to find bugs. The simplest solution is to disable interrupts when accessing shared variables from non-interrupt code. Interrupts are disabled by default in interrupt functions so unless interrupts are turned on there is no problem there. See `link:../../interrupts/nointerrupts[noInterrupts()]` and `link:../../interrupts/interrupts[interrupts()]`. |
Provide links to the reference pages the reader is being instructed to see.
@@ -55,6 +55,40 @@ Generally, an ISR should be as short and fast as possible. If your sketch uses m | |||
|
|||
Typically global variables are used to pass data between an ISR and the main program. To make sure variables shared between an ISR and the main program are updated correctly, declare them as `volatile`. | |||
|
|||
Races, code which changes behaviour depending upon timing, can be a problem if both normal code and interrupt code tries to access variables at the same time. This leads to highly intermittent and hard to find bugs. The simplest solution is to disable interrupts when accessing shared variables from non-interrupt code. Interrupts are disabled by default in interrupt functions so unless interrupts are turned on there is no problem there. See `noInterrupts()` and `interrupts()`. | |||
|
|||
Consider a common technique for interupts. The interrupt routine sets a flag which is acted on by code in the main loop. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider a common technique for interupts. The interrupt routine sets a flag which is acted on by code in the main loop. | |
Consider a common technique for interrupts. The interrupt routine sets a flag which is acted on by code in the main loop. |
} | ||
} | ||
---- | ||
If the interrupt occurs between testing the flag in line A and the clearing of the flag in line B then the flag will set by the interrupt and immediately cleared by the non-interrupt code resulting in the interrupt being ignored. The solution is to prevent the interrupt from interrupting at that critical point. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If the interrupt occurs between testing the flag in line A and the clearing of the flag in line B then the flag will set by the interrupt and immediately cleared by the non-interrupt code resulting in the interrupt being ignored. The solution is to prevent the interrupt from interrupting at that critical point. | |
If the interrupt occurs between testing the flag in line A and the clearing of the flag in line B then the flag will set by the interrupt and be immediately cleared by the non-interrupt code resulting in the interrupt being ignored. The solution is to prevent the interrupt from interrupting at that critical point. |
Race hazards should be mentioned on this page. Nick Gammon's notes are misleading regarding single byte variables and I can't find any way to contact him easily.