docs/reference/isr_rules: Describe issue with hard ISRs and globals.
Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
parent
b79ceeca8f
commit
624bd48d2f
1 changed files with 11 additions and 5 deletions
|
|
@ -170,11 +170,17 @@ is partially updated. When the ISR tries to read the object, a crash results. Be
|
||||||
on rare, random occasions they can be hard to diagnose. There are ways to circumvent this issue, described in
|
on rare, random occasions they can be hard to diagnose. There are ways to circumvent this issue, described in
|
||||||
:ref:`Critical Sections <Critical>` below.
|
:ref:`Critical Sections <Critical>` below.
|
||||||
|
|
||||||
It is important to be clear about what constitutes the modification of an object. An alteration to a built-in type
|
It is important to be clear about what constitutes the modification of an object. Altering the contents of an array
|
||||||
such as a dictionary is problematic. Altering the contents of an array or bytearray is not. This is because bytes
|
or bytearray is safe. This is because bytes or words are written as a single machine code instruction which is not
|
||||||
or words are written as a single machine code instruction which is not interruptible: in the parlance of real time
|
interruptible: in the parlance of real time programming the write is atomic. The same is true of updating a
|
||||||
programming the write is atomic. A user defined object might instantiate an integer, array or bytearray. It is valid
|
dictionary item because items are machine words, being integers or pointers to objects. A user defined object might
|
||||||
for both the main loop and the ISR to alter the contents of these.
|
instantiate an array or bytearray. It is valid for both the main loop and the ISR to alter the contents of these.
|
||||||
|
|
||||||
|
The hazard arises when the structure of an object is altered, notably in the case of dictionaries. Adding or deleting
|
||||||
|
keys can trigger a rehash. If a hard ISR runs while a rehash is in progress and attempts to access an item, a crash
|
||||||
|
may occur. Internally globals are implemented as a dictionary. Consequently the main program should create all
|
||||||
|
necessary globals before starting a process that generates hard interrupts. Application code should also avoid
|
||||||
|
deleting globals.
|
||||||
|
|
||||||
MicroPython supports integers of arbitrary precision. Values between 2**30 -1 and -2**30 will be stored in
|
MicroPython supports integers of arbitrary precision. Values between 2**30 -1 and -2**30 will be stored in
|
||||||
a single machine word. Larger values are stored as Python objects. Consequently changes to long integers cannot
|
a single machine word. Larger values are stored as Python objects. Consequently changes to long integers cannot
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue