-
Notifications
You must be signed in to change notification settings - Fork 3k
Description
Description of defect
Some time ago I updated mbed-os to 6.11 and suddenly faced performance issue.
CPU load has become very high, min 95% though it had never been above 45-50% before. After some profiling and digging in the sources I found the cause of this in the I2C driver. I use two physical buses with several devices on each, so it seems appropriate to me to have one I2C class instance per bus. However, I2C class has static members _owner
and _mutex
(lines 237-239 of I2C.h):
static I2C *_owner;
int _hz;
static SingletonPtr<PlatformMutex> _mutex;
So, both of them are shared between all instances in the program and every call of I2C::read
or I2C::write
from another I2C instance completely reconfigures it via calling I2C::acquire
. For obvious reasons this behavior seems completely wrong and in my case after some time I2C::set_frequency
starts to eat up all available CPU time, because of deadlock or some improperly configured periphery.
I simply made _owner
and _mutex
non-static and issue was gone, though in that case I2C::acquire
and _owner
also seems useless.
I suggest that _owner
and _mutex
should be non-static for obvious reasons and some consistency with behavior of SPI class where both of them are non-static.
Target(s) affected by this defect ?
probably all, tested on STM32H743
Toolchain(s) (name and version) displaying this defect ?
gcc version 10.2.1 20201103 (release)
What version of Mbed-os are you using (tag or sha) ?
mbed-os-6.11.0
What version(s) of tools are you using. List all that apply (E.g. mbed-cli)
mbed-cli 1.10.5
How is this defect reproduced ?
- Initialize I2C instances for each of two (or more) separate physical buses.
- Connect a device to each bus.
- Try to write/read something to/from each device.