Skip to content

Commit

Permalink
ave elapsed time before handling I2C in stm32_i2c_sem_waitdone()
Browse files Browse the repository at this point in the history
It is possible that a context switch occurs after stm32_i2c_isr() call
but before elapsed time is saved in stm32_i2c_sem_waitdone(). It is then
possible that the handling code was executed only once with "elapsed
time" equal 0. When scheduler resumes this thread it is quite possible
that now "elapsed time" will be well above timeout threshold. In that
case the function returns and reports a timeout, even though the
handling code was not executed "recently".

Fix this by inverting the order of operations in the loop - save elapsed
time before handling I2C. This way a context switch anywhere in the loop
will not cause an erroneous "timeout" error.
  • Loading branch information
FreddieChopin authored and gregory-nutt committed Mar 9, 2017
1 parent 92858d1 commit 5a6d95d
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions arch/arm/src/stm32/stm32_i2c_alt.c
Original file line number Diff line number Diff line change
Expand Up @@ -678,15 +678,15 @@ static int stm32_i2c_sem_waitdone(FAR struct stm32_i2c_priv_s *priv)

do
{
/* Calculate the elapsed time */

elapsed = clock_systimer() - start;

/* Poll by simply calling the timer interrupt handler until it
* reports that it is done.
*/

stm32_i2c_isr(priv);

/* Calculate the elapsed time */

elapsed = clock_systimer() - start;
}

/* Loop until the transfer is complete. */
Expand Down

0 comments on commit 5a6d95d

Please sign in to comment.