Skip to content
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

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

MalcolmBoura
Copy link
Contributor

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.

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.
@CLAassistant
Copy link

CLAassistant commented Jul 27, 2021

CLA assistant check
All committers have signed the CLA.

@@ -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()`.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
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.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
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.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants