Would a mutex of some sort around each I2C transaction (i.e. complete
A2D reading) be a better way to go?
I have a Raspberry Pi in my boat that uses I2C to read a number of
voltages and currents (using ADS1115 A2D) so I can monitor the battery condition etc.
At present various different scripts (i.e. processes) just read the
values using the I2C bus whenever they need to but I'm pretty sure
this (quite rarely) results in false readings because two processes
try to read at the same time.
Thus I'm looking for ways to prevent simultaneous access.
One fairly obvious way is to have single process/script which reads
the A2D values continuously and writes them to a file. All other
scripts then read from the file as needed, a simple file lock can then
be used to prevent simultaneous access (well, simultaneous access when
the writing process is writing).
Is this the simplest approach? Are there better ways using
multiprocess? (They look more complicated though).
The I2C bus itself has a mutex but I don't think this guarantees that
(for example) an A2D reading is atomic because one reading takes more
than one I2C bus access.
Would a mutex of some sort around each I2C transaction (i.e. complete
A2D reading) be a better way to go?
On 7 Jul 2024, at 22:13, Chris Green via Python-list <python-list@python.o=
wrote:
=20
a simple file lock can then
be used to prevent simultaneous access (well, simultaneous access when
the writing process is writing).
On 7 Jul 2024, at 22:13, Chris Green via Python-list <python-list@python.org> wrote:
a simple file lock can then
be used to prevent simultaneous access (well, simultaneous access when
the writing process is writing).
There is a simple pattern to make this robust.
Write new values to a tmp file.
Close the tmp file.
Then use os.rename(tmpfile, productionfile).
This is guaranteed that any process that reads the file will only see all the old file contents or all the new file contents, never a mix of both.
On 7 Jul 2024, at 23:47, MRAB via Python-list <python-list@python.org> =wrote:
=20Windows os.rename it would complain if the target file already exists, =
For clarity I'd recommend os.replace instead. This is because on =
I have a Raspberry Pi in my boat that uses I2C to read a number of
voltages and currents (using ADS1115 A2D) so I can monitor the battery condition etc.
At present various different scripts (i.e. processes) just read the
values using the I2C bus whenever they need to but I'm pretty sure
this (quite rarely) results in false readings because two processes
try to read at the same time.
Thus I'm looking for ways to prevent simultaneous access.
One fairly obvious way is to have single process/script which reads
the A2D values continuously and writes them to a file. All other
scripts then read from the file as needed, a simple file lock can then
be used to prevent simultaneous access (well, simultaneous access when
the writing process is writing).
Is this the simplest approach? Are there better ways using
multiprocess? (They look more complicated though).
The I2C bus itself has a mutex but I don't think this guarantees that
(for example) an A2D reading is atomic because one reading takes more
than one I2C bus access.
Would a mutex of some sort around each I2C transaction (i.e. complete
A2D reading) be a better way to go?
--
Chris Green
=C2=B7
--
https://mail.python.org/mailman/listinfo/python-list
On 06/07/2024 09.28, Chris Green wrote:
I have a Raspberry Pi in my boat that uses I2C to read a number of
voltages and currents (using ADS1115 A2D) so I can monitor the battery condition etc.
At present various different scripts (i.e. processes) just read the
values using the I2C bus whenever they need to but I'm pretty sure
this (quite rarely) results in false readings because two processes
try to read at the same time.
Thus I'm looking for ways to prevent simultaneous access.
Why using "different scripts"?
Is it there any particular reason?
Maybe it would be better, if possible, to have
a single script, which, sequentially, reads
whatever needs to be read (or written).
In a loop.
This is even simpler than using a file.
Sysop: | Tetrazocine |
---|---|
Location: | Melbourne, VIC, Australia |
Users: | 4 |
Nodes: | 8 (0 / 8) |
Uptime: | 215:12:31 |
Calls: | 73 |
Calls today: | 1 |
Files: | 21,500 |
Messages: | 73,913 |